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)