Panoramica del linguaggio YARA-L 2.0

YARA-L 2.0 è un linguaggio di computer utilizzato per creare regole di ricerca tramite i dati di log aziendali man mano che vengono importati nel tuo account Chronicle. La sintassi YARA-L deriva dalla lingua YARA sviluppata da VirusTotal. Il linguaggio funziona in combinazione con il motore di rilevamento di Chronicle e consente di individuare minacce e altri eventi su grandi volumi di dati. Vedi anche Sintassi della lingua YARA-L 2.0

Regole di esempio per YARA-L 2.0

I seguenti esempi mostrano le regole scritte in YARA-L 2.0. Ciascun esempio dimostra come correlare gli eventi nella lingua della regola.

Accessi da città diverse

La seguente regola cerca gli utenti che hanno eseguito l'accesso alla tua azienda da due o più città in meno di cinque minuti:

rule DifferentCityLogin {
  meta:

  events:
    $udm.metadata.event_type = "USER_LOGIN"
    $udm.principal.user.userid = $user
    $udm.principal.location.city = $city

  match:
    $user over 5m

  condition:
    $udm and #city > 1
}

Variabile di corrispondenza: $user

Variabile evento:$udm

Variabile segnaposto: $city e $user

Di seguito viene descritto il funzionamento della regola:

  • Raggruppa gli eventi con nome utente ($user) e la restituisce ($user) quando viene trovata una corrispondenza.
  • L'intervallo di tempo è 5 minuti, il che significa che solo gli eventi che durano meno di 5 minuti sono correlati.
  • Ricerca di un gruppo di eventi ($udm) il cui tipo di evento è USER_LOGIN.
  • Per quel gruppo di eventi, la regola chiama l'ID utente $user e la città di accesso come $city..
  • Restituisce una corrispondenza se il numero distinto di valori $city è maggiore di 1 nel gruppo di eventi ($udm) nell'intervallo di tempo di 5 minuti.

Creazione ed eliminazione rapida degli utenti

La seguente regola cerca gli utenti che sono stati creati ed eliminati entro 4 ore:

rule UserCreationThenDeletion {
  meta:

  events:
    $create.target.user.userid = $user
    $create.metadata.event_type = "USER_CREATION"

    $delete.target.user.userid = $user
    $delete.metadata.event_type = "USER_DELETION"

    $create.metadata.event_timestamp.seconds <=
       $delete.metadata.event_timestamp.seconds

  match:
    $user over 4h

  condition:
    $create and $delete
}

Variabili evento:$create e $delete

Variabile di corrispondenza: $user

Variabile segnaposto: N/D

Di seguito viene descritto il funzionamento della regola:

  • Raggruppa gli eventi con nome utente ($user) e la restituisce ($user) quando viene trovata una corrispondenza.
  • La finestra temporale è di 4 ore, il che significa che solo gli eventi separati da meno di 4 ore sono correlati.
  • Cerca due gruppi di eventi ($create e $delete, dove $create equivale a #create >= 1).
  • $create corrisponde a USER_CREATION eventi e chiama l'ID utente come $user.
  • $user viene utilizzato per unire i due gruppi di eventi.
  • $delete corrisponde a USER_DELETION eventi e chiama l'ID utente come $user. Questa regola cerca una corrispondenza in cui l'identificatore utente nei due gruppi di eventi è lo stesso.
  • Questa regola cerca i casi in cui l'evento di $delete si verifica successivamente all'evento di $create e restituisce una corrispondenza quando viene rilevata.

Regola per singolo evento

Le regole per un singolo evento sono regole correlate a un singolo evento. Una singola regola di evento può essere:

  • Qualsiasi regola senza sezione corrispondente.
  • Regola con una sezione di corrispondenza e una sezione di condizioni che verificano solo l'esistenza di un evento (ad esempio, "$e", "#e > 0", "#e >= 1", "1 <= #e", "0 < #e&quot).

Ad esempio, la seguente regola cerca semplicemente un evento di accesso utente e restituisce la prima che rileva all'interno dei dati aziendali memorizzati nel tuo account Chronicle:

rule SingleEventRule {
  meta:
    author = "noone@altostrat.com"

  events:
    $e.metadata.event_type = "USER_LOGIN"

  condition:
    $e
}

Ecco un altro esempio di singola regola evento con una sezione Corrispondenza. Questa regola cerca un utente che ha eseguito l'accesso almeno una volta in meno di 5 minuti. controllando la semplice esistenza di un evento di accesso dell'utente.

rule SingleEventRule {
  meta:
    author = "noone@google.com"
    description = "windowed single event example rule"

  events:
    $e.metadata.event_type = "USER_LOGIN"
    $e.principal.user.userid = $user

  match:
    $user over 5m

  condition:
    #e > 0
}

Regola per più eventi

Utilizza più regole relative agli eventi per raggruppare molti eventi in un determinato periodo di tempo e prova a trovare correlazioni tra eventi. Una tipica regola per più eventi presenta quanto segue:

  • Sezione corrispondente che specifica l'intervallo di tempo in cui gli eventi devono essere raggruppati.
  • Sezione Condizione che specifica quale condizione deve attivare il rilevamento e il controllo dell'esistenza di più eventi.

Ad esempio, la seguente regola cerca un utente che ha eseguito l'accesso almeno 10 volte in meno di 10 minuti:

rule MultiEventRule {
  meta:
    author = "noone@altostrat.com"

  events:
    $e.metadata.event_type = "USER_LOGIN"
    $e.principal.user.userid = $user

  match:
    $user over 10m

  condition:
    #e >= 10
}

Evento singolo entro un intervallo di indirizzi IP

L'esempio seguente mostra una singola regola di evento che cerca una corrispondenza tra due utenti specifici e un intervallo specifico di indirizzi IP:

rule OrsAndNetworkRange {
  meta:
    author = "noone@altostrat.com"

  events:
    // Checks CIDR ranges.
    net.ip_in_range_cidr($e.principal.ip, "203.0.113.0/24")

    // Detection when the hostname field matches either value using or.
    $e.principal.hostname = /pbateman/ or $e.principal.hostname = /sspade/

  condition:
    $e
}

esempio di tutte le regole

La seguente regola cerca eventi di accesso in cui tutti gli indirizzi IP di origine non corrispondono a un indirizzo IP noto per essere protetto entro un intervallo di tempo di 5 minuti.

rule SuspiciousIPLogins {
  meta:
    author = "noone@google.com"

  events:
    $e.metadata.event_type = "USER_LOGIN"

    // Detects if all source IP addresses in an event do not match "100.97.16.0"
    // For example, if an event has source IP addresses
    // ["100.97.16.1", "100.97.16.2", "100.97.16.3"],
    // it will be detected since "100.97.16.1", "100.97.16.2",
    // and "100.97.16.3" all do not match "100.97.16.0".

    all $e.principal.ip != "100.97.16.0"

    // Assigns placeholder variable $ip to the $e.principal.ip repeated field.
    // There will be one detection per source IP address.
    // For example, if an event has source IP addresses
    // ["100.97.16.1", "100.97.16.2", "100.97.16.3"],
    // there will be one detection per address.

    $e.principal.ip = $ip

  match:
    $ip over 5m

  condition:
    $e
}

Espressioni regolari in una regola

Il seguente esempio di espressione regolare YARA-L 2.0 cerca eventi con email ricevute dal dominio altostrat.com. Poiché nocase è stato aggiunto al confronto della variabile $host regex e alla funzione regex, entrambi i confronti non fanno distinzione tra maiuscole e minuscole.

rule RegexRuleExample {
  meta:
    author = "noone@altostrat.com"

  events:
    $e.principal.hostname = $host
    $host = /.*HoSt.*/ nocase
    re.regex($e.network.email.from, `.*altostrat\.com`) nocase

  match:
    $host over 10m

  condition:
    #e > 10
}

Esempio di regola per la finestra a scorrimento

Il seguente esempio di finestra scorrevole YARA-L 2.0 cerca l'assenza di eventi firewall_2 dopo gli eventi firewall_1. La parola chiave after viene utilizzata con la variabile evento pivot $e1 per specificare che devono essere verificati solo 10 minuti di finestre dopo ogni evento firewall_1 durante la correlazione degli eventi.

rule SlidingWindowRuleExample {
  meta:
    author = "noone@google.com"

  events:
    $e1.metadata.product_name = "firewall_1"
    $e1.principal.hostname = $host

    $e2.metadata.product_name = "firewall_2"
    $e2.principal.hostname = $host

  match:
    $host over 10m after $e1

  condition:
    $e1 and !$e2
}

Esempio di esclusione del valore zero

Se la regola non specifica opzioni allow_zero_values, nessun valore viene restituito dai valori delle variabili di corrispondenza. Tuttavia, per altri campi evento a cui viene fatto riferimento, i valori zero non vengono esclusi a meno che non specifichi esplicitamente tali condizioni. Per ulteriori dettagli, fai clic qui.

rule ExcludeZeroValues {
  meta:
    author = "noone@google.com"

  events:
    $e1.metadata.event_type = "NETWORK_DNS"
    $e1.principal.hostname = $hostname

    // $e1.principal.user.userid may be empty string.
    $e1.principal.user.userid != "Guest"

    $e2.metadata.event_type = "NETWORK_HTTP"
    $e2.principal.hostname = $hostname

    // $e2.target.asset_id cannot be empty string as explicitly specified.
    $e2.target.asset_id != ""

  match:
    // $hostname cannot be empty string.
    $hostname over 1h

  condition:
    $e1 and $e2
}

Esempio di regola con sezione dei risultati

Puoi aggiungere la sezione outcome facoltativa nella regola YARA-L 2.0 per estrarre ulteriori informazioni su ogni rilevamento. Puoi trovare la sintassi di questa sezione e la relativa panoramica su come utilizzarla.

Regola per più eventi con sezione dei risultati:

rule OutcomeRuleMultiEvent {
    meta:
      author = "noone@google.com"
    events:
      $u.udm.principal.hostname = $hostname
      $asset_context.graph.entity.hostname = $hostname

      $severity = $asset_context.graph.entity.asset.vulnerabilities.severity

    match:
      $hostname over 5m

    outcome:
      $risk_score =
        max(
            100
          + if($hostname = "my-hostname", 100, 50)
          + if($severity = "HIGH", 10)
          + if($severity = "MEDIUM", 5)
          + if($severity = "LOW", 1)
        )

      $asset_id_list =
        array(
          if($u.principal.asset_id = "",
             "Empty asset id",
             $u.principal.asset_id
          )
        )

      $asset_id_distinct_list = array_distinct($u.principal.asset_id)

      $asset_id_count = count($u.principal.asset_id)

      $asset_id_distinct_count = count_distinct($u.principal.asset_id)

    condition:
      $u and $asset_context
}

Regola per evento singolo con sezione dei risultati:

rule OutcomeRuleSingleEvent {
    meta:
        author = "noone@google.com"
    events:
        $u.metadata.event_type = "FILE_COPY"
        $u.principal.file.size = $file_size
        $u.principal.hostname = $hostname

    outcome:
        $suspicious_host = $hostname
        $severity_tag = if($file_size > 1024, "SEVERE", "MODERATE")

    condition:
        $u
}