Sintassi della sezione Condizione

Supportato in:

Questo documento descrive come utilizzare la sezione condition di una query YARA-L 2.0.

L'impatto della sezione condition dipende dall'esecuzione di una query ad hoc o dall'implementazione di una regola persistente, come segue:

  • Per la ricerca e i dashboard: funge da post-filtro, restituendo e visualizzando solo i record che soddisfano le espressioni specificate.
  • Regole di rilevamento (obbligatorie): fungono da logica di attivazione. Un avviso viene attivato solo se le condizioni restituiscono true per un determinato intervallo di match.

Utilizza la sezione condition per definire le espressioni che filtrano gli eventi e le variabili segnaposto. Se utilizzato in una query di ricerca o in una query del 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 i risultati delle variabili outcome per determinare se la query deve attivarsi.

Definisci la sezione condition

Definisci le espressioni delle condizioni per gli eventi e le variabili segnaposto dalla sezione condition. Puoi specificare le condizioni match per le variabili nella sezione events e, facoltativamente, utilizzare la parola chiave and per includere la logica in base alla sezione outcome. Per maggiori dettagli, vedi la sintassi della sezione Outcome.

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 (come definito nella sezione condition) tentativi di accesso non riusciti per ogni utente in un periodo 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 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 senza limiti:

    !$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 senza limiti, deve essere associato ad almeno un evento UDM con limiti.
  • 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 delle condizioni 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 multievento 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.