Logica di finestra di YARA-L 2.0
Questa guida aiuta gli ingegneri della sicurezza a scegliere il tipo di finestra corretto per le query per evitare errori del compilatore "variabile non associata". La transizione dalle finestre scorrevoli alle finestre temporali consente di creare una logica che dipende dall'assenza di eventi, ad esempio un heartbeat mancante o un'origine log non riuscita.
Prima di iniziare
Verifica che il tuo account disponga di uno dei seguenti ruoli per creare e modificare le query YARA-L:
- Amministratore Detection Engine (
roles/chronicle.detectionEngineAdmin) - Editor SecOps (
roles/chronicle.editor)
Tipi di finestre supportati
YARA-L 2.0 utilizza diversi comportamenti di finestra per determinare come viene suddiviso il tempo e come vengono raggruppati gli eventi. Puoi raggruppare i campi evento e i segnaposto nella sezione match in base a una granularità temporale specificata utilizzando le seguenti finestre supportate:
| Tipo di finestra supportato | Sintassi | Descrizione | Caso d'uso comune |
|---|---|---|---|
| Hop | $key over <duration> |
Crea intervalli di tempo fissi e sovrapposti. Il sistema definisce la sovrapposizione e l'allineamento per rilevare gli eventi vicino ai limiti. | Correlazione generale di più eventi, indipendentemente dagli orari di inizio esatti. |
| Tumbling | $key by <duration> |
Segmenta i dati in blocchi continui, non sovrapposti e di dimensioni fisse. Valuta indipendentemente dall'arrivo dell'evento. | Quantificare l'attività in slot fissi (ad esempio, $user by 30m) o rilevare l'assenza di eventi. |
| Scorrimento | $key over <duration> [before|after] $pivot |
Ancora la finestra a un evento "pivot" specifico. Richiede che esista un punto di rotazione per attivare una ricerca indietro o in avanti. |
Sequenza rigorosa in cui l'ordine degli eventi è fondamentale (ad esempio, File Download after Login). |
Comprendere la logica di window_start e window_end
Google Security Operations fornisce due parole chiave universali riservate che vengono risolte direttamente in timestamp GoogleSQL da utilizzare nelle query. Queste parole chiave ti consentono di accedere ai limiti dei bucket temporali:
window_start: il limite iniziale del bucket temporale.window_end: il limite di chiusura del bucket temporale.
Vincoli di utilizzo
- Requisito di corrispondenza:per utilizzare queste parole chiave, devi definire una finestra (
byoover) nella sezionematch. - Limitazione della sezione:utilizza queste parole chiave in
condition,orderooutcome. Non sono validi nella sezioneevents. - Spazio dei nomi:non utilizzarli come nomi di variabili personalizzate (ad esempio,
$window_start).
Determinare il tipo di finestra e la sintassi
Utilizza questa tabella come riferimento rapido per determinare il tipo di finestra e la sintassi da utilizzare per le regole di rilevamento.
| Scenario | Finestra consigliata | Parole chiave consigliate | Vantaggio principale |
|---|---|---|---|
| Rilevamenti ad alta frequenza (ad esempio, attacchi di forza bruta) | Finestra scorrevole (over) |
window_start, window_end |
Si attiva immediatamente quando la soglia viene raggiunta in un periodo di tempo continuativo. |
| Assenza/non esistenza (ad esempio, battito cardiaco assente) | Finestra a cascata (by) |
window_start, window_end |
Valuta i blocchi di tempo fissi anche se non si verificano eventi, evitando errori di tipo Variabile non delimitata. |
| Report cronologico | Scivolamento o caduta | order: window_start asc |
Standardizza l'output degli avvisi per semplificare l'analisi della cronologia nell'interfaccia utente di Chronicle. |
| Filtro basato sul tempo | Scivolamento o caduta | condition: window_start > "2026-01-01 00:00:00Z" |
Limita la valutazione delle regole a date specifiche utilizzando la conversione del timestamp GoogleSQL. |
Confrontare i tipi di timestamp e i fusi orari
YARA-L supporta il confronto diretto di window_start e window_end con le stringhe nel formato timestamp GoogleSQL. In questo modo puoi eseguire un filtraggio preciso senza conversione manuale dei tipi.
Nota:specifica sempre il fuso orario UTC utilizzando il suffisso Z (ad esempio, "2026-03-17T17:35:00Z") per allinearti ai timestamp degli eventi UDM.
Utilizza i filtri dei timestamp per il rendimento. Se devi solo confermare che un evento si è verificato dopo un altro, un confronto dei timestamp nella sezione condition è spesso più efficiente: $e1.metadata.event_timestamp.seconds < $e2.metadata.event_timestamp.seconds.
Scopri di più sulla sintassi della sezione match e sulla sintassi della sezione condition.
Esempi: window_end e window_start
window_end < "2026-01-01T12:30:00Z"(data, ora e suffisso UTC)window_start != "2026-01-01 15:00:00+00"(con scarto da UTC)
Se il confronto non riesce, verifica che la stringa segua il formato timestamp canonico GoogleSQL.
Hop windows
Una finestra di salto crea intervalli di tempo sovrapposti in modo che gli eventi che si verificano vicino ai limiti di una finestra non vengano persi.
- Caso d'uso:ideale per i rilevamenti in cui è necessario acquisire uno scenario specifico indipendentemente da quando inizia o termina esattamente l'intervallo della finestra.
- Supporto:supportato per l'aggregazione in Ricerca e nelle dashboard.
Le query YARA-L con una sezione match utilizzano finestre di salto per correlare più eventi nel tempo. Il sistema divide l'intervallo di tempo di esecuzione della query in un insieme di finestre hop fisse e sovrapposte. Mentre specifichi la durata di queste finestre nella sezione match, il sistema definisce l'intervallo di sovrapposizione e l'allineamento delle finestre. Gli eventi vengono poi correlati all'interno di ciascuna di queste finestre predeterminate.
Scopri di più sulla sintassi della sezione match.
Esempio: finestre di hop sovrapposte per la correlazione continua
L'esempio seguente mostra una query eseguita nell'intervallo di tempo [1:00, 2:00], con una sezione match $user over 30m. Un possibile insieme di finestre di coincidenza sovrapposte generate dal sistema è [1:00, 1:30], [1:03, 1:33] e [1:06, 1:36].
Regola
rule hop_window_brute_force_example {
meta:
description = "Detects multiple failed logins within a shifting 30-minute window."
severity = "Medium"
events:
$login.metadata.event_type = "USER_LOGIN"
$login.extensions.auth.auth_status = "FAILURE"
$login.principal.user.userid = $user
match:
// This creates the overlapping windows (e.g., 1:00-1:30, 1:03-1:33)
$user over 30m
condition:
// This will trigger if 10 or more failures fall into any single 30m hop
#login >= 10
}
Cerca
metadata.event_type = "USER_LOGIN"
security_result.action = "FAIL"
principal.user.userid = $user
match:
// This creates the overlapping windows (e.g., 1:00-1:30, 1:03-1:33)
$user over 30m
```
Dashboard
metadata.event_type = "USER_LOGIN"
security_result.action = "FAIL"
principal.user.userid = $user
match:
// This creates the overlapping windows (e.g., 1:00-1:30, 1:03-1:33)
$user over 30m
Esempio: correlazione di più eventi utilizzando una finestra di hop
Il seguente esempio acquisisce gli eventi che si verificano nello stesso periodo di tempo generale:
Regola
rule hop_window_example {
meta:
description = "Detect a user with a failed login followed by a success within 30m"
events:
// Event 1: Capture failed login attempts
$fail.metadata.event_type = "USER_LOGIN"
$fail.security_result.action = "FAIL"
$fail.principal.user.userid = $user
// Event 2: Capture successful login attempts
$success.metadata.event_type = "USER_LOGIN"
$success.security_result.action = "ALLOW"
$success.principal.user.userid = $user
match:
// Correlate events for the SAME $user within a rolling 30-minute window.
$user over 30m
condition:
// Ensure both a failed ($fail) and a successful ($success) login event occurred for the same user within the 30m window.
$fail and $success
}
Cerca
// Event 1: Capture failed login attempts
metadata.event_type = "USER_LOGIN"
security_result.action = "FAIL"
principal.user.userid = $user // Assign user ID to a placeholder
// Event 2: Capture successful login attempts
metadata.event_type = "USER_LOGIN"
security_result.action = "ALLOW"
principal.user.userid = $user // Link to the same user placeholder
match:
// Correlate events for the SAME $user within a rolling 30-minute window.
$user over 30m
Dashboard
// Event 1: Capture failed login attempts
metadata.event_type = "USER_LOGIN"
security_result.action = "FAIL"
principal.user.userid = $user // Assign user ID to a placeholder
// Event 2: Capture successful login attempts
metadata.event_type = "USER_LOGIN"
security_result.action = "ALLOW"
principal.user.userid = $user // Link to the same user placeholder
match:
// Correlate events for the SAME $user within a rolling 30-minute window.
$user over 30m
Esempio: confronto della finestra di hop
Per identificare un tentativo di attacco di tipo brute force, una finestra 10m raggruppa tutti gli errori USER_LOGIN. La condizione valuta quindi se il conteggio (#e) all'interno di questo bucket specifico di 10 minuti supera la soglia.
Regola
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
condition:
#e >= 5
}
Cerca
metadata.event_type = "USER_LOGIN"
security_result.action = "FAIL"
$user = target.user.userid
match:
$user over 10m
Dashboard
metadata.event_type = "USER_LOGIN"
security_result.action = "FAIL"
$user = target.user.userid
match:
$user over 10m
Finestre a cascata
Nota:questa funzionalità non è disponibile per tutti i clienti in tutte le regioni.
Una finestra temporale sequenziale segmenta i dati in intervalli di tempo continui, non sovrapposti e di dimensioni fisse. Il timestamp di ogni evento rientra in una sola finestra. Non c'è sovrapposizione tra le finestre temporali. Ciò è in contrasto con una finestra hop o una finestra scorrevole, che possono avere intervalli di tempo sovrapposti.
Per implementare una finestra a cascata, utilizza l'operatore by nella sezione match. Le finestre temporali consecutive dividono il tempo in blocchi continui e consecutivi, ad esempio:
by 1h: crea finestre per ogni ora (ad esempio,[00:00:00-00:59:59],[01:00:00-01:59:59]).by 10m: crea finestre per ogni intervallo di 10 minuti (ad esempio,[00:00:00-00:09:59],[00:10:00-00:19:59]).
Casi d'uso comuni
Utilizza le finestre temporali quando necessario:
- Analizza gli eventi in blocchi di tempo distinti e non sovrapposti.
- Genera un solo rilevamento per una determinata entità (come definita dalle variabili di corrispondenza) all'interno di ogni intervallo di tempo fisso, indipendentemente dal numero di volte in cui si verifica l'evento.
- Conteggia le entità uniche in periodi fissi.
Comportamento di deduplicazione
Una caratteristica fondamentale delle finestre temporali è il modo in cui il motore gestisce i rilevamenti all'interno di ogni finestra per lo stesso insieme di variabili di corrispondenza:
- Una rilevazione per finestra:per un determinato insieme di valori per le variabili di corrispondenza (ad esempio, un
$useridspecifico), il motore genera al massimo una rilevazione per una singola finestra a cascata. - Priorità al primo arrivato:gli eventi inseriti per primi che soddisfano le condizioni della regola per quel set di variabili di corrispondenza all'interno di una finestra specifica attivano il rilevamento.
- Rimozione dei duplicati:gli eventi successivi che corrispondono ai criteri all'interno della stessa istanza della finestra non genereranno ulteriori rilevamenti.
Sintassi
La sintassi nella sezione match è: match: $variable by <duration>
$variableè la variabile segnaposto su cui stai eseguendo la corrispondenza.durationè un numero seguito da un'unità di tempo:m(minuto),h(ora),d(giorno).- Specifica un minimo di un minuto e un massimo di 72 ore o tre giorni.
Esempio: raggruppamento a intervallo fisso
Il seguente gruppo di regole raggruppa gli accessi per $userid in finestre non sovrapposte di 1 ora.
Regola
rule TumblingWindowExample {
meta:
description = "Example using a 1-hour tumbling window"
events:
$e.metadata.event_type = "USER_LOGIN"
$e.principal.user.userid = $userid
match:
$userid by 1h
condition:
$e
}
Cerca
metadata.event_type = "USER_LOGIN"
principal.user.userid = $userid
match:
$userid by 1h
Dashboard
metadata.event_type = "USER_LOGIN"
principal.user.userid = $userid
match:
$userid by 1h
Esempio: comportamento di rilevamento (user = "Alex")
- Evento 1: Alex esegue l'accesso alle 00:30. Questo rientra nella finestra
[00:00:00-00:59:59]. Il motore genera un rilevamento per Alex per questa finestra. - Evento 2: un altro utente, "Taylor", esegue l'accesso alle 00:45. Anche questo rientra in
[00:00:00-00:59:59], ma poiché$useridè diverso, il motore genera un rilevamento separato per Taylor. - Evento 3: Alex esegue di nuovo l'accesso alle 00:40. Rientra ancora nella finestra di
[00:00:00-00:59:59]. Poiché esiste già un rilevamento per Alex, questo evento viene deduplicato. Non viene generato alcun nuovo rilevamento. - Evento 4: Alex esegue l'accesso alle 01:20. che rientra nella finestra successiva,
[01:00:00-01:59:59]. Il motore genera un nuovo rilevamento per Alex.
Anche se l'Evento 1 e l'Evento 4 per Alex si sono verificati a meno di un'ora di distanza, rientrano in rilevamenti separati perché l'Evento 4 supera il limite della finestra fissa.
Configura le finestre temporali per i rilevamenti di assenza
Per generare un avviso in caso di conteggio pari a zero ed evitare errori del compilatore, completa i seguenti passaggi:
- Identifica l'obiettivo del rilevamento. Determina se stai cercando un'alta frequenza o una mancanza di attività.
- Seleziona la
windowparola chiave. Utilizzaoverper la frequenza ebyper l'assenza. - Limiti della finestra di riferimento. Utilizza le parole chiave
window_startewindow_endper fare riferimento a limiti specifici del bucket temporale.
Contesto:utilizza outcome: $ext_window_end = window_end per includere l'ora di fine esatta di un heartbeat mancante nei metadati dell'avviso.
Esempio: rilevare un battito cardiaco mancante con i metadati
Le finestre temporali consentono di generare avvisi in caso di conteggio pari a zero, il che ti aiuta a evitare errori del compilatore quando cerchi una mancanza di attività.
Regola
rule missing_heartbeat_detection {
meta:
description = "Alert when a system fails to check in within a 24h block"
events:
$e.metadata.event_type = "STATUS_UPDATE"
$host = $e.principal.hostname
match:
$host by 24h // Tumbling window lets you detect zero counts
outcome:
$event_count = count($e.metadata.id)
$missing_window_start = window_start
$missing_window_end = window_end
condition:
$event_count = 0 and window_start > "2026-01-01T12:30:00Z"
}
Cerca
metadata.event_type = "STATUS_UPDATE"
$host = principal.hostname
match:
$host by 24h // Tumbling window lets you detect zero counts
outcome:
$event_count = count(metadata.id)
$missing_window_start = window_start
$missing_window_end = window_end
Dashboard
metadata.event_type = "STATUS_UPDATE"
$host = principal.hostname
match:
$host by 24h // Tumbling window lets you detect zero counts
outcome:
$event_count = count(metadata.id)
$missing_window_start = window_start
$missing_window_end = window_end
Finestre scorrevoli
Una finestra mobile è ancorata a un evento pivot specifico e guarda avanti (after) o indietro (before).
Casi d'uso comuni
Utilizza finestre scorrevoli quando la sequenza degli eventi è fondamentale:
- Sequenza rigorosa:rileva una catena di attacchi (ad esempio,
e1si verifica fino a due minuti dopoe2). - Tempistica relativa:trova un evento che si verifica entro un offset specifico di un trigger (ad esempio, un
Network Connectionentro 30 secondi da unProcess Start). - Rilevamento dell'assenza:identifica quando un evento "pulizia" o "battito" richiesto non si verifica dopo un evento di inizio.
Sintassi
match: <grouping_keys> over <duration> [before|after] <$pivot_event>
| Componente | Descrizione | Esempio |
|---|---|---|
| Chiavi di raggruppamento | Campi comuni utilizzati per collegare gli eventi. | $host, $user |
| Durata | L'offset temporale rispetto all'evento pivot. | 5m, 1h, 30s |
| Direzione | Se la finestra si estende in avanti o indietro. | after, before |
| Evento pivot | La variabile evento che ancora la finestra. | $proc, $alert |
Di seguito sono riportati alcuni esempi di finestre scorrevoli valide:
$var1, $var2 over 5m after $e1$user over 1h before $e2$host, $ip over 1h before $e2
Requisiti e limitazioni
- Prestazioni: le finestre scorrevoli richiedono più potenza di elaborazione rispetto alle finestre a salto. Utilizzali solo quando l'ordine degli eventi è strettamente necessario (ad esempio, quando un evento deve verificarsi entro cinque minuti da un altro evento).
- Query su un singolo evento: non utilizzare finestre scorrevoli per la logica di un singolo evento. Utilizza più variabili evento nella sezione
condition.
Esempio: correlazione prospettica (after)
Regola
rule sliding_window_after_example {
meta:
description = "Detect a network connection occurring within 1 minute after a suspicious process launch."
severity = "High"
events:
$proc.metadata.event_type = "PROCESS_LAUNCH"
$proc.principal.hostname = $host
$net.metadata.event_type = "NETWORK_HTTP"
$net.principal.hostname = $host
match:
// $proc is the pivot; the 1-minute window starts at the $proc timestamp
$host over 1m after $proc
condition:
$proc and $net
}
Cerca
after non è supportato per la Ricerca.
Dashboard
after non è supportato per le dashboard.
Esempio: correlazione retrospettiva (before)
Utilizza una finestra scorrevole di "before" per esaminare l'attività che ha portato a un avviso specifico. Viene spesso utilizzato nell'analisi della causa principale per identificare cosa è successo immediatamente prima di un rilevamento critico.
Regola
rule sliding_window_before_example {
meta:
description = "Identify file modifications occurring in the 5 minutes before a ransomware alert."
severity = "Critical"
events:
$file.metadata.event_type = "FILE_MODIFICATION"
$file.principal.hostname = $host
$alert.metadata.event_type = "ANTIVIRUS_DETECTION"
$alert.metadata.product_name = "Premium_AV"
$alert.principal.hostname = $host
match:
// $alert is the pivot; the 5-minute window ends at the $alert timestamp
$host over 5m before $alert
condition:
$file and $alert
}
Cerca
before non è supportato per la Ricerca.
Dashboard
before non è supportato per le dashboard.
Risoluzione dei problemi
Utilizza questa sezione per comprendere la latenza, i limiti e le correzioni per i problemi comuni di finestre in YARA-L.
Latenza e limiti
Le regole che utilizzano finestre temporali (
by) vengono attivate solo alla fine del blocco di tempo fisso. Ad esempio, una regola conmatch: $user by 24hviene valutata solo dopo che è trascorso l'intero periodo di 24 ore.Latenza degli avvisi:le regole che utilizzano
by(a cascata) vengono attivate solo dopo che è trascorso il blocco di tempo fisso. Una regolaby 24hnon genera avvisi a metà finestra.Mancata corrispondenza della UI:in Ricerca e dashboard, la parola chiave
window_startsi riferisce direttamente al campoTIME_BUCKET. Quando filtri o raggruppi perwindow_start, l'intestazione della colonna viene visualizzata comeTIME_BUCKETnell'interfaccia utente.Si tratta di una limitazione nota della visualizzazione dell'interfaccia utente; la logica rimane valida.
Correzione degli errori
| Codice di errore | Descrizione | Correggi |
|---|---|---|
| Variabile non vincolata | La regola utilizza over (finestra scorrevole) con una condizione $count = 0. |
Modifica la parola chiave di raggruppamento in by (finestra mobile). Le finestre scorrevoli richiedono l'esistenza di un evento per ancorare la finestra, mentre le finestre temporali non lo richiedono. |
| UI Header Mismatch | L'utente vede TIME_BUCKET nell'interfaccia utente anziché window_start. |
Non è necessaria alcuna correzione. La logica di filtraggio e ordinamento continua a funzionare correttamente utilizzando le parole chiave. |
Identificatore sconosciuto: window_start |
La parola chiave viene utilizzata, ma non è definita alcuna finestra in match. |
Aggiungi una dichiarazione di windowing alla sezione match (ad esempio, $hostname by 1h). |
Utilizzo non valido di window_start negli eventi |
La parola chiave viene citata nella sezione events. |
Sposta la logica nella sezione condition o outcome. I limiti della finestra vengono calcolati solo dopo il raggruppamento degli eventi nella fase di corrispondenza. |
Passaggi successivi
- Libreria di riferimento delle query YARA-L 2.0
- Sintassi della sezione
match - Sintassi della sezione
condition
Hai bisogno di ulteriore assistenza? Ricevi risposte dai membri della community e dai professionisti di Google SecOps.