Bekannte Probleme und Einschränkungen bei YARA-L 2.0
In diesem Dokument werden die bekannten Probleme und Einschränkungen in YARA-L 2.0 beschrieben.Ergebnisaggregationen mit dem Aufheben der Verschachtelung von wiederkehrenden Feldern
Wenn in einer Regel auf ein wiederholtes Feld in einer Ereignisvariablen mit mehreren Elementen verwiesen wird, wird jedes Element in eine separate Ereigniszeile aufgeteilt.
Die beiden IP-Adressen im wiederkehrenden Feld target.ip für das Ereignis $e werden beispielsweise in zwei Instanzen von $e aufgeteilt, die jeweils einen anderen target.ip-Wert haben.
rule outbound_ip_per_app {
meta:
events:
$e.principal.application = $app
match:
$app over 10m
outcome:
$outbound_ip_count = count($e.target.ip) // yields 2.
condition:
$e
}
Ereignisdatensatz vor dem Entschachteln des wiederholten Felds
In der folgenden Tabelle sehen Sie den Ereignisdatensatz vor dem Aufheben der Verschachtelung des wiederholten Felds:
| metadata.id | principal.application | target.ip |
|---|---|---|
aaaaaaaaa |
Google SecOps |
[192.0.2.20, 192.0.2.28] |
Ereignisdatensätze nach dem Entschachteln des wiederholten Felds
In der folgenden Tabelle sehen Sie den Ereignisdatensatz nach dem Aufheben der Verschachtelung des wiederholten Felds:
| metadata.id | principal.application | target.ip |
|---|---|---|
aaaaaaaaa |
Google SecOps |
192.0.2.20 |
aaaaaaaaa |
Google SecOps |
192.0.2.28 |
Wenn in einer Regel auf ein wiederkehrendes Feld verwiesen wird, das in einem anderen Feld verschachtelt ist, z. B. security_results.action, wird die Verschachtelung sowohl auf der übergeordneten als auch auf der untergeordneten Ebene aufgehoben. Die resultierenden Instanzen aus dem Entschachteln eines einzelnen Ereignisses bilden ein kartesisches Produkt der Elemente in den übergeordneten und untergeordneten Feldern.
In der folgenden Beispielregel wird das Ereignis $e mit zwei wiederholten Werten für security_results und zwei wiederholten Werten für security_results.actions in vier Instanzen entnestet.
rule security_action_per_app {
meta:
events:
$e.principal.application = $app
match:
$app over 10m
outcome:
$security_action_count = count($e.security_results.actions) // yields 4.
condition:
$e
}
Ereignisdatensatz vor dem Entschachteln des wiederholten Felds
In der folgenden Tabelle sehen Sie den Ereignisdatensatz vor dem Aufheben der Verschachtelung des wiederholten Felds:
| metadata.id | principal.application | security_results |
|---|---|---|
aaaaaaaaa |
Google SecOps |
[ { actions: [ ALLOW, FAIL ] }, { actions: [ CHALLENGE, BLOCK ] } ] |
Ereignisdatensätze nach dem wiederholten Entnesten von Feldern
In der folgenden Tabelle sehen Sie den Ereignisdatensatz nach dem Aufheben der Verschachtelung des wiederholten Felds:
| metadata.id | principal.application | security_results.actions |
|---|---|---|
aaaaaaaaa |
Google SecOps |
ZULASSEN |
aaaaaaaaa |
Google SecOps |
NICHT BESTANDEN |
aaaaaaaaa |
Google SecOps |
CHALLENGE |
aaaaaaaaa |
Google SecOps |
BLOCKIEREN |
Dieses Verhalten beim Entschachteln bei der Regelauswertung kann zu unerwarteten Ergebnisaggregationen führen, wenn in der Regel auf ein oder mehrere wiederholte Felder mit einem übergeordneten Feld verwiesen wird, das ebenfalls ein wiederholtes Feld ist. Bei nicht eindeutigen Aggregationen wie sum(), array() und count() können doppelte Werte in anderen Feldern desselben Ereignisses, die durch das Unnesting-Verhalten erzeugt werden, nicht berücksichtigt werden. In der folgenden Beispielregel hat das Ereignis $e einen einzelnen Hostnamen google.com, das Ergebnis hostnames wird jedoch über vier nicht verschachtelte Instanzen desselben Ereignisses $e aggregiert, die jeweils einen doppelten principal.hostname-Wert haben. Das Ergebnis sind vier Hostnamen statt einem, da die wiederholten Werte für security_results.actions entnestet werden.
rule security_action_per_app {
meta:
events:
$e.principal.application = $app
match:
$app over 10m
outcome:
$hostnames = array($e.principal.hostname) // yields 4.
$security_action_count = count($e.security_results.action) // yields 4.
condition:
$e
}
Ereignisdatensatz vor dem Entschachteln des wiederholten Felds
In der folgenden Tabelle sehen Sie den Ereignisdatensatz vor dem Aufheben der Verschachtelung des wiederholten Felds:
| metadata.id | principal.application | principal.hostname | security_results |
|---|---|---|---|
aaaaaaaaa |
Google SecOps |
google.com |
[ { action: [ ALLOW, FAIL ] }, { action: [ CHALLENGE, BLOCK ] } ] |
Datensatz nach dem Entschachteln eines wiederkehrenden Felds
In der folgenden Tabelle sehen Sie den Ereignisdatensatz nach dem Aufheben der Verschachtelung des wiederholten Felds:
| metadata.id | principal.application | principal.hostname | security_results.action |
|---|---|---|---|
aaaaaaaaa |
Google SecOps |
google.com |
ZULASSEN |
aaaaaaaaa |
Google SecOps |
google.com |
NICHT BESTANDEN |
aaaaaaaaa |
Google SecOps |
google.com |
CHALLENGE |
aaaaaaaaa |
Google SecOps |
google.com |
BLOCKIEREN |
Problemumgehung
Aggregationen, bei denen doppelte Werte ignoriert oder entfernt werden, sind von diesem Verhalten nicht betroffen. Verwenden Sie die eindeutige Version einer Aggregation, wenn aufgrund des Aufhebens der Verschachtelung unerwartete Ergebniswerte auftreten.
Die folgenden Aggregationen sind nicht vom oben beschriebenen Unnesting-Verhalten betroffen.
max()min()array_distinct()count_distinct()
Ergebnisaggregationen mit mehreren Ereignisvariablen
Wenn eine Regel mehrere Ereignisvariablen enthält, gibt es in der Aggregation für jede Kombination von Ereignissen, die in der Erkennung enthalten ist, einen separaten Eintrag. Wenn die folgende Beispielregel beispielsweise für die aufgeführten Ereignisse ausgeführt wird:
events:
$e1.field = $e2.field
$e2.somefield = $ph
match:
$ph over 1h
outcome:
$some_outcome = sum(if($e1.otherfield = "value", 1, 0))
condition:
$e1 and $e2
event1:
// UDM event 1
field="a"
somefield="d"
event2:
// UDM event 2
field="b"
somefield="d"
event3:
// UDM event 3
field="c"
somefield="d"
Die Summe wird für jede Kombination von Ereignissen berechnet. So können Sie beide Ereignisvariablen in den Berechnungen des Ergebniswerts verwenden. Die folgenden Elemente werden bei der Berechnung verwendet:
1: $e1 = event1, $e2 = event2
2: $e1 = event1, $e2 = event3
3: $e1 = event2, $e2 = event1
4: $e1 = event2, $e2 = event3
5: $e1 = event3, $e2 = event1
5: $e1 = event3, $e2 = event2
Das führt zu einer potenziellen maximalen Summe von 6, obwohl $e2 nur drei verschiedenen Ereignissen entsprechen kann.
Das wirkt sich auf Summe, Anzahl und Array aus. Bei „count“ und „array“ kann das Problem mit count_distinct oder array_distinct behoben werden. Für „sum“ gibt es jedoch keine Problemumgehung.
Klammern am Anfang eines Ausdrucks
Wenn Sie am Anfang eines Ausdrucks Klammern verwenden, wird der folgende Fehler ausgelöst:
parsing: error with token: ")"
invalid operator in events predicate
Das folgende Beispiel würde diesen Fehlertyp generieren:
($event.metadata.ingested_timestamp.seconds -
$event.metadata.event_timestamp.seconds) / 3600 > 1
Die folgenden Syntaxvarianten geben dasselbe Ergebnis zurück, aber mit gültiger Syntax:
$event.metadata.ingested_timestamp.seconds / 3600 -
$event.metadata.event_timestamp.seconds / 3600 > 1
1 / 3600 * ($event.metadata.ingested_timestamp.seconds -
$event.metadata.event_timestamp.seconds) > 1
1 < ($event.metadata.ingested_timestamp.seconds -
$event.metadata.event_timestamp.seconds) / 3600
Für einzelne Werte im wiederholten Feld ist eine Aggregation des Index-Arrays im Ergebnis erforderlich
Für die Array-Indexierung im Ergebnisbereich ist weiterhin eine Aggregation erforderlich. Das folgende Beispiel funktioniert beispielsweise nicht:
outcome:
$principal_user_dept = $suspicious.principal.user.department[0]
Sie können die Ausgabe des Array-Index jedoch in einer Platzhaltervariablen speichern und diese Variable im Ergebnisabschnitt verwenden, wie hier gezeigt:
events:
$principal_user_dept = $suspicious.principal.user.department[0]
outcome:
$principal_user_department = $principal_user_dept
OR-Bedingung mit Nichtvorhandensein
Wenn eine ODER-Bedingung zwischen zwei separaten Ereignisvariablen angewendet wird und die Regel auf Nichtvorhandensein abgestimmt ist, wird die Regel zwar erfolgreich kompiliert, kann aber Falsch-Positiv-Ergebnisse liefern. Die folgende Regelsyntax kann beispielsweise mit Ereignissen mit $event_a.field = "something" übereinstimmen, obwohl das nicht der Fall sein sollte.
events:
not ($event_a.field = "something" **or** $event_b.field = "something")
condition:
$event_a and #event_b >= 0
Die Problemumgehung besteht darin, die Bedingungen in zwei Blöcke aufzuteilen, wobei in jedem Block der Filter nur auf eine einzelne Variable angewendet wird, wie hier gezeigt:
events:
not ($event_a.field = "something")
not ($event_b.field = "something")
condition:
$event_a and #event_b >= 0
Arithmetik mit nicht signierten Ereignisfeldern
Wenn Sie versuchen, eine Ganzzahlkonstante in einer arithmetischen Operation mit einem UDM-Feld zu verwenden, dessen Typ eine vorzeichenlose Ganzzahl ist, erhalten Sie eine Fehlermeldung. Beispiel:
events:
$total_bytes = $e.network.received_bytes * 2
Das Feld udm.network.received_bytes ist eine vorzeichenlose Ganzzahl. Das liegt daran, dass Ganzzahlkonstanten standardmäßig vorzeichenbehaftete Ganzzahlen sind, die bei arithmetischen Operationen nicht mit vorzeichenlosen Ganzzahlen funktionieren.
Die Problemumgehung besteht darin, die Ganzzahlkonstante in eine Gleitkommazahl umzuwandeln, die dann mit der vorzeichenlosen Ganzzahl funktioniert. Beispiel:
events:
$total_bytes = $e.network.received_bytes * (2/1)
Eventual Consistency und falsch positive Ergebnisse bei der GeoIP-Anreicherung
In den ersten Phasen der Anreicherung (Streaming und latenzempfindlich) wird Geschwindigkeit gegenüber sofortiger Genauigkeit priorisiert. Das kann zu fehlenden Daten und potenziellen Falschmeldungen führen. Die Daten werden weiterhin im Hintergrund angereichert, sind aber möglicherweise nicht verfügbar, wenn die Regel ausgeführt wird. Das ist Teil des normalen Prozesses der eventuellen Konsistenz. Um diese Art von falsch positiven Ergebnissen zu vermeiden, sollten Sie sich nicht darauf verlassen, dass angereicherte Felder in Ereignissen vorhanden sind, um Erkennungen auszulösen.
Sehen wir uns beispielsweise dieses Regelereignis an:
$e.principal.ip_geo_artifact.network.asn = "16509" AND
$e.principal.ip_geo_artifact.location.country_or_region = "United Kingdom"
Die Regel basiert darauf, dass das Ereignis $e.principal.ip_geo_artifact.network.asn = "16509" UND $e.principal.ip_geo_artifact.location.country_or_region = "United Kingdom" enthalten muss. Beide sind angereicherte Felder. Wenn die Anreicherung nicht rechtzeitig abgeschlossen wird, wird durch die Regel ein Fehlalarm ausgelöst.
Um dies zu vermeiden, sollte die Regel so formuliert werden:
$e.principal.ip_geo_artifact.network.asn != "" AND
$e.principal.ip_geo_artifact.network.asn = "16509" AND
$e.principal.ip_geo_artifact.location.country_or_region != "" AND
$e.principal.ip_geo_artifact.location.country_or_region = "United Kingdom"
Diese Regel schließt die Möglichkeit aus, dass das Ereignis durch IP-Adressen mit der ASN 16509 ausgelöst wird, die sich außerhalb des Vereinigten Königreichs befinden. Dadurch wird die Gesamtgenauigkeit der Regel verbessert.
Benötigen Sie weitere Hilfe? Antworten von Community-Mitgliedern und Google SecOps-Experten erhalten