Bekannte Probleme und Einschränkungen bei YARA-L
In diesem Dokument werden die bekannten Probleme und Einschränkungen von YARA-L beschrieben.
Ergebnisaggregationen mit Aufheben der Verschachtelung von wiederkehrenden Feldern
Wenn eine Regel auf ein wiederholtes Feld in einer Ereignisvariablen mit mehreren Elementen verweist, wird jedes Element in eine separate Ereigniszeile aufgeteilt.
Angenommen, die beiden IP-Adressen im wiederkehrenden Feld target.ip
des Ereignisses $e
werden 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 Aufheben der Verschachtelung eines wiederkehrenden Felds
In der folgenden Tabelle ist der Ereigniseintrag zu sehen, bevor das wiederholte Feld entschachtelt wurde:
metadata.id | principal.application | target.ip |
---|---|---|
aaaaaaaaa |
Google SecOps |
[192.0.2.20 , 192.0.2.28] |
Ereignisdatensätze nach dem Aufheben der Verschachtelung des wiederholten Felds
In der folgenden Tabelle ist der Ereignisdatensatz zu sehen, nachdem das verschachtelte Feld entschachtelt wurde:
metadata.id | principal.application | target.ip |
---|---|---|
aaaaaaaaa |
Google SecOps |
192.0.2.20 |
aaaaaaaaa |
Google SecOps |
192.0.2.28 |
Wenn eine Regel auf ein wiederkehrendes Feld verweist, das in einem anderen verschachtelt ist, z. B. security_results.action
, wird die Verschachtelung sowohl auf der übergeordneten als auch auf der untergeordneten Ebene aufgehoben. Die Instanzen, die durch das Aufheben des Verschachtelungsverhältnisses eines einzelnen Ereignisses entstehen, bilden ein kartesisches Produkt der Elemente in den übergeordneten und untergeordneten Feldern.
In der folgenden Beispielregel werden die verschachtelten Instanzen des Ereignisses $e
mit zwei sich wiederholenden Werten für security_results
und zwei sich wiederholenden Werten für security_results.actions
in vier Instanzen aufgelöst.
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 Aufheben der Verschachtelung eines wiederkehrenden Felds
In der folgenden Tabelle ist der Ereigniseintrag zu sehen, bevor das wiederholte Feld entschachtelt wurde:
metadata.id | principal.application | security_results |
---|---|---|
aaaaaaaaa |
Google SecOps |
[ { actions: [ ALLOW, FAIL ] } , { actions: [ CHALLENGE, BLOCK ] } ] |
Ereignisaufnahmen nach dem Aufheben des Verschachtelungsstatus von wiederholten Feldern
In der folgenden Tabelle ist der Ereignisdatensatz zu sehen, nachdem das verschachtelte Feld entschachtelt wurde:
metadata.id | principal.application | security_results.actions |
---|---|---|
aaaaaaaaa |
Google SecOps |
ZULASSEN |
aaaaaaaaa |
Google SecOps |
FEHLER |
aaaaaaaaa |
Google SecOps |
HERAUSFORDERUNG |
aaaaaaaaa |
Google SecOps |
BLOCKIEREN |
Dieses Entschachtelungsverhalten bei der Regelauswertung kann zu unerwarteten Ergebnisaggregationen führen, wenn die Regel auf ein oder mehrere wiederholte Felder mit einem übergeordneten Feld verweist, das ebenfalls ein wiederholtes Feld ist. Bei nicht eindeutigen Aggregationen wie sum()
, array()
und count()
können keine doppelten Werte in anderen Feldern desselben Ereignisses berücksichtigt werden, die durch das Aufheben des Verschachtelungsstatus entstehen. In der folgenden Beispielregel hat Ereignis $e
einen einzelnen Hostnamen google.com
, das Ergebnis hostnames
wird jedoch über vier nicht verschachtelte Instanzen desselben Ereignisses $e
aggregiert, die jeweils einen duplizierten Wert für principal.hostname
haben. Da wiederholte Werte in security_results.actions
entschachtelt werden, werden vier statt eines Hostnamens zurückgegeben.
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 Aufheben der Verschachtelung eines wiederkehrenden Felds
In der folgenden Tabelle ist der Ereigniseintrag zu sehen, bevor das wiederholte Feld entschachtelt wurde:
metadata.id | principal.application | principal.hostname | security_results |
---|---|---|---|
aaaaaaaaa |
Google SecOps |
google.com |
[ { action: [ ALLOW, FAIL ] } , { action: [ CHALLENGE, BLOCK ] } ] |
Ereignisdatensatz nach dem Aufheben der Verschachtelung eines wiederkehrenden Felds
In der folgenden Tabelle ist der Ereignisdatensatz zu sehen, nachdem das verschachtelte Feld entschachtelt wurde:
metadata.id | principal.application | principal.hostname | security_results.action |
---|---|---|---|
aaaaaaaaa |
Google SecOps |
google.com |
ZULASSEN |
aaaaaaaaa |
Google SecOps |
google.com |
FEHLER |
aaaaaaaaa |
Google SecOps |
google.com |
HERAUSFORDERUNG |
aaaaaaaaa |
Google SecOps |
google.com |
BLOCKIEREN |
Problemumgehung
Aggregationen, bei denen doppelte Werte ignoriert oder entfernt werden, sind von diesem Entschachtelungsverhalten nicht betroffen. Verwenden Sie die eindeutige Version einer Aggregation, wenn Sie aufgrund des Aufhebens der Verschachtelung auf unerwartete Ergebniswerte stoßen.
Die folgenden Aggregationen sind von dem oben beschriebenen Entschachtelungsverhalten nicht 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. Beispiel: Die folgende Beispielregel wird auf die aufgeführten Ereignisse angewendet:
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 bei der Berechnung des Ergebniswerts verwenden. Bei der Berechnung werden die folgenden Elemente 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 ergibt eine potenzielle maximale Summe von 6, obwohl $e2 nur drei verschiedenen Ereignissen entsprechen kann.
Das wirkt sich auf die Funktionen „Summe“, „Anzahl“ und „Array“ aus. Bei „Anzahl“ und „Array“ kann das Problem durch die Verwendung von count_distinct
oder array_distinct
behoben werden. Für „Summe“ gibt es jedoch keine Problemumgehung.
Klammern am Anfang eines Ausdrucks
Wenn Sie Klammern am Anfang eines Ausdrucks verwenden, wird der folgende Fehler ausgegeben:
parsing: error with token: ")"
invalid operator in events predicate
Im folgenden Beispiel würde dieser Fehler ausgegeben:
($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
Indexarray im Ergebnis erfordert Aggregation für einzelne Werte im wiederholten Feld
Für die Array-Indexierung im Bereich „Ergebnis“ ist weiterhin eine Aggregation erforderlich. Folgendes funktioniert beispielsweise nicht:
outcome:
$principal_user_dept = $suspicious.principal.user.department[0]
Sie können die Ausgabe des Arrayindexes jedoch in einer Platzhaltervariablen speichern und diese Variable im Ergebnisbereich verwenden, wie hier gezeigt:
events:
$principal_user_dept = $suspicious.principal.user.department[0]
outcome:
$principal_user_department = $principal_user_dept
ODER-Bedingung mit Nichtvorhandensein
Wenn zwischen zwei separaten Ereignisvariablen eine OR-Bedingung angewendet wird und die Regel mit dem Nichtvorhandensein übereinstimmt, wird sie erfolgreich kompiliert, kann aber zu falsch positiven Erkennungen führen. Mit der folgenden Regelsyntax können beispielsweise Ereignisse 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
Eine Lösung besteht darin, die Bedingungen in zwei Blöcke zu unterteilen, in denen der Filter jeweils 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 einem arithmetischen Vorgang mit einem UDM-Feld zu verwenden, dessen Typ eine Ganzzahl ohne Vorzeichen ist, wird ein Fehler ausgegeben. 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 Ganzzahlen ohne Vorzeichen funktionieren.
Als Problemumgehung können Sie die Ganzzahlkonstante zu einer Gleitkommazahl erzwingen, 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 Anreicherungsphasen (Streaming und latenzempfindlich) priorisiert das System die Geschwindigkeit vor der sofortigen Genauigkeit. Dies kann zu fehlenden Daten und potenziellen Falschmeldungen führen. Das System reichert die Daten weiterhin im Hintergrund an, sie sind aber möglicherweise nicht verfügbar, wenn die Regel ausgeführt wird. Dies ist Teil des normalen Prozesses der Eventual Consistency. Um diese Art von Falschmeldungen zu vermeiden, sollten Sie nicht darauf vertrauen, dass in Ereignissen angereicherte Felder 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, die beide angereicherte Felder sind. Wenn die Datenaufbereitung nicht rechtzeitig abgeschlossen ist, führt die Regel zu einem False Positive.
Um dies zu vermeiden, wäre eine bessere Prüfung für diese Regel:
$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"
Durch diese Regel wird verhindert, dass das Ereignis von IP-Adressen mit der ASN 16509 ausgelöst wird, die sich jedoch außerhalb des Vereinigten Königreichs befinden. Dadurch wird die Gesamtgenauigkeit der Regel verbessert.