Sintaxe da seção de condição

Compatível com:

Este documento descreve como usar a seção condition de uma consulta YARA-L. A seção condition é usada na pesquisa e nos painéis. Ela é obrigatória para regras e contém lógica para filtrar ainda mais os resultados. Quando usado em uma pesquisa ou consulta de painel, ele mostra apenas a saída que atende às condições. Quando usadas em uma regra de detecção, as condições precisam ser atendidas para acionar um alerta.

Na seção condition, é possível usar operadores booleanos e de comparação, além de resultados de variáveis outcome, para determinar se a consulta deve ser acionada.

Definir a seção condition

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

É possível unir as expressões usando as palavras-chave and ou or:

  • Use and entre as condições.

  • Use or somente quando a consulta tiver uma única variável de evento.

Use o caractere # na seçã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 atendem a todas as condições na seção events. Exemplo:

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

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

Este exemplo de regra retorna uma detecção quando há mais de cinco (conforme definido na seção condition) falhas de login para cada usuário em um período de 10 minutos (conforme definido na seçã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

É possível usar condições limitadas ou ilimitadas em uma 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 precisa aparecer na detecção. Estas são as condições delimitadas:

    $var // equivalent to #var > 0

    #var > n // where n >= 0

    #var >= m // where m > 0

  • As condições sem limites podem ser usadas para detectar a ausência de um evento por um período. Por exemplo, um evento de ameaça sem um evento de mitigação em um período de 10 minutos. As condições sem restrições permitem que a variável de evento associada não exista (consultas de não existência), o que significa que é possível que nenhuma ocorrência do evento apareça em uma detecção e que qualquer referência a campos na variável de evento gere um valor zero.

    As seguintes são condições sem restrições:

    !$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, ela precisa atender aos seguintes requisitos:

  • Pelo menos um evento da UDM precisa ter uma condição limitada (ou seja, pelo menos um evento da UDM precisa existir).
  • Se um marcador de posição tiver uma condição sem restrições, ele precisará estar associado a pelo menos um evento UDM com restrições.
  • Se uma entidade tiver uma condição sem restrições, ela precisará ser associada a pelo menos um evento UDM com restrições.

Exemplo: consulta de não existência

Considere a seguinte consulta com a seção de condição 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
}

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

Confira a seguir exemplos válidos para a seção de condição:

  • $u1 and !$u2 and $e1 and $e2
    • Todos os eventos e entidades da UDM estão presentes na seção de condição.
    • Pelo menos um evento da UDM está vinculado.
  • $u1 and !$u2 and $e1 and !$e2
    • $e2é ilimitado e permitido porque está associado a $u1, que é limitado. Se $e2 não estivesse associado a $u1, isso seria inválido.
  • #port > 50 and #ip = 0
    • Nenhum evento e entidade da UDM está presente na seção de condição. No entanto, os marcadores de posição presentes abrangem todos os eventos e entidades da UDM.
    • $ip é atribuído a $u1 e $u2, e #ip = 0 é uma condição sem restrições. No entanto, as condições limitadas são mais fortes do que as ilimitadas. Como $port é atribuído a $u1 e #port > 50 é uma condição limitada, $u1 ainda é limitado.

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

Confira a seguir exemplos inválidos para a seção de condição:

  • $u1 and $e1
    • Todos os eventos e entidades da UDM que aparecem na seção events também precisam aparecer na seção condition ou ter um marcador de posição atribuído a eles que apareça na seção condition.
  • $u1, $u2, $e1, $u2, #port > 50
    • Não é permitido usar vírgulas como separadores de condição.
  • !$u1 and !$u2 and $e1 and $e2
    • Viola o primeiro requisito de que pelo menos um evento da UDM seja limitado.
  • ($u1 or #port < 50) and $u2 and $e1 and $e2
    • A palavra-chave or não é compatível com condições sem restrições.
  • ($u1 or $u2) and $e1 and $e2
    • A palavra-chave or não é compatível entre diferentes variáveis de evento.
  • not $u1 and $u2 and $e1 and $e2
    • A palavra-chave not não é permitida para condições de evento e marcador de posição.
  • #port < 50 and #ip = 0
    • Embora os marcadores de posição façam referência a todos os eventos e entidades da UDM, todas as condições associadas são ilimitadas. Isso significa que nenhum dos eventos de UDM está limitado, fazendo com que a regra não seja compilada.

Condições de resultado

É possível incluir condições para variáveis de resultado na seção condition, unidas com a palavra-chave and ou or, ou precedidas pela palavra-chave not.

As condições de resultado são especificadas de maneira diferente, dependendo do tipo de variável de resultado:

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

  • float: compare com um literal de ponto flutuante usando os operadores =, >, >=, <, <=, != Por exemplo: $risk_score <= 5.5

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

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

Se você especificar uma condição de resultado em uma consulta que tenha uma seção match, ela será classificada como uma consulta de vários eventos para a cota 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 seção condition. É um erro semântico porque os eventos são agrupados pelo valor da variável match.

  • Evite especificar apenas condições sem restrições em todas as variáveis event a que uma variável match é atribuída. É um erro semântico. Para que um valor de variável match seja retornado, é preciso que haja pelo menos um evento com esse valor.

  • Se você usar uma janela deslizante, a variável de evento de pivô precisará estar envolvida em pelo menos uma condição limitada.

A seguir

Informações adicionais

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