Condições na pesquisa e nos painéis do UDM usando a YARA-L 2.0

Compatível com:

A seção condition define critérios para incluir dados nos resultados da pesquisa. Essas condições são avaliadas em relação a variáveis de evento e marcador de posição definidas na seção events. É possível combinar essas condições usando a palavra-chave and.

Limitações

As condições na pesquisa têm as seguintes limitações:

  • Obrigatório:a seção match é obrigatória. Como alternativa, você pode definir filtros não agrupados diretamente na seção events.

  • Obrigatório: as variáveis de evento e marcador de posição precisam ser agregadas na seção condition.

  • Somente expressões de comparação de números inteiros e de ponto flutuante são compatíveis. Essas expressões precisam ter uma variável à esquerda e um número inteiro ou de ponto flutuante à direita (por exemplo, #c > 1, $port = 80). Os operadores compatíveis são <, > e =.

  • A ordem das variáveis e cláusulas na seção condition não afeta os resultados.

  • Para usar variáveis de resultado na seção condition, defina e agregue-as. É possível filtrar variáveis de resultado não agregadas na seção events.

  • Operações matemáticas diretas com variáveis não são aceitas (por exemplo, #e1 + 5 > 6, $o1.sum($pl) > 0).

  • Não há outras restrições se as condições de OR se aplicarem aos mesmos eventos de base. As seguintes restrições se aplicam quando OR é usado em diferentes eventos:

    • As comparações de não existência não são compatíveis com OR. Por exemplo, math.log($outcome1_sent_bytes) > 5 OR (#placeholder2) < 10 não é compatível.

    • Variáveis que não são da UDM não são compatíveis com cláusulas OR que abrangem eventos diferentes. No entanto, OR é compatível em um único contexto de evento ou quando agrupado com AND. Por exemplo, $entity and ($udm_event_1 or $placeholder_derived_from_udm_event_1). Confira outro exemplo: $entity and ($udm_event_1 or $outcome_udm_event_1_bytes > 1000).

Contar caractere (#)

O caractere #, quando precede um evento ou um nome de variável de marcador de posição (por exemplo, #c), representa o número de ocorrências distintas desse evento ou o número de valores distintos que atendem a todas as condições na seção events associada a essa variável. Por exemplo, #c > 1 implica que o evento ou marcador de posição c precisa ocorrer mais de uma vez.

Exemplo de consulta:

$e1.principal.hostname = $hostname
$e1.target.hostname = "fedex.com"
$e1.target.port = 3042 // tcp/udp

$e2.principal.hostname = $hostname
$e2.target.hostname = "homedepot.com"
$e2.target.port = 3042 // tcp/udp

match:
$hostname over 1h

condition:
#e1 > 0 or #e2 > 1

Caractere de valor ($)

A função do caractere $ depende do contexto.

  • Variável de resultado:quando colocado antes de um nome de variável de resultado (por exemplo, $risk_score), representa o valor da variável.

  • Evento ou variável de marcador de posição:quando colocado antes de um evento ou nome de variável de marcador de posição (por exemplo, $event), é equivalente a #event > 0 e implica que pelo menos uma ocorrência desse evento precisa existir.

Condições de evento e marcador de posição

É possível combinar vários predicados de condição para eventos e variáveis de marcador de posição usando a palavra-chave and.

Exemplo de uso de or (evento único):

condition:
  $ph2 and $ph3

Importante:ao escrever lógica nas seções events ou condition, use ! para negação. Use a palavra-chave not apenas na seção outcome.

Condições limitadas e ilimitadas

As condições de variáveis de evento podem ser limitadas ou ilimitadas.

As condições delimitadas exigem que a variável de evento associada exista. Isso significa que pelo menos uma ocorrência do evento precisa aparecer em qualquer detecção.

Exemplos:

  • $var (equivalente a #var > 0)
  • #var > n (em que n >= 0)
  • #var >= m (em que m > 0)

Exemplo de consulta:

$e1.principal.hostname = $hostname
$e1.target.hostname = "fedex.com"

match:
$hostname over 1h

condition:
#e1 > 0

Condições sem restrições permitem que a variável de evento associada não exista. Isso significa que é possível que nenhuma ocorrência do evento apareça em uma detecção. Qualquer referência a campos na variável de evento gera um valor zero. Use-os para pesquisas de não existência.

Exemplos:

  • !$var (equivalente a #var = 0)
  • #var >= 0
  • #var < n (em que n > 0)
  • #var <= m (em que m >= 0)

Exemplo de consulta:

$e1.principal.hostname = $hostname
$e1.target.hostname = "fedex.com"
$e1.target.port = 3042 // tcp/udp

match:
$hostname over 1h

outcome:
$bytes_sent = sum($e1.network.sent_bytes)

condition:
$bytes_sent >= 0

Observação:para consultas de pesquisa de não existência (usando condições ilimitadas), o mecanismo de detecção adiciona um atraso de uma hora à latência esperada.

As consultas de pesquisa com condições ilimitadas precisam atender aos seguintes critérios:

  • Pelo menos um evento da UDM precisa ter uma condição limitada, ou seja, pelo menos um evento da UDM precisa existir.

  • Os substitutos com condições ilimitadas precisam ser associados a pelo menos um evento de UDM limitado.

  • As entidades com condições ilimitadas precisam ser associadas a pelo menos um evento de UDM limitado.

Condições de resultado

É possível definir condições de resultado usando variáveis de resultado e combiná-las com operadores lógicos (and, or, not). A sintaxe de comparação depende do tipo de dados da variável de resultado.

  • Inteiro e ponto flutuante:use =, >, >=, <, <=, != (por exemplo, $risk_score > 10, $risk_score <= 5.5).
  • string:use = ou != (por exemplo, $severity = "HIGH").
  • Lista de números inteiros ou matrizes:use arrays.contains() (por exemplo, arrays.contains($event_ids, "id_1234")).

Exemplo de consulta:

$e1.principal.hostname = $hostname
$e1.target.hostname = "fedex.com"
$e1.target.port = 3042 // tcp/udp
match:
$hostname over 1h

outcome:
$bytes_sent = sum($e1.network.sent_bytes)

condition:
$e1

As condições de pesquisa UDM são compatíveis com a sintaxe "N de X", que oferece uma avaliação flexível de vários critérios. Com essa sintaxe, você especifica que uma condição é atendida se N (um número específico) de X (uma lista de expressões booleanas) for avaliado como verdadeiro.

Exemplo: considere um cenário em que você quer identificar processos que exibem vários comportamentos suspeitos, mas não necessariamente todos eles, em uma lista predefinida de tags fornecidas pelo enriquecimento do VirusTotal (VT). A sintaxe "N de X" resolve isso permitindo que você especifique um número mínimo de condições que precisam ser atendidas.

A consulta de pesquisa do UDM a seguir procura processos em que pelo menos três das condições são verdadeiras:


$e.metadata.event_type = "PROCESS_LAUNCH"
$e.target.process.file.full_path = $process

match:
    $process

outcome:
    $first_seen = earliest($e.metadata.event_timestamp)
    $last_seen = latest($e.metadata.event_timestamp)
    $total_events = count($e.metadata.id)
    // Collect all unique tags associated with this process from all its launch events
    $tags = array_distinct($e.target.process.file.tags)

condition:
    // Trigger if at least 3 of the following conditions (tag checks) are true
    3 of [
      arrays.contains($tags, "malware"),
      arrays.contains($tags, "detect-debug-environment"),
      arrays.contains($tags, "checks-disk-space"),
      arrays.contains($tags, "checks-cpu-name"),
      arrays.contains($tags, "invalid-signature"),
      arrays.contains($tags, "self-delete")
    ]

order:
    $total_events desc

Operadores ANY OF e ALL OF

ANY of [expressions] é avaliado como true se pelo menos uma das expressões booleanas listadas for true. ALL of [expressions] exige que todas as expressões listadas sejam true. Combine esses operadores com outras condições usando palavras-chave como AND.

Exemplo:


$e.metadata.event_type = "PROCESS_LAUNCH"
$e.target.process.file.full_path = $process

match:
 $process

outcome:
  $first_seen = timestamp.get_timestamp(min($e.metadata.event_timestamp.seconds))
  $last_seen = timestamp.get_timestamp(max($e.metadata.event_timestamp.seconds))
  $total = count($e.metadata.id)
  $tags = array_distinct($e.target.process.file.tags)
  $vt_first_seen_time = max(if((timestamp.current_seconds() - $e.target.process.file.first_seen_time.seconds) < 86400, 1 , 0))
  $vt_last_analysis_time = max(if((timestamp.current_seconds() - $e.target.process.file.last_analysis_time.seconds) < 86400, 1 , 0))
  $vt_last_modification_time = max(if((timestamp.current_seconds() - $e.target.process.file.last_modification_time.seconds) < 86400, 1 , 0))
  $vt_last_seen_time = max(if((timestamp.current_seconds() - $e.target.process.file.last_seen_time.seconds) < 86400, 1 , 0))

condition:
  3 of [
    arrays.contains($tags, "malware"),
    arrays.contains($tags, "detect-debug-environment"),
    arrays.contains($tags, "checks-disk-space"),
    arrays.contains($tags, "checks-cpu-name"),
    arrays.contains($tags, "invalid-signature"),
    arrays.contains($tags, "self-delete")
  ]
  and ANY of [
    $vt_first_seen_time = 1,
    $vt_last_analysis_time = 1,
    $vt_last_modification_time = 1,
    $vt_last_seen_time = 1
  ]

order:
  $total desc

unselect:
    $vt_first_seen_time,
    $vt_last_analysis_time,
    $vt_last_modification_time,
    $vt_last_seen_time

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