Sintaxe da secção de condições

Suportado em:

Este documento descreve como pode usar a secção condition de uma consulta YARA-L. A secção condition é usada na pesquisa, nos painéis de controlo e é necessária para as regras, além de conter lógica para filtrar ainda mais os resultados. Quando usado numa pesquisa ou numa consulta de painel de controlo, só mostra resultados que cumprem as condições. Quando usadas numa regra de deteção, as condições têm de ser cumpridas para acionar um alerta.

Na secção condition, pode usar operadores booleanos, operadores de comparação e resultados de variáveis outcome para determinar se a consulta deve ser acionada.

Defina a secção condition

Defina as expressões de condições para eventos e variáveis de marcadores de posição na secção condition. Também pode especificar uma condição de correspondência para eventos e marcadores de posição definidos na secção events e, opcionalmente, usar a palavra-chave and para especificar uma condição de correspondência usando variáveis de resultado definidas na secção outcome. Consulte a sintaxe da secção de resultados.

Pode juntar as expressões usando as palavras-chave and ou or:

  • Use and entre quaisquer condições.

  • Use or apenas quando a consulta contiver uma única variável de evento.

Use o caráter # na secção condition antes de qualquer evento ou nome de variável de marcador de posição para representar o número de eventos ou valores distintos que satisfazem todas as condições na secção events. Por exemplo:

#c > 1 significa que a variável c tem de ocorrer mais de 1 vez.

Use o caráter $ na secção condition antes de qualquer nome de variável de resultado para representar o valor desse resultado. Se for usado antes de qualquer evento ou nome de variável de marcador de posição (por exemplo, $event), representa #event > 0.

Este exemplo de regra devolve uma deteção quando existem mais de cinco (conforme definido na secção condition) inícios de sessão com falhas para cada utilizador num período de 10 minutos (conforme definido na secção 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
}

Condições limitadas e ilimitadas

Pode usar condições delimitadas ou não delimitadas numa consulta:

  • As condições delimitadas forçam a existência da variável de evento associada, o que significa que, pelo menos, uma ocorrência do evento tem de aparecer na deteção. Seguem-se as condições delimitadas:

    $var // equivalent to #var > 0

    #var > n // where n >= 0

    #var >= m // where m > 0

  • As condições ilimitadas podem ser usadas para detetar a ausência de um evento durante um período; por exemplo, um evento de ameaça sem um evento de mitigação num período de 10 minutos. As condições ilimitadas permitem que a variável de evento associada não exista (consultas de não existência), o que significa que é possível que não apareça nenhuma ocorrência do evento numa deteção e que qualquer referência a campos na variável de evento produza um valor zero.

    Seguem-se as condições ilimitadas:

    !$var // equivalent to #var = 0

    #var >= 0

    #var < n // where n > 0

    #var <= m // where m >= 0

Requisitos para consultas de não existência

Para que uma consulta de não existência seja compilada, tem de cumprir os seguintes requisitos:

  • Pelo menos, um evento UDM tem de ter uma condição limitada (ou seja, tem de existir, pelo menos, um evento UDM).
  • Se um marcador de posição tiver uma condição ilimitada, tem de estar associado, pelo menos, a um evento de UDM limitado.
  • Se uma entidade tiver uma condição ilimitada, tem de estar associada, pelo menos, a um evento de DUA limitado.

Exemplo: consulta de não existência

Considere a seguinte consulta com a secção de condições omitida:

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
}

Secção de condição válida

Seguem-se exemplos válidos para a secção de condições:

  • $u1 and !$u2 and $e1 and $e2
    • Todos os eventos e entidades da UDM estão presentes na secção de condições.
    • Pelo menos, um evento da UDM está limitado.
  • $u1 and !$u2 and $e1 and !$e2
    • $e2 não tem limites e é permitido porque está associado a $u1, que tem limites. Se $e2 não estivesse associado a $u1, este campo seria inválido.
  • #port > 50 and #ip = 0
    • Não estão presentes eventos nem entidades do UDM na secção de condições. No entanto, os marcadores de posição presentes abrangem todos os eventos e entidades do UDM.
    • $ip está atribuído a $u1 e $u2, e #ip = 0 é uma condição ilimitada. No entanto, as condições delimitadas são mais fortes do que as condições não delimitadas. Uma vez que $port está atribuído a $u1 e #port > 50 é uma condição limitada, $u1 continua limitado.

Secção de condição inválida

Seguem-se exemplos inválidos para a secção de condições:

  • $u1 and $e1
    • Todos os eventos e entidades UDM apresentados na secção events têm de ser apresentados na secção condition (ou ter um marcador de posição atribuído que seja apresentado na secção condition).
  • $u1, $u2, $e1, $u2, #port > 50
    • Não são permitidas vírgulas como separadores de condições.
  • !$u1 and !$u2 and $e1 and $e2
    • Viola o primeiro requisito de que, pelo menos, um evento de UDM está limitado.
  • ($u1 or #port < 50) and $u2 and $e1 and $e2
    • A palavra-chave or não é suportada com condições ilimitadas.
  • ($u1 or $u2) and $e1 and $e2
    • A palavra-chave or não é suportada entre diferentes variáveis de eventos.
  • not $u1 and $u2 and $e1 and $e2
    • A palavra-chave not não é permitida para condições de eventos e marcadores de posição.
  • #port < 50 and #ip = 0
    • Embora os marcadores de posição façam referência a todos os eventos e entidades do UDM, todas as condições associadas não têm limites. Isto significa que nenhum dos eventos de UDM está delimitado, o que faz com que a regra não seja compilada.

Condições de resultados

Pode incluir condições para variáveis de resultados na secção condition, unidas pela palavra-chave and ou or, ou precedidas pela palavra-chave not.

As condições de resultados são especificadas de forma diferente consoante o tipo de variável de resultado:

  • integer: compare com um literal inteiro com operadores =, >, >=, <, <=, != Por exemplo: $risk_score > 10

  • float: compare com um literal float com operadores =, >, >=, <, <=, != Por exemplo: $risk_score <= 5.5

  • string: compare com um literal de string com = ou != Por exemplo: $severity = "HIGH"

  • lista de números inteiros ou matrizes: especifique a condição através da função arrays.contains Por exemplo: arrays.contains($event_ids, "id_1234")

Se especificar uma condição de resultado numa consulta que tenha uma secção match, a consulta é classificada como uma consulta de vários eventos para a quota de consultas. Consulte a sintaxe de correspondência para mais informações sobre classificações de eventos únicos e múltiplos.

Restrições

  • Evite usar uma variável match na secção condition. É um erro semântico porque os eventos são agrupados pelo valor da variável match.

  • Evite especificar apenas condições ilimitadas em todas as variáveis event às quais uma variável match está atribuída. É um erro semântico. Para ser devolvido um valor de variável match, tem de existir, pelo menos, um evento que contenha o valor.

  • Se usar uma janela deslizante, a variável do evento principal tem de estar envolvida em, pelo menos, uma condição delimitada.

O que se segue?

Informações adicionais

Precisa de mais ajuda? Receba respostas de membros da comunidade e profissionais da Google SecOps.