Bedingungen in UDM-Suchanfragen und Dashboards mit YARA-L 2.0

Unterstützt in:

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 Bereich events 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 Abschnitt events 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, wenn OR 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 mit AND 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 (wobei n >= 0)
  • #var >= m (wobei m > 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 (wobei n > 0)
  • #var <= m (wobei m >= 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

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