Condições na pesquisa e nos painéis de controlo do UDM com o YARA-L 2.0

Compatível com:

A secção condition define critérios para incluir dados nos resultados da pesquisa. Estas condições são avaliadas em função das variáveis de evento e de marcadores de posição definidas na secção events. Pode combinar estas condições usando a palavra-chave and.

Limitações

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

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

  • Obrigatório: as variáveis de evento e de marcador de posição têm de ser agregadas na secção condition.

  • Apenas são suportadas expressões de comparação de números inteiros e de ponto flutuante. Estas expressões têm de ter uma variável à esquerda e um número inteiro ou um número de vírgula flutuante à direita (por exemplo, #c > 1, $port = 80). Os operadores suportados são <, > e =.

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

  • Para usar variáveis de resultados na secção condition, defina-as e agregue-as. Pode filtrar variáveis de resultados não agregadas na secção events.

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

  • Não existem restrições adicionais se as condições OR se aplicarem aos mesmos eventos base. Aplicam-se as seguintes restrições quando o parâmetro OR é usado em diferentes eventos:

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

    • As variáveis não UDM não são suportadas em cláusulas OR que abrangem diferentes eventos. No entanto, OR é suportado num contexto de evento único ou quando agrupado com AND. Por exemplo, $entity and ($udm_event_1 or $placeholder_derived_from_udm_event_1). Segue-se outro exemplo: $entity and ($udm_event_1 or $outcome_udm_event_1_bytes > 1000).

Contagem de carateres (#)

O caráter #, 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 satisfazem todas as condições na secção events associada a essa variável. Por exemplo, #c > 1 implica que o evento ou o marcador de posição c tem de ocorrer mais do que uma vez.

Consulta de exemplo:

$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

Caráter de valor ($)

A função do caráter $ depende do contexto.

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

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

Condições de eventos e marcadores de posição

Pode combinar vários predicados de condições para eventos e variáveis de marcadores de posição usando a palavra-chave and.

Exemplo de utilização de or (evento único):

condition:
  $ph2 and $ph3

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

Condições delimitadas e não delimitadas

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

As condições delimitadas requerem a existência da variável de evento associada. Isto significa que, em qualquer deteção, tem de aparecer, pelo menos, uma ocorrência do evento.

Exemplos:

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

Consulta de exemplo:

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

match:
$hostname over 1h

condition:
#e1 > 0

As condições não delimitadas permitem que a variável de evento associada não exista. Isto significa que é possível que nenhuma ocorrência do evento apareça numa deteção. Qualquer referência a campos na variável de evento produz um valor zero. Use estes para pesquisas de não existência.

Exemplos:

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

Consulta de exemplo:

$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

Nota: para consultas de pesquisa de não existência (com condições ilimitadas), o motor de deteção adiciona um atraso de 1 hora à latência esperada.

As consultas de pesquisa com condições ilimitadas têm de cumprir os seguintes critérios:

  • Pelo menos, um evento de UDM tem de ter uma condição delimitada, ou seja, tem de existir, pelo menos, um evento de UDM.

  • Os marcadores de posição com condições ilimitadas têm de estar associados a, pelo menos, um evento de UDM limitado.

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

Condições de resultados

Pode definir condições de resultados usando variáveis de resultados 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.

  • integer e float: 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 da UDM suportam a sintaxe "N de X", que oferece uma avaliação flexível de vários critérios. Esta sintaxe permite especificar que uma condição é cumprida 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 quer identificar processos que apresentem vários comportamentos suspeitos, mas não necessariamente todos, a partir de uma lista predefinida de etiquetas fornecidas pelo enriquecimento do VirusTotal (VT). A sintaxe "N de X" resolve este problema, permitindo-lhe especificar um número mínimo de condições que têm de ser cumpridas.

A seguinte consulta de pesquisa da UDM 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] avalia true se, pelo menos, uma das expressões booleanas indicadas for true. ALL of [expressions] requer que todas as expressões listadas sejam true. Combine estes 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 da Google SecOps.