Limites et problèmes connus de YARA-L

Ce document décrit les problèmes et les limites connus de YARA-L.

Agrégations de résultats avec désimbrication de champs répétés

Lorsqu'une règle fait référence à un champ répété sur une variable d'événement et que ce champ répété contient plusieurs éléments, chaque élément est dénoyé dans une ligne d'événement distincte.

Par exemple, les deux chaînes d'adresse IP dans le champ répété target.ip sur l'événement $e dans la règle suivante sont désimbriquées dans deux instances de l'événement $e, chacun avec un élément target.ip différent.

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
}

Enregistrement d'événement avant le désimbrication du champ répété

Le tableau suivant présente l'enregistrement de l'événement avant la désimbrication répétée des champs:

metadata.id principal.application target.ip
aaaaaaaaa Google SecOps [192.0.2.20, 192.0.2.28]

Enregistrements d'événements après la désimbrication répétée d'un champ

Le tableau suivant présente l'enregistrement d'événement après plusieurs annulations de imbrication de champs :

metadata.id principal.application target.ip
aaaaaaaaa Google SecOps 192.0.2.20
aaaaaaaaa Google SecOps 192.0.2.28

Lorsqu'une règle fait référence à un champ répété qui est un enfant d'un autre champ répété tel que security_results.action, le désimbriquement se produit à la fois au niveau du champ parent et du champ enfant. L'ensemble d'instances résultant de l'extraction d'un seul événement est le produit cartésien des éléments du champ parent et des éléments du champ enfant. Dans l'exemple de règle suivant, l'événement $e avec deux valeurs répétées sur security_results et deux valeurs répétées sur security_results.actions sont déimbriqués en quatre instances.

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
}

Enregistrement d'événement avant la désimbrication répétée des champs

Le tableau suivant présente l'enregistrement de l'événement avant la désimbrication répétée des champs:

metadata.id principal.application security_results
aaaaaaaaa Google SecOps [ { actions: [ ALLOW, FAIL ] }, { actions: [ CHALLENGE, BLOCK ] } ]

Enregistrements d'événements après la désimbrication répétée d'un champ

Le tableau suivant présente l'enregistrement d'événement après plusieurs annulations de imbrication de champs :

metadata.id principal.application security_results.actions
aaaaaaaaa Google SecOps AUTORISER
aaaaaaaaa Google SecOps FAIL
aaaaaaaaa Google SecOps DÉFI
aaaaaaaaa Google SecOps BLOQUER

Ce comportement de désimbrication lors de l'évaluation des règles peut générer des agrégations de résultats inattendues lorsque la règle fait référence à un ou plusieurs champs répétés avec un champ parent qui est également un champ répété. Les agrégations non distinctes telles que sum(), array() et count() ne peuvent pas tenir compte des valeurs en double dans d'autres champs du même événement générés par le comportement de désimbrication. Dans l'exemple suivant, règle, l'événement $e comporte un seul nom d'hôte google.com, mais le résultat est hostnames regroupe quatre instances non imbriquées du même événement $e, chacune avec un doublon principal.hostname. Ce résultat donne quatre noms d'hôte au lieu d'un seul en raison de la désimbrication de valeurs répétées sur security_results.actions.

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
}

Enregistrement d'événement avant la désimbrication répétée des champs

Le tableau suivant présente l'enregistrement de l'événement avant la désimbrication répétée des champs:

metadata.id principal.application principal.hostname security_results
aaaaaaaaa Google SecOps google.com [ { action: [ ALLOW, FAIL ] }, { action: [ CHALLENGE, BLOCK ] } ]

Enregistrement d'événement après la désimbrication répétée d'un champ

Le tableau suivant présente l'enregistrement d'événement après plusieurs annulations de imbrication de champs :

metadata.id principal.application principal.hostname security_results.action
aaaaaaaaa Google SecOps google.com AUTORISER
aaaaaaaaa Google SecOps google.com FAIL
aaaaaaaaa Google SecOps google.com DÉFI
aaaaaaaaa Google SecOps google.com BLOQUER

Solution

Les agrégations qui ignorent ou éliminent les valeurs en double ne sont pas affectées par ce comportement de désimbrication. Utilisez la version distincte d'une agrégation si vous rencontrez des valeurs de résultat inattendues en raison d'un désimbriquement.

Les agrégations suivantes ne sont pas affectées par le comportement de désimbrication décrit précédemment.

  • max()
  • min()
  • array_distinct()
  • count_distinct()

Agrégations de résultats avec plusieurs variables d'événements

Si une règle contient plusieurs variables d'événement, il y a un élément distinct dans pour chaque combinaison d'événements inclus dans la détection. Par exemple, si l'exemple de règle suivant est exécuté pour les événements répertoriés:

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"

La somme est calculée pour chaque combinaison d'événements, ce qui vous permet d'utiliser les deux variables d'événement dans les calculs de la valeur du résultat. Les éléments suivants sont utilisés dans le calcul :

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

La somme maximale potentielle est donc de 6, même si $e2 ne peut correspondre qu'à trois événements distincts.

Cela affecte la somme, le nombre et le tableau. Pour le nombre et le tableau, l'utilisation de count_distinct ou array_distinct peut résoudre le problème, mais il n'existe actuellement aucune solution de contournement pour la somme.

Parenthèses au début d'une expression

L'utilisation de parenthèses au début d'une expression déclenche l'erreur suivante :

parsing: error with token: ")"
invalid operator in events predicate

L'exemple suivant génère ce type d'erreur:

($event.metadata.ingested_timestamp.seconds -
$event.metadata.event_timestamp.seconds) / 3600 > 1

Les variantes de syntaxe suivantes renvoient le même résultat, mais avec une syntaxe valide:

$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

Le tableau d'index dans le résultat nécessite une agrégation pour les valeurs uniques dans un champ répété

L'indexation en tableau dans la section des résultats nécessite toujours une agrégation. Par exemple : ce qui suit ne fonctionne pas:

outcome:
  $principal_user_dept = $suspicious.principal.user.department[0]

Toutefois, vous pouvez enregistrer la sortie de l'index du tableau dans une variable d'espace réservé et utilisez cette variable dans la section de résultat, comme indiqué ci-dessous:

events:
  $principal_user_dept = $suspicious.principal.user.department[0]

outcome:
  $principal_user_department = $principal_user_dept

Condition OR avec inexistence

Si une condition OR est appliquée entre deux variables d'événement distinctes et si la règle correspond à une non-existence, la règle se compile correctement, mais peut générer des détections faussement positives. Par exemple, la syntaxe de règle suivante peut correspondre événements comportant $event_a.field = "something" alors que cela ne devrait pas être le cas.

events:
     not ($event_a.field = "something" **or** $event_b.field = "something")
condition:
     $event_a and #event_b >= 0

La solution consiste à séparer les conditions en deux blocs, où chaque bloc le filtre n'est appliqué qu'à une seule variable, comme indiqué ci-dessous:

events:
     not ($event_a.field = "something")
     not ($event_b.field = "something")
condition:
     $event_a and #event_b >= 0

Arithmétique avec des champs d'événement non signés

Si vous essayez d'utiliser une constante entière dans une opération arithmétique avec un champ UDM dont le type est un entier non signé, une erreur s'affiche. Exemple :

events:
  $total_bytes = $e.network.received_bytes * 2

Le champ udm.network.received_bytes est un entier non signé. Cela est dû au à des constantes entières utilisant par défaut des entiers signés, qui ne sont pas compatibles avec entiers non signés dans les opérations arithmétiques.

Le moyen de contourner le problème consiste à forcer la constante entière à un nombre à virgule flottante, qui fonctionnera ensuite avec l'entier sans signature. Exemple :

events:
  $total_bytes = $e.network.received_bytes * (2/1)