Sintassi della sezione Risultato
La sezione outcome di una query YARA-L definisce le variabili di risultato che specificano l'output per una query di ricerca e della dashboard, nonché contesto e informazioni aggiuntivi per un rilevamento quando viene attivata una regola. Queste variabili possono essere utilizzate per vari scopi, ad esempio per visualizzare dati pertinenti nelle dashboard e creare punteggi di rischio.
Definisci la sezione Risultato
Utilizza il carattere $, seguito dal nome di una variabile, per definire una variabile di risultato nella sezione outcome di una singola query. Puoi definire fino a 20 variabili di risultato. I nomi delle variabili sono arbitrari. Per le regole, i valori dei risultati vengono calcolati e aggregati in base a ogni rilevamento.
A ogni variabile di risultato viene assegnato un valore utilizzando un'espressione.
Questa regola cerca accessi non riusciti da una nuova posizione:
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
}
La sezione outcome esegue aggregazioni sulle variabili evento e segnaposto: conta gli accessi non riusciti, gli indirizzi IP univoci e l'ora in cui si è verificato l'errore.
outcome:
$failed_login_count = count($e.metadata.id)
$first_fail_time = min($e.metadata.event_timestamp.seconds)
Se includi e compili la variabile speciale $risk_scoreoutcome, il relativo valore (intero o mobile) viene visualizzato nella pagina Avvisi e indicatori di compromissione per gli avvisi generati dalla query.
Se non includi una variabile $risk_score nella sezione outcome di una query, viene impostato uno dei seguenti valori predefiniti:
Se la query è configurata per generare un avviso,
$risk_scoreè impostato su 40.Se la query non è configurata per generare un avviso,
$risk_scoreè impostato su 15.
Il valore di $risk_score è memorizzato nel campo UDM security_result.risk_score.
Variabile di risultato del punteggio di rischio
Google SecOps Risk Analytics associa automaticamente i rilevamenti
e gli avvisi alle entità correlate a quel rilevamento o avviso. La variabile di risultato risk_score viene utilizzata per assegnare un livello di rischio. Se questo valore non è impostato,
viene utilizzato il valore predefinito di rilevamento o avviso. Puoi configurare i valori predefiniti
in Impostazioni.
Per garantire la coerenza sulla piattaforma, consigliamo di utilizzare i seguenti
intervalli di punteggio quando assegni un risk_score alle tue rilevazioni personalizzate. Questo
allineamento contribuisce a standardizzare i workflow di priorità e risposta agli avvisi.
| Gravità | Intervallo di punteggi | Descrizione | Esempio |
|---|---|---|---|
| Avvisi - Critici | 90 - 100 | Compromissione attiva con il potenziale di avere un impatto oltre un singolo account utente o endpoint. Richiede una revisione immediata. | Mimikatz eseguito sul controller di dominio. |
| Avvisi - Alto | 80 - 89 | Compromissione attiva di un singolo endpoint o entità. Deve essere esaminato immediatamente. | Il server di produzione chiama un C2 recente e noto. |
| Avvisi - Medio | 50 - 79 | Potenziale problema di sicurezza che richiede un'indagine. Nessuna compromissione confermata, ma è possibile la riassegnazione. | Una credenziale esposta, nessun segno di uso improprio. |
| Non-Alerting - Low | 20 - 49 | Evento di sicurezza a basso impatto che, se combinato con altri indicatori o osservazioni, potrebbe portare a un incidente più significativo. In genere non è necessaria alcuna revisione e può essere combinato con altre rilevazioni tramite regole composite per creare un avviso. | Scansione delle porte interne. |
| Osservazioni non di avviso | 1 - 19 | In genere, rilevamenti basati su informazioni destinate a creare consapevolezza situazionale di una minaccia. In genere non richiede revisione; può essere combinato con altre rilevazioni tramite regole composite per generare avvisi. | Un evento di accesso, nessun segno di utilizzo improprio. |
Poiché risk_score è una variabile di risultato, le regole possono esprimere sfumature a seconda di fattori quali l'intelligence sulle minacce o altre condizioni simultanee.
I punteggi di rischio delle entità possono essere utilizzati per generare avvisi basati sul rischio quasi in tempo reale. Per saperne di più, consulta la panoramica di Risk Analytics.
Tipi di dati delle variabili di risultato
Ogni variabile di risultato può avere un tipo di dati diverso, determinato dall'espressione utilizzata per calcolarla. In Google SecOps sono supportati i seguenti tipi di dati sugli esiti:
- integer
- float
- string
- elenchi di numeri interi
- elenchi di numeri decimali
- elenchi di stringhe
Logica condizionale
Puoi utilizzare la logica condizionale per calcolare il valore di un risultato. Le condizioni vengono specificate utilizzando il seguente pattern di sintassi:
if(BOOL_CLAUSE, THEN_CLAUSE)
if(BOOL_CLAUSE, THEN_CLAUSE, ELSE_CLAUSE)
Puoi leggere un'espressione condizionale come "se BOOL_CLAUSE è true, restituisci THEN_CLAUSE, altrimenti restituisci ELSE_CLAUSE".
BOOL_CLAUSE deve restituire un valore booleano. Un'espressione BOOL_CLAUSE ha una
forma simile alle espressioni nella sezione events. Ad esempio, può
contenere:
Nomi dei campi UDM con operatore di confronto:
if($context.graph.entity.user.title = "Vendor", 100, 0)Variabile segnaposto definita nella sezione
events:if($severity = "HIGH", 100, 0)Un'altra variabile di risultato definita nella sezione
outcome:if($risk_score > 20, "HIGH", "LOW")Funzioni che restituiscono un valore booleano:
if(re.regex($e.network.email.from, `.*altostrat.com`), 100, 0)Cerca in un elenco di riferimento:
if($u.principal.hostname in %my_reference_list_name, 100, 0)Confronto tra aggregazioni:
if(count($login.metadata.event_timestamp.seconds) > 5, 100, 0)
THEN_CLAUSE ed ELSE_CLAUSE devono essere dello stesso tipo di dati. Supportiamo numeri interi, numeri in virgola mobile e stringhe.
Puoi omettere ELSE_CLAUSE se il tipo di dati è un numero intero o un numero in virgola mobile. Se omessa, la ELSE_CLAUSE restituisce 0. Ad esempio:
`if($e.field = "a", 5)` is equivalent to `if($e.field = "a", 5, 0)`
Devi fornire ELSE_CLAUSE se il tipo di dati è stringa o se THEN_CLAUSE è una variabile segnaposto o una variabile risultato.
Operazioni matematiche
Puoi utilizzare operazioni matematiche per calcolare il tipo di dati integer o float nelle sezioni outcome e events di una query. Google Security Operations supporta addizione, sottrazione, moltiplicazione, divisione e modulo come operatori di primo livello in un calcolo.
Il seguente snippet è un esempio di calcolo nella sezione outcome:
outcome:
$risk_score = max(100 + if($severity = "HIGH", 10, 5) - if($severity = "LOW", 20, 0))
Le operazioni matematiche sono consentite sui seguenti tipi di operandi, a condizione che ogni operando e l'intera espressione aritmetica siano aggregati correttamente (vedi Aggregazioni):
- Campi evento numerici
- Variabili segnaposto numeriche definite nella sezione
events - Variabili di risultato numeriche definite nella sezione
outcome - Funzioni che restituiscono numeri interi o numeri in virgola mobile
- Aggregazioni che restituiscono numeri interi o numeri in virgola mobile
Il modulo non è consentito per i numeri in virgola mobile.
Variabili segnaposto nei risultati
Quando calcoli le variabili di risultato, puoi utilizzare le variabili segnaposto definite nella sezione degli eventi della query. In questo esempio, supponiamo che
$email_sent_bytes sia stato definito nella sezione degli eventi della regola:
Esempio: evento singolo senza sezione di corrispondenza
// No match section, so this is a single-event query. outcome: // Use placeholder directly as an outcome value. $my_outcome = $email_sent_bytes // Use placeholder in a conditional. $other_outcome = if($file_size > 1024, "SEVERE", "MODERATE") condition: $e
Esempio: evento multiplo con sezione della partita
match:
// This is a multi event query with a match section.
$hostname over 5m
outcome:
// Use placeholder directly in an aggregation function.
$max_email_size = max($email_sent_bytes)
// Use placeholder in a mathematical computation.
$total_bytes_exfiltrated = sum(
1024
+ $email_sent_bytes
+ $file_event.principal.file.size
)
condition:
$email_event and $file_eventVariabili di risultato nelle espressioni di assegnazione del risultato
Le variabili di risultato possono essere utilizzate per derivare altre variabili di risultato, in modo simile alle
variabili segnaposto definite nella sezione events. Puoi fare riferimento a una variabile
di risultato nell'assegnazione di un'altra variabile di risultato con un token $ seguito
dal nome della variabile. Le variabili risultato devono essere definite prima di poter essere utilizzate
nel testo della query. Se utilizzate in un'espressione di assegnazione, le variabili di risultato non devono essere aggregate (vedi Aggregazioni).
Nell'esempio seguente, la variabile di risultato $risk_score deriva il suo
valore dalla variabile di risultato $event_count:
Esempio: variabile di risultato derivata da un'altra variabile di risultato
match: // This is a multi event query with a match section. $hostname over 5m outcome: // Aggregates all timestamp on login events in the 5 minute match window. $event_count = count($login.metadata.event_timestamp.seconds) // $event_count cannot be aggregated again. $risk_score = if($event_count > 5, "SEVERE", "MODERATE") // This is the equivalent of the 2 outcomes combined. $risk_score2 = if(count($login.metadata.event_timestamp.seconds) > 5, "SEVERE", "MODERATE") condition: $e
Le variabili risultato possono essere utilizzate in qualsiasi tipo di espressione sul lato destro di un'assegnazione del risultato, tranne nelle seguenti espressioni:
- Aggregazioni
Arrays.length()chiamate di funzione- Con i modificatori
anyoall
Aggregazioni
I campi evento ripetuti sono valori non scalari. ovvero una singola variabile punta a
più valori. Ad esempio, la variabile del campo evento $e.target.ip è un campo ripetuto
e può avere zero, uno o molti valori IP. È un valore non scalare. mentre la variabile di campo evento
$e.principal.hostname non è un campo ripetuto e ha un solo valore (ovvero un valore scalare).
Allo stesso modo, sia i campi evento non ripetuti sia quelli ripetuti utilizzati nella sezione outcome
di una query con una finestra di corrispondenza sono valori non scalari.
Esempio: raggruppare gli eventi con la sezione di corrispondenza e il campo non ripetuto
La seguente query raggruppa gli eventi utilizzando una sezione "match" e fa riferimento a un campo evento non ripetuto nella sezione "outcome":
rule OutcomeAndMatchWindow{
...
match:
$userid over 5m
outcome:
$hostnames = array($e.principal.hostname)
...
}Qualsiasi finestra di 5 minuti in cui viene eseguita la query può contenere zero, uno o molti eventi. La sezione Risultato
opera su tutti gli eventi in una finestra di corrispondenza. Qualsiasi variabile di campo evento a cui viene fatto riferimento nella sezione
risultato può puntare a zero, uno o più valori del campo in ogni evento nella finestra di corrispondenza.
Ad esempio, se una finestra di 5 minuti contiene 5 eventi $e, $e.principal.hostname
nella sezione dei risultati indica cinque nomi host diversi. La variabile del campo evento
$e.principal.hostname viene trattata come un valore non scalare nella sezione outcome di questa query.
Poiché le variabili di risultato devono sempre produrre un singolo valore scalare, qualsiasi valore non scalare da cui dipende un'assegnazione del risultato deve essere aggregato per produrre un singolo valore scalare. In una sezione dei risultati, i seguenti sono valori non scalari e devono essere aggregati:
- Campi evento (ripetuti o non ripetuti) quando la query utilizza una sezione
match - Segnaposto per eventi (ripetuti o non ripetuti) quando la query utilizza una sezione
match - Campi evento ripetuti quando la query non utilizza una sezione
match - Segnaposto per eventi ripetuti quando la query non utilizza una sezione
match
I campi evento scalari, i segnaposto evento scalari e le costanti possono essere racchiusi in
funzioni di aggregazione nelle query che non includono una sezione match. Tuttavia, nella maggior parte dei casi, queste aggregazioni restituiscono il valore sottoposto a wrapping, rendendole non necessarie.
Un'eccezione è l'aggregazione array(), che puoi utilizzare per convertire esplicitamente
un valore scalare in un array.
Le variabili di risultato vengono trattate come aggregazioni: non devono essere riaggregate quando vengono menzionate in un'altra assegnazione di risultato.
Puoi utilizzare le seguenti funzioni di aggregazione:
| Funzione di aggregazione | Descrizione |
|---|---|
max() |
Restituisce il valore massimo tra tutti i valori possibili. Funziona solo con numeri interi e in virgola mobile. |
min() |
Restituisce il valore minimo tra tutti i valori possibili. Funziona solo con numeri interi e in virgola mobile. |
sum() |
Restituisce la somma di tutti i valori possibili. Funziona solo con numeri interi e in virgola mobile. |
count_distinct() |
Raccoglie tutti i valori possibili, quindi restituisce il conteggio distinto dei valori possibili. |
count() |
Si comporta come `count_distinct()`, ma restituisce un conteggio non univoco dei valori possibili. |
array_distinct() |
Raccoglie tutti i possibili valori distinti, quindi restituisce un elenco di questi valori. Tronca l'elenco dei valori distinti a 1000 elementi casuali. Viene applicata prima la deduplicazione per ottenere un elenco distinto, poi il troncamento. |
array() |
Si comporta come array_distinct(), ma restituisce un elenco di valori non distinti. Inoltre,tronca l'elenco dei valori a 1000 elementi casuali. |
La funzione di aggregazione è importante quando una regola include una sezione condition che specifica che devono esistere più eventi, perché la funzione di aggregazione opererà su tutti gli eventi che hanno generato il rilevamento.
Esempio: condizione per più eventi
Di seguito è riportato un esempio di condizione per più eventi. Se la sezione relativa al risultato e alla condizione contiene:
outcome: $asset_id_count = count($event.principal.asset_id) $asset_id_distinct_count = count_distinct($event.principal.asset_id) $asset_id_list = array($event.principal.asset_id) $asset_id_distinct_list = array_distinct($event.principal.asset_id) condition: #event > 1
Poiché la sezione `condition` richiede più di un `event` per ogni rilevamento, le funzioni di aggregazione operano su più eventi. Supponiamo che i seguenti eventi abbiano generato un rilevamento:
event: // UDM event 1 asset_id="asset-a" event: // UDM event 2 asset_id="asset-b" event: // UDM event 3 asset_id="asset-b"
I valori dei risultati saranno:
- $asset_id_count = 3
- $asset_id_distinct_count = 2
- $asset_id_list = `["asset-a", "asset-b", "asset-b"]
- $asset_id_distinct_list = `["asset-a", "asset-b"]
Limitazioni
La sezione
outcomenon può fare riferimento a una nuova variabile segnaposto che non è già stata definita nella sezioneeventso nella sezioneoutcome.La sezione
outcomenon può utilizzare variabili evento che non sono state definite nella sezioneevents.La sezione
outcomepuò utilizzare un campo evento non utilizzato nella sezioneevents, a condizione che la variabile evento a cui appartiene il campo evento sia già stata definita nella sezioneevents.La sezione
outcomepuò correlare solo le variabili evento che sono già state correlate nella sezioneevents. Le correlazioni si verificano quando vengono equiparati due campi evento di variabili evento diverse.
Consulta la sezione Panoramica di YARA-L 2.0 per esempi di outcome.
Per maggiori dettagli sulla deduplicazione del rilevamento con la sezione outcome, vedi Creare analisi sensibili al contesto.
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.