Problemi noti e limitazioni di YARA-L

Questo documento descrive i problemi e le limitazioni noti dello standard 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 all'evento $e nella seguente regola non sono nidificati in due istanze dell'evento $e, ciascuna 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'annullamento della nidificazione dei campi ripetuti

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 si riferisce a un campo ripetuto che è figlio di un altro campo ripetuto come security_results.action, l'annullamento della nidificazione avviene in a livello di campo principale e a livello di campo secondario. L'insieme risultante e istanze separate da un singolo evento è il prodotto cartesiano di elementi nel campo principale e gli 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'annullamento della nidificazione dei campi ripetuti

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 NON SUPERATO
aaaaaaaaa Google SecOps SFIDA
aaaaaaaaa Google SecOps BLOCCA

Questo comportamento non nidificante nella valutazione delle regole può produrre risposte aggregazioni dei risultati quando la regola fa riferimento a uno o più campi ripetuti con un campo principale che è anch'esso un campo ripetuto. Aggregazioni non distinte come sum(), array() e count() non possono tenere conto di valori duplicati su altri campi nello stesso evento, generato dal comportamento di dis nidificazione. Nell'esempio seguente regola, l'evento $e ha un solo nome host google.com, ma il risultato è hostnames aggrega in quattro istanze non nidificate dello stesso evento $e, ciascuna con un principal.hostname valore. 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 di eventi dopo l'annullamento della nidificazione dei campi ripetuti

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

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

Soluzione alternativa

Le aggregazioni che ignorano i valori duplicati o che li eliminano non sono influenzate da questo comportamento di dis nidificazione. 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 per gli 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, in modo da utilizzare sia e le variabili di evento nei calcoli dei valori dei risultati. I seguenti elementi sono usata nel calcolo:

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 3 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'uso delle parentesi all'inizio di un'espressione provoca il seguente errore:

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

L'esempio seguente genera 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: la seguente procedura 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 non esistenza

Se una condizione OR viene applicata tra due variabili evento separate e se il parametro di una regola non esiste, la regola viene compilata correttamente, ma può 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 alternativa consiste nel separare le condizioni in due blocchi in cui ogni blocco applica il filtro solo a una singola variabile, come mostrato qui:

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 una funzione UDM il cui tipo è un numero intero senza segno, verrà visualizzato un errore. Ad esempio:

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

Il campo udm.network.received_bytes è un numero intero senza segno. Ciò avviene a causa di a costanti intere, che per impostazione predefinita utilizzano numeri interi firmati, che non funzionano numeri 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)