Condizioni nella ricerca UDM e nelle dashboard che utilizzano YARA-L 2.0
La sezione condition
definisce i criteri per includere i dati nei risultati di ricerca.
Queste condizioni vengono valutate in base alle variabili di evento e segnaposto
definite nella sezione events
. Puoi combinare queste condizioni
utilizzando la parola chiave and
.
Limitazioni
Le condizioni nella ricerca presentano le seguenti limitazioni:
Obbligatorio:la sezione
match
è obbligatoria. In alternativa, puoi definire filtri non raggruppati direttamente nella sezioneevents
.Obbligatorio: le variabili di evento e segnaposto devono essere aggregate nella sezione
condition
.Sono supportate solo le espressioni di confronto di numeri interi e in virgola mobile. Queste espressioni devono avere una variabile a sinistra e un numero intero o in virgola mobile a destra (ad esempio,
#c > 1
,$port = 80
). Gli operatori supportati sono<
,>
e=
.L'ordine delle variabili e delle clausole all'interno della sezione
condition
non influisce sui risultati.Per utilizzare le variabili di risultato nella sezione
condition
, definiscile e aggrega. Puoi filtrare le variabili dei risultati non aggregate nella sezioneevents
.Le operazioni matematiche dirette con le variabili non sono supportate (ad esempio,
#e1 + 5 > 6
,$o1.sum($pl) > 0
).Non sono previste ulteriori limitazioni se le condizioni
OR
si applicano agli stessi eventi di base. QuandoOR
viene utilizzato in eventi diversi, si applicano le seguenti limitazioni:I confronti di non esistenza non sono supportati con
OR
. Ad esempio,math.log($outcome1_sent_bytes) > 5 OR (#placeholder2) < 10
non è supportato.Le variabili non UDM non sono supportate nelle clausole
OR
che riguardano eventi diversi. Tuttavia,OR
è supportato nel contesto di un singolo evento o quando è raggruppato conAND
. Ad esempio:$entity and ($udm_event_1 or $placeholder_derived_from_udm_event_1)
. Ecco un altro esempio:$entity and ($udm_event_1 or $outcome_udm_event_1_bytes > 1000)
.
Conteggio caratteri (#
)
Il carattere #
, quando precede il nome di una variabile di evento o segnaposto (ad esempio, #c
), rappresenta il numero di occorrenze distinte di quell'evento o il numero di valori distinti che soddisfano tutte le condizioni nella sezione events
associata a quella variabile. Ad esempio, #c > 1
implica che l'evento o il segnaposto c
deve verificarsi più di una volta.
Query di esempio:
$e1.principal.hostname = $hostname
$e1.target.hostname = "fedex.com"
$e1.target.port = 3042 // tcp/udp
$e2.principal.hostname = $hostname
$e2.target.hostname = "homedepot.com"
$e2.target.port = 3042 // tcp/udp
match:
$hostname over 1h
condition:
#e1 > 0 or #e2 > 1
Carattere valore ($
)
La funzione del carattere $
dipende dal contesto.
Variabile risultato:se inserita prima del nome di una variabile risultato (ad esempio,
$risk_score
), rappresenta il valore della variabile.Variabile evento o segnaposto:se inserita prima del nome di una variabile evento o segnaposto (ad esempio,
$event
), equivale a#event > 0
e implica che deve esistere almeno un'occorrenza dell'evento.
Condizioni di evento e segnaposto
Puoi combinare più predicati di condizione per eventi e variabili segnaposto
utilizzando la parola chiave and
.
Esempio di utilizzo di or
(singolo evento):
condition:
$ph2 and $ph3
Importante: quando scrivi la logica nelle sezioni events
o condition
, utilizza
!
per la negazione. Utilizza la parola chiave not
solo nella sezione outcome
.
Condizioni con limiti e senza limiti
Le condizioni delle variabili evento possono essere limitate o illimitate.
Le condizioni delimitate richiedono l'esistenza della variabile evento associata. Ciò significa che almeno un'occorrenza dell'evento deve essere presente in qualsiasi rilevamento.
Esempi:
$var
(equivalente a#var > 0
)#var > n
(doven >= 0
)#var >= m
(dovem > 0
)
Query di esempio:
$e1.principal.hostname = $hostname
$e1.target.hostname = "fedex.com"
match:
$hostname over 1h
condition:
#e1 > 0
Le condizioni senza limiti consentono alla variabile evento associata di non esistere. Ciò significa che è possibile che in un rilevamento non venga visualizzata alcuna occorrenza dell'evento. Qualsiasi riferimento ai campi della variabile evento restituisce un valore pari a zero. Utilizza questi per le ricerche di non esistenza.
Esempi:
!$var
(equivalente a#var = 0
)#var >= 0
#var < n
(doven > 0
)#var <= m
(dovem >= 0
)
Query di esempio:
$e1.principal.hostname = $hostname
$e1.target.hostname = "fedex.com"
$e1.target.port = 3042 // tcp/udp
match:
$hostname over 1h
outcome:
$bytes_sent = sum($e1.network.sent_bytes)
condition:
$bytes_sent >= 0
Nota: per le query di ricerca di non esistenza (che utilizzano condizioni illimitate), il motore di rilevamento aggiunge un ritardo di 1 ora alla latenza prevista.
Le query di ricerca con condizioni illimitate devono soddisfare i seguenti criteri:
Almeno un evento UDM deve avere una condizione delimitata, ovvero deve esistere almeno un evento UDM.
I segnaposto con condizioni illimitate devono essere associati ad almeno un evento UDM limitato.
Le entità con condizioni illimitate devono essere associate ad almeno un evento UDM limitato.
Condizioni di risultato
Puoi definire le condizioni di risultato utilizzando le variabili di risultato e combinarle con
operatori logici (and
, or
, not
). La sintassi di confronto dipende dal
tipo di dati della variabile di risultato.
- Integer e float:utilizza
=
,>
,>=
,<
,<=
,!=
(ad esempio,$risk_score > 10
,$risk_score <= 5.5
). - stringa:utilizza
=
o!=
(ad esempio,$severity = "HIGH"
). - Elenco di numeri interi o array:utilizza
arrays.contains()
(ad esempio,arrays.contains($event_ids, "id_1234")
).
Query di esempio:
$e1.principal.hostname = $hostname
$e1.target.hostname = "fedex.com"
$e1.target.port = 3042 // tcp/udp
match:
$hostname over 1h
outcome:
$bytes_sent = sum($e1.network.sent_bytes)
condition:
$e1
Condizioni N di X nella ricerca UDM
Le condizioni di ricerca UDM supportano la sintassi "N di X", che consente una valutazione flessibile di più criteri. Questa sintassi ti consente di specificare che una condizione è soddisfatta se N
(un numero specifico) di X
(un elenco di espressioni booleane) restituiscono il valore true.
Esempio: considera uno scenario in cui vuoi identificare i processi che mostrano diversi comportamenti sospetti, ma non necessariamente tutti, da un elenco predefinito di tag forniti dall'arricchimento VirusTotal (VT). La sintassi "N di X" risolve questo problema consentendoti di specificare un numero minimo di condizioni che devono essere soddisfatte.
La seguente query di ricerca UDM cerca processi in cui almeno tre delle condizioni sono vere:
$e.metadata.event_type = "PROCESS_LAUNCH"
$e.target.process.file.full_path = $process
match:
$process
outcome:
$first_seen = earliest($e.metadata.event_timestamp)
$last_seen = latest($e.metadata.event_timestamp)
$total_events = count($e.metadata.id)
// Collect all unique tags associated with this process from all its launch events
$tags = array_distinct($e.target.process.file.tags)
condition:
// Trigger if at least 3 of the following conditions (tag checks) are true
3 of [
arrays.contains($tags, "malware"),
arrays.contains($tags, "detect-debug-environment"),
arrays.contains($tags, "checks-disk-space"),
arrays.contains($tags, "checks-cpu-name"),
arrays.contains($tags, "invalid-signature"),
arrays.contains($tags, "self-delete")
]
order:
$total_events desc
Operatori ANY of e ALL of
ANY of [expressions]
restituisce true
se almeno una delle espressioni booleane
elencate è true
. ALL of [expressions]
richiede che ogni espressione elencata sia true
. Combina questi operatori con altre condizioni utilizzando parole chiave come AND
.
Esempio:
$e.metadata.event_type = "PROCESS_LAUNCH"
$e.target.process.file.full_path = $process
match:
$process
outcome:
$first_seen = timestamp.get_timestamp(min($e.metadata.event_timestamp.seconds))
$last_seen = timestamp.get_timestamp(max($e.metadata.event_timestamp.seconds))
$total = count($e.metadata.id)
$tags = array_distinct($e.target.process.file.tags)
$vt_first_seen_time = max(if((timestamp.current_seconds() - $e.target.process.file.first_seen_time.seconds) < 86400, 1 , 0))
$vt_last_analysis_time = max(if((timestamp.current_seconds() - $e.target.process.file.last_analysis_time.seconds) < 86400, 1 , 0))
$vt_last_modification_time = max(if((timestamp.current_seconds() - $e.target.process.file.last_modification_time.seconds) < 86400, 1 , 0))
$vt_last_seen_time = max(if((timestamp.current_seconds() - $e.target.process.file.last_seen_time.seconds) < 86400, 1 , 0))
condition:
3 of [
arrays.contains($tags, "malware"),
arrays.contains($tags, "detect-debug-environment"),
arrays.contains($tags, "checks-disk-space"),
arrays.contains($tags, "checks-cpu-name"),
arrays.contains($tags, "invalid-signature"),
arrays.contains($tags, "self-delete")
]
and ANY of [
$vt_first_seen_time = 1,
$vt_last_analysis_time = 1,
$vt_last_modification_time = 1,
$vt_last_seen_time = 1
]
order:
$total desc
unselect:
$vt_first_seen_time,
$vt_last_analysis_time,
$vt_last_modification_time,
$vt_last_seen_time
Hai bisogno di ulteriore assistenza? Ricevi risposte dai membri della community e dai professionisti di Google SecOps.