Conditions dans les recherches et les tableaux de bord UDM utilisant YARA-L 2.0

Compatible avec :

La section condition définit les critères d'inclusion des données dans les résultats de recherche. Ces conditions sont évaluées par rapport aux variables d'événement et d'espace réservé définies dans la section events. Vous pouvez combiner ces conditions à l'aide du mot clé and.

Limites

Les conditions de recherche présentent les limites suivantes :

  • Obligatoire : la section match est obligatoire. Vous pouvez également définir des filtres non groupés directement dans la section events.

  • Obligatoire : les variables d'événement et d'espace réservé doivent être agrégées dans la section condition.

  • Seules les expressions de comparaison d'entiers et de nombres à virgule flottante sont acceptées. Ces expressions doivent comporter une variable à gauche et un entier ou un float à droite (par exemple, #c > 1, $port = 80). Les opérateurs acceptés sont <, > et =.

  • L'ordre des variables et des clauses dans la section condition n'a pas d'incidence sur les résultats.

  • Pour utiliser des variables de résultat dans la section condition, définissez-les et agréguez-les. Vous pouvez filtrer les variables de résultat non agrégées dans la section events.

  • Les opérations mathématiques directes avec des variables ne sont pas acceptées (par exemple, #e1 + 5 > 6, $o1.sum($pl) > 0).

  • Aucune restriction supplémentaire ne s'applique si les conditions OR s'appliquent aux mêmes événements de base. Les restrictions suivantes s'appliquent lorsque OR est utilisé dans différents événements :

    • Les comparaisons d'inexistence ne sont pas acceptées avec OR. Par exemple, math.log($outcome1_sent_bytes) > 5 OR (#placeholder2) < 10 n'est pas compatible.

    • Les variables non UDM ne sont pas acceptées dans les clauses OR qui couvrent différents événements. Toutefois, OR est accepté dans le contexte d'un seul événement ou lorsqu'il est regroupé avec AND. Par exemple, $entity and ($udm_event_1 or $placeholder_derived_from_udm_event_1). Voici un autre exemple : $entity and ($udm_event_1 or $outcome_udm_event_1_bytes > 1000).

Nombre de caractères (#)

Le caractère #, lorsqu'il précède un nom de variable d'événement ou d'espace réservé (par exemple, #c), représente le nombre d'occurrences distinctes de cet événement ou le nombre de valeurs distinctes satisfaisant toutes les conditions de la section events associée à cette variable. Par exemple, #c > 1 implique que l'événement ou l'espace réservé c doit se produire plusieurs fois.

Exemple de requête :

$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

Caractère de valeur ($)

La fonction du caractère $ dépend du contexte.

  • Variable de résultat : lorsqu'elle est placée avant le nom d'une variable de résultat (par exemple, $risk_score), elle représente la valeur de la variable.

  • Variable d'événement ou d'espace réservé : lorsqu'elle est placée avant le nom d'une variable d'événement ou d'espace réservé (par exemple, $event), elle équivaut à #event > 0 et implique qu'au moins une occurrence de cet événement doit exister.

Conditions d'événement et d'espace réservé

Vous pouvez combiner plusieurs prédicats de condition pour les événements et les variables d'espace réservé à l'aide du mot clé and.

Exemple d'utilisation de or (événement unique) :

condition:
  $ph2 and $ph3

Important : Lorsque vous écrivez une logique dans les sections events ou condition, utilisez ! pour la négation. N'utilisez le mot clé not que dans la section outcome.

Conditions limitées et illimitées

Les conditions de variables d'événement peuvent être limitées ou illimitées.

Les conditions limitées nécessitent l'existence de la variable d'événement associée. Cela signifie qu'au moins une occurrence de l'événement doit apparaître dans toute détection.

Exemples :

  • $var (équivalent à #var > 0)
  • #var > n (où n >= 0)
  • #var >= m (où m > 0)

Exemple de requête :

$e1.principal.hostname = $hostname
$e1.target.hostname = "fedex.com"

match:
$hostname over 1h

condition:
#e1 > 0

Les conditions non liées permettent à la variable d'événement associée de ne pas exister. Cela signifie qu'il est possible qu'aucune occurrence de l'événement n'apparaisse dans une détection. Toute référence à des champs de la variable d'événement génère une valeur nulle. Utilisez-les pour les recherches d'inexistence.

Exemples :

  • !$var (équivalent à #var = 0)
  • #var >= 0
  • #var < n (où n > 0)
  • #var <= m (où m >= 0)

Exemple de requête :

$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

Remarque : Pour les requêtes de recherche d'inexistence (utilisant des conditions non liées), le moteur de détection ajoute un délai d'une heure à la latence attendue.

Les requêtes de recherche avec des conditions illimitées doivent répondre aux critères suivants :

  • Au moins un événement UDM doit avoir une condition limitée, c'est-à-dire qu'au moins un événement UDM doit exister.

  • Les espaces réservés avec des conditions illimitées doivent être associés à au moins un événement UDM limité.

  • Les entités avec des conditions illimitées doivent être associées à au moins un événement UDM limité.

Conditions de résultat

Vous pouvez définir des conditions de résultat à l'aide de variables de résultat et les combiner avec des opérateurs logiques (and, or, not). La syntaxe de comparaison dépend du type de données de la variable de résultat.

  • Entier et nombre à virgule flottante : utilisez =, >, >=, <, <=, != (par exemple, $risk_score > 10, $risk_score <= 5.5).
  • string : utilisez = ou != (par exemple, $severity = "HIGH").
  • Liste d'entiers ou de tableaux : utilisez arrays.contains() (par exemple, arrays.contains($event_ids, "id_1234")).

Exemple de requête :

$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

Les conditions de recherche UDM sont compatibles avec la syntaxe "N sur X", qui permet une évaluation flexible de plusieurs critères. Cette syntaxe vous permet de spécifier qu'une condition est remplie si N (un nombre spécifique) de X (une liste d'expressions booléennes) sont évaluées sur "true".

Exemple : Imaginons que vous souhaitiez identifier les processus présentant plusieurs comportements suspects, mais pas nécessairement tous, à partir d'une liste prédéfinie de tags fournis par l'enrichissement VirusTotal (VT). La syntaxe "N sur X" permet de résoudre ce problème en vous permettant de spécifier un nombre minimal de conditions à remplir.

La requête de recherche UDM suivante recherche les processus pour lesquels au moins trois des conditions sont remplies :


$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

Opérateurs ANY of et ALL of

ANY of [expressions] renvoie true si au moins une des expressions booléennes listées est true. ALL of [expressions] exige que chaque expression listée soit true. Combinez ces opérateurs avec d'autres conditions à l'aide de mots clés tels que AND.

Exemple :


$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

Vous avez encore besoin d'aide ? Obtenez des réponses de membres de la communauté et de professionnels Google SecOps.