Sintassi della sezione Condizione
Questo documento descrive come utilizzare la sezione condition di una query YARA-L. La sezione condition viene utilizzata nella ricerca, nelle dashboard ed è necessaria per le regole e contiene la logica per filtrare ulteriormente i risultati. Se utilizzato in una query di ricerca o di dashboard, mostra solo l'output che soddisfa le condizioni. Se utilizzate in una regola di rilevamento, le condizioni devono essere soddisfatte per attivare un avviso.
Nella sezione condition, puoi utilizzare operatori booleani, operatori di confronto e risultati delle variabili outcome per determinare se la query deve attivarsi.
Definisci la sezione condition
Definisci le espressioni di condizione per gli eventi e le variabili segnaposto nella sezione condition. Puoi anche specificare una condizione di corrispondenza per gli eventi e i segnaposto definiti nella sezione events e, facoltativamente, utilizzare la parola chiave and per specificare una condizione di corrispondenza utilizzando le variabili di risultato definite nella sezione outcome. Vedi Sintassi della sezione Risultato.
Puoi unire le espressioni utilizzando le parole chiave and o or:
Utilizza
andtra le condizioni.Utilizza
orsolo quando la query contiene una singola variabile evento.
Utilizza il carattere # nella sezione condition prima di qualsiasi nome di variabile evento o segnaposto per rappresentare il numero di eventi o valori distinti che soddisfano tutte le condizioni nella sezione events. Ad esempio:
#c > 1 significa che la variabile c deve verificarsi più di una volta.
Utilizza il carattere $ nella sezione condition prima di qualsiasi nome di variabile di risultato per rappresentare il valore di quel risultato. Se utilizzato prima di qualsiasi nome di variabile segnaposto o evento (ad esempio,
$event), rappresenta #event > 0.
Questo esempio di regola restituisce un rilevamento quando si verificano più di cinque tentativi di accesso non riusciti (come definito nella sezione condition) per ogni utente in un intervallo di 10 minuti (come definito nella sezione match):
rule failed_logins
{
meta:
author = "Security Team"
description = "Detects multiple failed user logins within 10-minute windows."
severity = "HIGH"
events:
$e.metadata.event_type = "USER_LOGIN"
$e.security_result.action = "FAIL"
$user = $e.target.user.userid
match:
$user over 10m
outcome:
$failed_login_count = count($e.metadata.id)
$first_fail_time = min($e.metadata.event_timestamp.seconds)
condition:
#e >= 5
}
Condizioni con limiti e senza limiti
Puoi utilizzare condizioni con limiti o senza limiti in una query:
Le condizioni delimitate forzano l'esistenza della variabile evento associata, il che significa che nella rilevazione deve essere presente almeno un'occorrenza dell'evento. Di seguito sono riportate le condizioni vincolate:
$var // equivalent to #var > 0#var > n // where n >= 0#var >= m // where m > 0Le condizioni senza limiti possono essere utilizzate per rilevare l'assenza di un evento per un periodo di tempo, ad esempio un evento di minaccia senza un evento di mitigazione in un intervallo di 10 minuti. Le condizioni senza limiti consentono alla variabile evento associata di non esistere (query di non esistenza), il che significa che è possibile che nessuna occorrenza dell'evento venga visualizzata in un rilevamento e qualsiasi riferimento ai campi della variabile evento restituisce un valore pari a zero.
Di seguito sono riportate le condizioni illimitate:
!$var // equivalent to #var = 0#var >= 0#var < n // where n > 0#var <= m // where m >= 0
Requisiti per le query di non esistenza
Affinché una query di non esistenza venga compilata, deve soddisfare i seguenti requisiti:
- Almeno un evento UDM deve avere una condizione delimitata (ovvero deve esistere almeno un evento UDM).
- Se un segnaposto ha una condizione illimitata, deve essere associato ad almeno un evento UDM limitato.
- Se un'entità ha una condizione senza limiti, deve essere associata ad almeno un evento UDM con limiti.
Esempio: query di non esistenza
Considera la seguente query con la sezione delle condizioni omessa:
rule NonexistenceExample {
meta:
author = "Google Security"
description = "Example: non-existence query."
events:
$u1.metadata.event_type = "NETWORK_CONNECTION" // $u1 is a UDM event.
$u2.metadata.event_type = "NETWORK_CONNECTION" // $u2 is a UDM event.
$e1.graph.metadata.entity_type = "FILE" // $e1 is an entity.
$e2.graph.metadata.entity_type = "FILE" // $e2 is an entity.
$user = $u1.principal.user.userid // Match variable is required for multi-event query.
// Placeholder Associations:
// u1 u2
// | \ /
// port ip
// | \
// e1 e2
$u1.target.port = $port
$e1.graph.entity.port = $port
$u1.principal.ip = $ip
$u2.target.ip = $ip
$e2.graph.entity.ip = $ip
// UDM-Entity Associations:
// u1 - u2
// | \ |
// e1 e2
$u1.metadata.event_type = $u2.metadata.event_type
$e1.graph.entity.hostname = $u1.principal.hostname
$e2.graph.entity.hostname = $u1.target.hostname
$e2.graph.entity.hostname = $u2.principal.hostname
match:
$user over 5m
condition:
//Add valid condition
}Sezione Condizione valida
Di seguito sono riportati alcuni esempi validi per la sezione delle condizioni:
$u1 and !$u2 and $e1 and $e2- Tutti gli eventi e le entità UDM sono presenti nella sezione delle condizioni.
- Almeno un evento UDM è delimitato.
$u1 and !$u2 and $e1 and !$e2$e2non è limitato ed è consentito perché è associato a$u1, che è limitato. Se$e2non era associato a$u1, questo valore non è valido.#port > 50 and #ip = 0- Nella sezione della condizione non sono presenti eventi ed entità UDM, ma i segnaposto presenti coprono tutti gli eventi e le entità UDM.
$ipè assegnato sia a$u1che a$u2e#ip = 0è una condizione senza limiti. Tuttavia, le condizioni delimitate sono più forti di quelle illimitate. Poiché$portè assegnato a$u1e#port > 50è una condizione limitata,$u1è ancora limitato.
Sezione della condizione non valida
Di seguito sono riportati esempi non validi per la sezione della condizione:
$u1 and $e1- Ogni evento ed entità UDM visualizzato nella sezione
eventsdeve essere visualizzato nella sezionecondition(o deve avere un segnaposto assegnato che viene visualizzato nella sezionecondition). $u1, $u2, $e1, $u2, #port > 50- Le virgole non sono consentite come separatori di condizioni.
!$u1 and !$u2 and $e1 and $e2- Viola il primo requisito secondo cui almeno un evento UDM è delimitato.
($u1 or #port < 50) and $u2 and $e1 and $e2- La parola chiave
ornon è supportata con condizioni illimitate. ($u1 or $u2) and $e1 and $e2- La parola chiave
ornon è supportata tra diverse variabili evento. not $u1 and $u2 and $e1 and $e2- La parola chiave
notnon è consentita per le condizioni di evento e segnaposto. #port < 50 and #ip = 0- Sebbene i segnaposto facciano riferimento a tutti gli eventi e le entità UDM, ogni condizione associata non è limitata. Ciò significa che nessuno degli eventi UDM è delimitato, il che impedisce la compilazione della regola.
Condizioni di risultato
Puoi includere condizioni per le variabili dei risultati nella sezione condition, unite alla parola chiave and o or oppure precedute dalla parola chiave not.
Le condizioni del risultato vengono specificate in modo diverso a seconda del tipo di variabile del risultato:
integer: confronta con un valore letterale intero con gli operatori
=, >, >=, <, <=, !=Ad esempio:$risk_score > 10float: confronta con un valore letterale float con gli operatori
=, >, >=, <, <=, !=Ad esempio:$risk_score <= 5.5string: confronta con un valore letterale stringa con
=o!=Ad esempio:$severity = "HIGH"elenco di numeri interi o array: specifica la condizione utilizzando la funzione
arrays.containsAd esempio:arrays.contains($event_ids, "id_1234")
Se specifichi una condizione di risultato in una query che ha una sezione match, la query viene classificata come query multi-evento per la quota di query. Per saperne di più sulla classificazione di eventi singoli e multipli, consulta la sezione Sintassi di corrispondenza.
Limitazioni
Evita di utilizzare una variabile
matchnella sezionecondition. Si tratta di un errore semantico perché gli eventi sono raggruppati in base al valore della variabilematch.Evita di specificare solo condizioni senza limiti per tutte le variabili
eventa cui è assegnata una variabilematch. Si tratta di un errore semantico. Affinché venga restituito un valore della variabilematch, deve esistere almeno un evento che contenga il valore.Se utilizzi una finestra mobile, la variabile evento pivot deve essere coinvolta in almeno una condizione delimitata.
Passaggi successivi
Informazioni aggiuntive
- Espressioni, operatori e costrutti utilizzati in YARA-L 2.0
- Funzioni in YARA-L 2.0
- Creare regole di rilevamento composite
- Esempi: query YARA-L 2.0
Hai bisogno di ulteriore assistenza? Ricevi risposte dai membri della community e dai professionisti di Google SecOps.