Condizioni nella ricerca UDM e nelle dashboard che utilizzano YARA-L 2.0

Supportato in:

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 sezione events.

  • 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 sezione events.

  • 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. Quando OR 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 con AND. 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 (dove n >= 0)
  • #var >= m (dove m > 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 (dove n > 0)
  • #var <= m (dove m >= 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

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.