Limitaciones y problemas conocidos de YARA-L

En este documento se describen los problemas conocidos y las limitaciones de YARA-L.

Agregaciones de resultados con desanidación de campos repetidos

Cuando una regla hace referencia a un campo repetido en una variable de evento con varios elementos, cada elemento se divide en una fila de evento independiente.

Por ejemplo, las dos direcciones IP del campo repetido target.ip del evento $e se dividen en dos instancias de $e, cada una con un valor de 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 eventos antes de anidar campos repetidos

En la tabla siguiente se muestra el registro de eventos antes de anidar el campo repetido:

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

Registros de eventos después de anular el anidamiento del campo repetido

En la tabla siguiente se muestra el registro de eventos después de anular el anidamiento del campo repetido:

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

Cuando una regla hace referencia a un campo repetido anidado en otro, como security_results.action, el desanidamiento se produce tanto en el nivel superior como en el secundario. Las instancias resultantes de la desanidación de un solo evento forman un producto cartesiano de los elementos de los campos superior y secundario. En la siguiente regla de ejemplo, el evento $e con dos valores repetidos en security_results y dos valores repetidos en security_results.actions se desanida en cuatro instancias.

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 eventos antes de anidar campos repetidos

En la tabla siguiente se muestra el registro de eventos antes de anidar el campo repetido:

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

Registros de eventos después de desanidar campos repetidos

En la tabla siguiente se muestra el registro de eventos después de anular el anidamiento del campo repetido:

metadata.id principal.application security_results.actions
aaaaaaaaa Google SecOps PERMITIR
aaaaaaaaa Google SecOps FAIL
aaaaaaaaa Google SecOps CHALLENGE
aaaaaaaaa Google SecOps BLOQUEAR

Este comportamiento de desanidación en la evaluación de reglas puede producir agregaciones de resultados inesperadas cuando la regla hace referencia a uno o varios campos repetidos con un campo principal que también es un campo repetido. Las agregaciones no distintas, como sum(), array() y count(), no pueden tener en cuenta los valores duplicados de otros campos del mismo evento producidos por el comportamiento de desanidación. En la siguiente regla de ejemplo, el evento $e tiene un solo nombre de host google.com, pero el resultado hostnames agrega cuatro instancias sin anidar del mismo evento $e, cada una con un valor principal.hostname duplicado. Como resultado, se obtienen cuatro nombres de host en lugar de uno debido a la desanidación de los valores repetidos en 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 eventos antes de anidar campos repetidos

En la tabla siguiente se muestra el registro de eventos antes de anidar el campo repetido:

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

Registro de eventos después de desanidar un campo repetido

En la tabla siguiente se muestra el registro de eventos después de anular el anidamiento del campo repetido:

metadata.id principal.application principal.hostname security_results.action
aaaaaaaaa Google SecOps google.com PERMITIR
aaaaaaaaa Google SecOps google.com FAIL
aaaaaaaaa Google SecOps google.com CHALLENGE
aaaaaaaaa Google SecOps google.com BLOQUEAR

Solución

Las agregaciones que ignoran o eliminan los valores duplicados no se ven afectadas por este comportamiento de desanidación. Usa la versión distinta de una agregación si obtienes valores inesperados debido a la anidación.

Las siguientes agregaciones no se ven afectadas por el comportamiento de desanidación descrito anteriormente.

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

Agregaciones de resultados con varias variables de evento

Si una regla contiene varias variables de evento, habrá un elemento independiente en la agregación para cada combinación de eventos que se incluya en la detección. Por ejemplo, si se ejecuta la siguiente regla de ejemplo en los eventos enumerados:

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"

La suma se calcula en todas las combinaciones de eventos, lo que le permite usar ambas variables de evento en los cálculos del valor del resultado. En el cálculo se utilizan los siguientes elementos:

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

Esto da como resultado una suma máxima potencial de 6, aunque $e2 solo puede corresponder a 3 eventos distintos.

Esto afecta a la suma, el recuento y la matriz. En el caso de los recuentos y las matrices, se puede solucionar el problema usando count_distinct o array_distinct, pero no hay ninguna solución alternativa para las sumas.

Paréntesis al principio de una expresión

Si se usan paréntesis al principio de una expresión, se produce el siguiente error:

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

En el siguiente ejemplo se generaría este tipo de error:

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

Las siguientes variaciones de sintaxis devuelven el mismo resultado, pero con una sintaxis 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

La matriz de índice del resultado requiere una agregación para los valores únicos de un campo repetido

La indexación de arrays en la sección de resultados sigue requiriendo agregación. Por ejemplo, no funciona lo siguiente:

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

Sin embargo, puedes guardar la salida del índice de la matriz en una variable de marcador de posición y usarla en la sección de resultados, como se muestra a continuación:

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

outcome:
  $principal_user_department = $principal_user_dept

Condición OR con no existencia

Si se aplica una condición OR entre dos variables de evento independientes y la regla coincide con la no existencia, la regla se compila correctamente, pero puede producir detecciones falsas positivas. Por ejemplo, la siguiente sintaxis de regla puede coincidir con eventos que tengan $event_a.field = "something", aunque no debería.

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

La solución alternativa consiste en separar las condiciones en dos bloques, de forma que cada bloque solo aplique el filtro a una variable, como se muestra a continuación:

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

Aritmética con campos de eventos sin signo

Si intentas usar una constante entera en una operación aritmética con un campo de UDM cuyo tipo sea un entero sin signo, se producirá un error. Por ejemplo:

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

El campo udm.network.received_bytes es un número entero sin signo. Esto ocurre porque las constantes enteras se definen de forma predeterminada como números enteros con signo, que no funcionan con números enteros sin signo en operaciones aritméticas.

La solución alternativa es forzar la constante entera a un valor flotante, que funcionará con el entero sin signo. Por ejemplo:

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

Coherencia retardada y falsos positivos en el enriquecimiento de GeoIP

El sistema prioriza la velocidad sobre la precisión inmediata en las fases iniciales de enriquecimiento (Streaming y Latency-Sensitive), lo que puede provocar que falten datos y que se produzcan falsos positivos. El sistema seguirá enriqueciendo los datos en segundo plano, pero es posible que los datos no estén disponibles cuando se ejecute la regla. Esto forma parte del proceso normal de consistencia final. Para evitar este tipo de falsos positivos, no confíe en que los campos enriquecidos estén presentes en los eventos para activar las detecciones.

Por ejemplo, supongamos que se da el siguiente evento de regla:

$e.principal.ip_geo_artifact.network.asn = "16509" AND
$e.principal.ip_geo_artifact.location.country_or_region = "United Kingdom"

La regla se basa en el hecho de que el evento debe tener $e.principal.ip_geo_artifact.network.asn = "16509" Y $e.principal.ip_geo_artifact.location.country_or_region = "United Kingdom", que son campos enriquecidos. Si el enriquecimiento no se completa a tiempo, la regla generará un falso positivo.

Para evitarlo, una mejor comprobación de esta regla sería la siguiente:

$e.principal.ip_geo_artifact.network.asn != "" AND 
$e.principal.ip_geo_artifact.network.asn = "16509" AND
$e.principal.ip_geo_artifact.location.country_or_region != "" AND
$e.principal.ip_geo_artifact.location.country_or_region = "United Kingdom"

Esta regla elimina la posibilidad de que el evento se active por IPs con el ASN 16509, pero que se encuentren fuera del Reino Unido. De esta forma, se mejora la precisión general de la regla.