Sintassi della sezione Condizione

Supportato in:

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 and tra le condizioni.

  • Utilizza or solo 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 > 0

  • Le 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
    • $e2 non è limitato ed è consentito perché è associato a $u1, che è limitato. Se $e2 non 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 $u1 che a $u2 e #ip = 0 è una condizione senza limiti. Tuttavia, le condizioni delimitate sono più forti di quelle illimitate. Poiché $port è assegnato a $u1 e #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 events deve essere visualizzato nella sezione condition (o deve avere un segnaposto assegnato che viene visualizzato nella sezione condition).
  • $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 or non è supportata con condizioni illimitate.
  • ($u1 or $u2) and $e1 and $e2
    • La parola chiave or non è supportata tra diverse variabili evento.
  • not $u1 and $u2 and $e1 and $e2
    • La parola chiave not non è 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 > 10

  • float: confronta con un valore letterale float con gli operatori =, >, >=, <, <=, != Ad esempio: $risk_score <= 5.5

  • string: 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.contains Ad 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 match nella sezione condition. Si tratta di un errore semantico perché gli eventi sono raggruppati in base al valore della variabile match.

  • Evita di specificare solo condizioni senza limiti per tutte le variabili event a cui è assegnata una variabile match. Si tratta di un errore semantico. Affinché venga restituito un valore della variabile match, 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

Hai bisogno di ulteriore assistenza? Ricevi risposte dai membri della community e dai professionisti di Google SecOps.