Limitações e problemas conhecidos da YARA-L

Este documento descreve os problemas e as limitações conhecidos do YARA-L.

Agregações de resultados com campos repetidos desaninhados

Quando uma regra se refere a um campo repetido em uma variável de evento e esse campo repetido contém mais de um elemento, cada elemento é desencapsulado em uma linha de evento separada.

Por exemplo, as duas strings de endereço IP no campo repetido target.ip no evento $e na regra a seguir são desaninhados em duas instâncias do evento $e, cada um com um elemento target.ip diferente.

rule outbound_ip_per_app {
  meta:
  events:
    $e.principal.application = $app
  match:
    $app over 10m
  outcome:
    $outbound_ip_count = count($e.target.ip) // yields 2.
  condition:
    $e
}

Registro de evento antes da eliminação de aninhamento de campo repetido

A tabela a seguir mostra o registro de evento antes da eliminação de aninhamento de campo repetido:

metadata.id principal.application target.ip
aaaaaaaaa Google SecOps [192.0.2.20, 192.0.2.28]

Registros de eventos após desaninhamento de campo repetido

A tabela a seguir mostra o registro do evento após o desaninhamento de campo repetido:

metadata.id principal.application target.ip
aaaaaaaaa Google SecOps 192.0.2.20
aaaaaaaaa Google SecOps 192.0.2.28

Quando uma regra se refere a um campo repetido que é filho de outro campo repetido, como security_results.action, o desaninhamento acontece em ambos no nível do campo pai e do filho. O conjunto resultante de instâncias desaninhar de um único evento é o produto cartesiano dos elementos no campo pai e elementos no campo filho. Na regra de exemplo a seguir, o evento $e com dois valores repetidos em security_results e dois Os valores em security_results.actions são desaninhados em quatro instâncias.

rule security_action_per_app {
  meta:
  events:
    $e.principal.application = $app
  match:
    $app over 10m
  outcome:
    $security_action_count = count($e.security_results.actions) // yields 4.
  condition:
    $e
}

Registro de evento antes do desaninhamento de campo repetido

A tabela a seguir mostra o registro de evento antes da eliminação de aninhamento de campo repetido:

metadata.id principal.application security_results
aaaaaaaaa Google SecOps [ { actions: [ ALLOW, FAIL ] }, { actions: [ CHALLENGE, BLOCK ] } ]

Registros de eventos após a eliminação de campos repetidos

A tabela a seguir mostra o registro do evento após o desaninhamento de campo repetido:

metadata.id principal.application security_results.actions
aaaaaaaaa Google SecOps PERMITIR
aaaaaaaaa Google SecOps FALHA
aaaaaaaaa Google SecOps DESAFIO
aaaaaaaaa Google SecOps BLOQUEAR

Esse comportamento de desaninhamento na avaliação de regras pode produzir agregações de resultado quando a regra faz referência a um ou mais campos repetidos com um campo pai que também é um campo repetido. Agregações não distintas como sum(), array() e count() não podem contabilizar valores duplicados em outros campos no mesmo evento produzido pelo comportamento de desaninhamento. Na regra de exemplo a seguir, o evento $e tem um único nome de host google.com, mas o resultado hostnames agrega quatro instâncias não aninhadas do mesmo evento $e, cada uma com um valor principal.hostname duplicado. Esse resultado gera quatro nomes de host em vez de um, devido à eliminação de valores repetidos em security_results.actions.

rule security_action_per_app {
  meta:
  events:
    $e.principal.application = $app
  match:
    $app over 10m
  outcome:
    $hostnames = array($e.principal.hostname) // yields 4.
    $security_action_count = count($e.security_results.action) // yields 4.
  condition:
    $e
}

Registro de evento antes do desaninhamento de campo repetido

A tabela a seguir mostra o registro de evento antes da eliminação de aninhamento de campo repetido:

metadata.id principal.application principal.hostname security_results
aaaaaaaaa Google SecOps google.com [ { action: [ ALLOW, FAIL ] }, { action: [ CHALLENGE, BLOCK ] } ]

Registro de evento após a eliminação de aninhamento de campo repetido

A tabela a seguir mostra o registro do evento após a eliminação de aninhamento de campo repetida:

metadata.id principal.application principal.hostname security_results.action
aaaaaaaaa Google SecOps google.com PERMITIR
aaaaaaaaa Google SecOps google.com FALHA
aaaaaaaaa Google SecOps google.com DESAFIO
aaaaaaaaa Google SecOps google.com BLOQUEAR

Alternativa

Agregações que ignoram ou eliminam valores duplicados não são são afetadas por esse comportamento de desaninhamento. Use a versão distinta de um agregação se você encontrar valores de resultado inesperados devido ao desaninhamento.

As agregações a seguir não são afetadas pelo comportamento de desencapsulamento descrito anteriormente.

  • max()
  • min()
  • array_distinct()
  • count_distinct()

Agregações de resultados com múltiplas variáveis de evento

Se uma regra tiver várias variáveis de evento, haverá um item separado na agregação para cada combinação de eventos incluída na detecção. Por exemplo, se a regra de exemplo a seguir for executada nos eventos listados:

events:
  $e1.field = $e2.field
  $e2.somefield = $ph

match:
  $ph over 1h

outcome:
   $some_outcome = sum(if($e1.otherfield = "value", 1, 0))

condition:
  $e1 and $e2
event1:
  // UDM event 1
  field="a"
  somefield="d"

event2:
  // UDM event 2
  field="b"
  somefield="d"

event3:
  // UDM event 3
  field="c"
  somefield="d"

A soma é calculada com base em cada combinação de eventos, permitindo que você use variáveis de evento nos cálculos do valor de resultado. Os elementos a seguir são usada no cálculo:

1: $e1 = event1, $e2 = event2
2: $e1 = event1, $e2 = event3
3: $e1 = event2, $e2 = event1
4: $e1 = event2, $e2 = event3
5: $e1 = event3, $e2 = event1
5: $e1 = event3, $e2 = event2

Isso resulta em uma soma máxima potencial de 6, mesmo que $e2 só possa correspondem a três eventos distintos.

Isso afeta soma, contagem e matriz. Para contagem e matriz, use count_distinct. ou array_distinct pode resolver o problema, mas não há uma solução alternativa para soma.

Parênteses no início de uma expressão

O uso de parênteses no início de uma expressão aciona o seguinte erro:

parsing: error with token: ")"
invalid operator in events predicate

O exemplo a seguir geraria esse tipo de erro:

($event.metadata.ingested_timestamp.seconds -
$event.metadata.event_timestamp.seconds) / 3600 > 1

As seguintes variações de sintaxe retornam o mesmo resultado, mas com uma sintaxe válida:

$event.metadata.ingested_timestamp.seconds / 3600 -
$event.metadata.event_timestamp.seconds / 3600 > 1
    1 / 3600 * ($event.metadata.ingested_timestamp.seconds -
$event.metadata.event_timestamp.seconds) > 1
    1 < ($event.metadata.ingested_timestamp.seconds -
$event.metadata.event_timestamp.seconds) / 3600

A matriz de índice no resultado exige agregação para valores únicos em um campo repetido

A indexação de matrizes na seção de resultados ainda requer agregação. Por exemplo, o seguinte não funciona:

outcome:
  $principal_user_dept = $suspicious.principal.user.department[0]

No entanto, é possível salvar a saída do índice de matriz em uma variável de marcador de posição e usar essa variável na seção de resultados, conforme mostrado aqui:

events:
  $principal_user_dept = $suspicious.principal.user.department[0]

outcome:
  $principal_user_department = $principal_user_dept

Condição OR com inexistência

Se uma condição OR for aplicada entre duas variáveis de evento separadas e se a regra corresponder à não existência, a regra será compilada, mas poderá produzir detecções de falso positivo. Por exemplo, a sintaxe de regra a seguir pode corresponder a eventos com $event_a.field = "something", mesmo que não deva.

events:
     not ($event_a.field = "something" **or** $event_b.field = "something")
condition:
     $event_a and #event_b >= 0

A solução alternativa é separar as condições em dois blocos, em que cada bloco apenas aplica o filtro a uma única variável, conforme mostrado aqui:

events:
     not ($event_a.field = "something")
     not ($event_b.field = "something")
condition:
     $event_a and #event_b >= 0

Aritmética com campos de eventos não assinados

Se você tentar usar uma constante de número inteiro em uma operação aritmética com um comando UDM campo cujo tipo seja um número inteiro não assinado, você receberá um erro. Exemplo:

events:
  $total_bytes = $e.network.received_bytes * 2

O campo udm.network.received_bytes é um número inteiro sem sinal. Isso acontece porque para constantes de número inteiro que têm como padrão números inteiros com sinal, o que não funciona com números inteiros sem assinatura em operações aritméticas.

A solução é forçar a constante de número inteiro a um ponto flutuante que funcionará pelo número inteiro não assinado. Exemplo:

events:
  $total_bytes = $e.network.received_bytes * (2/1)