Bedingungen in UDM-Suchanfragen und Dashboards mit YARA-L 2.0
Im Abschnitt condition
werden Kriterien für die Einbeziehung von Daten in Suchergebnisse definiert.
Diese Bedingungen werden anhand von Ereignis- und Platzhaltervariablen ausgewertet, die im Abschnitt events
definiert sind. Sie können diese Bedingungen mit dem Keyword and
kombinieren.
Beschränkungen
Für Bedingungen in der Suche gelten die folgenden Einschränkungen:
Erforderlich:Der Abschnitt
match
ist obligatorisch. Alternativ können Sie ungegliederte Filter direkt im Bereichevents
definieren.Erforderlich: Ereignis- und Platzhaltervariablen müssen im Abschnitt
condition
zusammengefasst werden.Es werden nur Vergleichsausdrücke für Ganzzahlen und Gleitkommazahlen unterstützt. Diese Ausdrücke müssen links eine Variable und rechts eine Ganzzahl oder Gleitkommazahl enthalten (z. B.
#c > 1
,$port = 80
). Die unterstützten Operatoren sind<
,>
und=
.Die Reihenfolge der Variablen und Klauseln im
condition
-Abschnitt hat keine Auswirkungen auf die Ergebnisse.Wenn Sie Ergebnisvariablen im Abschnitt
condition
verwenden möchten, müssen Sie sie definieren und aggregieren. Sie können nicht aggregierte Ergebnisvariablen im Abschnittevents
filtern.Direkte mathematische Operationen mit Variablen werden nicht unterstützt (z. B.
#e1 + 5 > 6
,$o1.sum($pl) > 0
).Es gelten keine zusätzlichen Einschränkungen, wenn die
OR
-Bedingungen für dieselben Basisereignisse gelten. Die folgenden Einschränkungen gelten, wennOR
für verschiedene Ereignisse verwendet wird:Vergleiche, bei denen etwas nicht vorhanden ist, werden mit
OR
nicht unterstützt. Beispiel:math.log($outcome1_sent_bytes) > 5 OR (#placeholder2) < 10
wird nicht unterstützt.Variablen, die nicht vom UDM stammen, werden in
OR
-Klauseln, die sich über verschiedene Ereignisse erstrecken, nicht unterstützt.OR
wird jedoch in einem einzelnen Ereigniskontext oder in Kombination mitAND
unterstützt. Beispiel:$entity and ($udm_event_1 or $placeholder_derived_from_udm_event_1)
Ein weiteres Beispiel:$entity and ($udm_event_1 or $outcome_udm_event_1_bytes > 1000)
.
Zeichen zählen (#
)
Das Zeichen #
vor dem Namen einer Ereignis- oder Platzhaltervariablen (z. B. #c
) steht für die Anzahl der unterschiedlichen Vorkommen dieses Ereignisses oder die Anzahl der unterschiedlichen Werte, die alle Bedingungen im Abschnitt events
erfüllen, der dieser Variablen zugeordnet ist. #c > 1
bedeutet beispielsweise, dass das Ereignis oder der Platzhalter c
mehrmals vorkommen muss.
Beispielabfrage:
$e1.principal.hostname = $hostname
$e1.target.hostname = "fedex.com"
$e1.target.port = 3042 // tcp/udp
$e2.principal.hostname = $hostname
$e2.target.hostname = "homedepot.com"
$e2.target.port = 3042 // tcp/udp
match:
$hostname over 1h
condition:
#e1 > 0 or #e2 > 1
Wertzeichen ($
)
Die Funktion des Zeichens $
hängt vom Kontext ab.
Ergebnisvariable:Wenn sie vor einem Namen einer Ergebnisvariablen (z. B.
$risk_score
) platziert wird, stellt sie den Wert der Variablen dar.Ereignis- oder Platzhaltervariable:Wenn sie vor einem Ereignis- oder Platzhalternamen steht (z. B.
$event
), entspricht sie#event > 0
und bedeutet, dass mindestens ein Vorkommen dieses Ereignisses vorhanden sein muss.
Bedingungen für Ereignisse und Platzhalter
Sie können mehrere Bedingungsprädikate für Ereignisse und Platzhaltervariablen mit dem Keyword and
kombinieren.
Beispiel für die Verwendung von or
(einzelnes Ereignis):
condition:
$ph2 and $ph3
Wichtig:Wenn Sie Logik in den Abschnitten events
oder condition
schreiben, verwenden Sie !
für die Negation. Verwenden Sie das Keyword not
nur im Abschnitt outcome
.
Begrenzte und unbegrenzte Bedingungen
Bedingungen für Ereignisvariablen können begrenzt oder unbegrenzt sein.
Für eingeschränkte Bedingungen muss die zugehörige Ereignisvariable vorhanden sein. Das bedeutet, dass das Ereignis bei jeder Erkennung mindestens einmal auftreten muss.
Beispiele:
$var
(entspricht#var > 0
)#var > n
(wobein >= 0
)#var >= m
(wobeim > 0
)
Beispielabfrage:
$e1.principal.hostname = $hostname
$e1.target.hostname = "fedex.com"
match:
$hostname over 1h
condition:
#e1 > 0
Bei unbegrenzten Bedingungen kann die zugehörige Ereignisvariable nicht vorhanden sein. Das bedeutet, dass es möglich ist, dass kein Auftreten des Ereignisses in einer Erkennung angezeigt wird. Jeder Verweis auf Felder in der Ereignisvariablen führt zu einem Nullwert. Verwenden Sie diese für Suchanfragen, bei denen es um das Nichtvorhandensein von Inhalten geht.
Beispiele:
!$var
(entspricht#var = 0
)#var >= 0
#var < n
(wobein > 0
)#var <= m
(wobeim >= 0
)
Beispielabfrage:
$e1.principal.hostname = $hostname
$e1.target.hostname = "fedex.com"
$e1.target.port = 3042 // tcp/udp
match:
$hostname over 1h
outcome:
$bytes_sent = sum($e1.network.sent_bytes)
condition:
$bytes_sent >= 0
Hinweis:Bei Suchanfragen, die nicht vorhanden sind (mit unbegrenzten Bedingungen), fügt die Erkennungs-Engine der erwarteten Latenz eine Verzögerung von einer Stunde hinzu.
Suchanfragen mit unbegrenzten Bedingungen müssen die folgenden Kriterien erfüllen:
Mindestens ein UDM-Ereignis muss eine begrenzte Bedingung haben. Das bedeutet, dass mindestens ein UDM-Ereignis vorhanden sein muss.
Platzhalter mit unbegrenzten Bedingungen müssen mindestens einem begrenzten UDM-Ereignis zugeordnet sein.
Entitäten mit unbegrenzten Bedingungen müssen mindestens einem begrenzten UDM-Ereignis zugeordnet sein.
Ergebnisbedingungen
Sie können Ergebnisbedingungen mit Ergebnisvariablen definieren und mit logischen Operatoren (and
, or
, not
) kombinieren. Die Vergleichssyntax hängt vom Datentyp der Ergebnisvariablen ab.
- Ganzzahl und Gleitkommazahl:Verwenden Sie
=
,>
,>=
,<
,<=
,!=
(z. B.$risk_score > 10
,$risk_score <= 5.5
). - String:Verwenden Sie
=
oder!=
(z. B.$severity = "HIGH"
). - Liste von Ganzzahlen oder Arrays:Verwenden Sie
arrays.contains()
(z. B.arrays.contains($event_ids, "id_1234")
).
Beispielabfrage:
$e1.principal.hostname = $hostname
$e1.target.hostname = "fedex.com"
$e1.target.port = 3042 // tcp/udp
match:
$hostname over 1h
outcome:
$bytes_sent = sum($e1.network.sent_bytes)
condition:
$e1
„N von X“-Bedingungen in der UDM-Suche
UDM-Suchbedingungen unterstützen die „N von X“-Syntax, die eine flexible Auswertung mehrerer Kriterien ermöglicht. Mit dieser Syntax können Sie angeben, dass eine Bedingung erfüllt ist, wenn N
(eine bestimmte Zahl) von X
(eine Liste boolescher Ausdrücke) als „true“ ausgewertet wird.
Beispiel: Sie möchten Prozesse identifizieren, die mehrere verdächtige Verhaltensweisen aufweisen, aber nicht unbedingt alle, aus einer vordefinierten Liste von Tags, die durch die VirusTotal-Anreicherung (VT) bereitgestellt werden. Mit der Syntax „N von X“ können Sie eine Mindestanzahl von Bedingungen angeben, die erfüllt sein müssen.
Mit der folgenden UDM-Suchanfrage wird nach Prozessen gesucht, bei denen mindestens drei der Bedingungen zutreffen:
$e.metadata.event_type = "PROCESS_LAUNCH"
$e.target.process.file.full_path = $process
match:
$process
outcome:
$first_seen = earliest($e.metadata.event_timestamp)
$last_seen = latest($e.metadata.event_timestamp)
$total_events = count($e.metadata.id)
// Collect all unique tags associated with this process from all its launch events
$tags = array_distinct($e.target.process.file.tags)
condition:
// Trigger if at least 3 of the following conditions (tag checks) are true
3 of [
arrays.contains($tags, "malware"),
arrays.contains($tags, "detect-debug-environment"),
arrays.contains($tags, "checks-disk-space"),
arrays.contains($tags, "checks-cpu-name"),
arrays.contains($tags, "invalid-signature"),
arrays.contains($tags, "self-delete")
]
order:
$total_events desc
Operatoren ANY of und ALL of
ANY of [expressions]
wird als true
ausgewertet, wenn mindestens einer der aufgeführten booleschen Ausdrücke true
ist. ALL of [expressions]
erfordert, dass jeder aufgeführte Ausdruck true
ist. Sie können diese Operatoren mit anderen Bedingungen kombinieren, indem Sie Keywords wie AND
verwenden.
Beispiel:
$e.metadata.event_type = "PROCESS_LAUNCH"
$e.target.process.file.full_path = $process
match:
$process
outcome:
$first_seen = timestamp.get_timestamp(min($e.metadata.event_timestamp.seconds))
$last_seen = timestamp.get_timestamp(max($e.metadata.event_timestamp.seconds))
$total = count($e.metadata.id)
$tags = array_distinct($e.target.process.file.tags)
$vt_first_seen_time = max(if((timestamp.current_seconds() - $e.target.process.file.first_seen_time.seconds) < 86400, 1 , 0))
$vt_last_analysis_time = max(if((timestamp.current_seconds() - $e.target.process.file.last_analysis_time.seconds) < 86400, 1 , 0))
$vt_last_modification_time = max(if((timestamp.current_seconds() - $e.target.process.file.last_modification_time.seconds) < 86400, 1 , 0))
$vt_last_seen_time = max(if((timestamp.current_seconds() - $e.target.process.file.last_seen_time.seconds) < 86400, 1 , 0))
condition:
3 of [
arrays.contains($tags, "malware"),
arrays.contains($tags, "detect-debug-environment"),
arrays.contains($tags, "checks-disk-space"),
arrays.contains($tags, "checks-cpu-name"),
arrays.contains($tags, "invalid-signature"),
arrays.contains($tags, "self-delete")
]
and ANY of [
$vt_first_seen_time = 1,
$vt_last_analysis_time = 1,
$vt_last_modification_time = 1,
$vt_last_seen_time = 1
]
order:
$total desc
unselect:
$vt_first_seen_time,
$vt_last_analysis_time,
$vt_last_modification_time,
$vt_last_seen_time
Benötigen Sie weitere Hilfe? Antworten von Community-Mitgliedern und Google SecOps-Experten erhalten