Problemi noti e limitazioni dello YARA-L

Questo documento descrive i problemi noti e le limitazioni di YARA-L.

Aggregazioni di risultati con annullamento della nidificazione dei campi ripetuti

Quando una regola fa riferimento a un campo ripetuto su una variabile evento e questo contiene più di un elemento, ogni elemento non è nidificato in un riga dell'evento.

Ad esempio, le due stringhe di indirizzi IP nel campo ripetuto target.ip nell'evento $e nella regola seguente vengono estricate da due istanze dell'evento $e, ognuna con un elemento target.ip diverso.

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
}

Record di evento prima dell'annullamento della nidificazione dei campi ripetuti

La tabella seguente mostra il record dell'evento prima dell'annullamento della nidificazione dei campi ripetuti:

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

Record di eventi dopo l'estrazione da un insieme nidificato di campi

La tabella seguente mostra il record di eventi dopo l'annullamento della nidificazione dei campi ripetuti:

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

Quando una regola fa riferimento a un campo ripetuto che è un elemento secondario di un altro campo ripetuto come security_results.action, l'estrazione dall'annidamento avviene sia a livello di campo principale che di campo secondario. L'insieme risultante di istanze estrae da un singolo evento è il prodotto cartesiano degli elementi nel campo principale e degli elementi nel campo secondario. Nella regola di esempio seguente, l'evento $e con due valori ripetuti su security_results e due valori ripetuti i valori su security_results.actions sono disordinati in quattro istanze.

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
}

Record di evento prima dell'annullamento della nidificazione dei campi ripetuti

La tabella seguente mostra il record dell'evento prima dell'annullamento della nidificazione dei campi ripetuti:

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

Record di eventi dopo l'estrazione da un insieme nidificato di campi

La tabella seguente mostra il record di eventi dopo l'annullamento della nidificazione dei campi ripetuti:

metadata.id principal.application security_results.actions
aaaaaaaaa Google SecOps CONSENTI
aaaaaaaaa Google SecOps FAIL
aaaaaaaaa Google SecOps SFIDA
aaaaaaaaa Google SecOps BLOCCA

Questo comportamento di estrazione dalla nidificazione nella valutazione delle regole può produrre aggregazioni di risultati impreviste quando la regola fa riferimento a uno o più campi ripetuti con un campo principale che è anche un campo ripetuto. Le aggregazioni non distinte come sum(), array() e count() non possono tenere conto dei valori duplicati in altri campi dello stesso evento prodotti dal comportamento di annullamento dell'annidamento. Nella regola di esempio riportata di seguito, l'evento $e ha un singolo nome host google.com, ma il risultato hostnames viene aggregato su quattro istanze non nidificate dello stesso evento $e, ciascuna con un valore principal.hostname duplicato. Questo risultato restituisce quattro nomi host invece di uno. a causa dell'annullamento della nidificazione di valori ripetuti su 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
}

Record di evento prima dell'annullamento della nidificazione dei campi ripetuti

La tabella seguente mostra il record dell'evento prima dell'annullamento della nidificazione dei campi ripetuti:

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

Record evento dopo l'estrazione dal nido di campi ripetuti

La tabella seguente mostra il record dell'evento dopo ripetuti svuotamenti dei campi:

metadata.id principal.application principal.hostname security_results.action
aaaaaaaaa Google SecOps google.com CONSENTI
aaaaaaaaa Google SecOps google.com FAIL
aaaaaaaaa Google SecOps google.com SFIDA
aaaaaaaaa Google SecOps google.com BLOCCA

Soluzione

Le aggregazioni che ignorano o eliminano i valori duplicati non sono affette da questo comportamento di estrazione. Utilizza la versione distinta di un dell'aggregazione se riscontri valori di risultati imprevisti a causa dell'annullamento della nidificazione.

Le seguenti aggregazioni non sono interessate dal comportamento di unnesting descritto in precedenza.

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

Aggregazioni di risultati con più variabili evento

Se una regola contiene più variabili evento, esiste un elemento separato nella per ogni combinazione di eventi inclusa nel rilevamento. Ad esempio, se la seguente regola di esempio viene eseguita sugli eventi elencati:

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 somma viene calcolata su ogni combinazione di eventi, consentendoti di utilizzare entrambe le variabili evento nei calcoli del valore del risultato. Nel calcolo vengono utilizzati i seguenti elementi:

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

Ne consegue una somma massima potenziale di 6, anche se $e2 può solo corrispondono a tre eventi distinti.

Questo influisce su somma, conteggio e array. Per conteggio e array, utilizzando count_distinct oppure array_distinct può risolvere il problema, ma al momento non esistono soluzioni alternative. per somma.

Parentesi all'inizio di un'espressione

L'utilizzo di parentesi all'inizio di un'espressione attiva il seguente errore:

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

Il seguente esempio genererebbe questo tipo di errore:

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

Le seguenti varianti di sintassi restituiscono lo stesso risultato, ma con una sintassi valida:

$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

L'array dell'indice nei risultati richiede l'aggregazione per singoli valori su un campo ripetuto

L'indicizzazione degli array nella sezione dei risultati richiede comunque l'aggregazione. Ad esempio, quanto segue non funziona:

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

Tuttavia, puoi salvare l'output dell'indice dell'array in una variabile segnaposto e utilizzala nella sezione dei risultati come mostrato qui:

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

outcome:
  $principal_user_department = $principal_user_dept

Condizione OR con assenza

Se viene applicata una condizione OR tra due variabili evento distinte e se la regola corrisponde a una condizione di non esistenza, la regola viene compilata correttamente, ma può produrre rilevamenti di falsi positivi. Ad esempio, la seguente sintassi delle regole può eventi con $event_a.field = "something" anche se non dovrebbe.

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

La soluzione consiste nel separare le condizioni in due blocchi in cui ogni blocco applica il filtro solo a una singola variabile, come mostrato di seguito:

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

Aritmetica con campi evento non firmati

Se provi a utilizzare una costante intera in un'operazione aritmetica con un campo UDM il cui tipo è un numero intero non firmato, viene visualizzato un errore. Ad esempio:

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

Il campo udm.network.received_bytes è un numero intero senza segno. Questo accade perché le costanti intere hanno per impostazione predefinita interi con segno, che non funzionano con interi senza segno nelle operazioni aritmetiche.

La soluzione consiste nel forzare la costante intera a un numero in virgola mobile, che quindi funzionerà con il numero intero senza segno. Ad esempio:

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