Problemas y limitaciones conocidos de YARA-L
En este documento, se describen los problemas y las limitaciones conocidos de YARA-L.
Agregaciones de resultados con desanidado de campos repetidos
Cuando una regla hace referencia a un campo repetido en una variable de evento y ese campo repetido contiene más de un elemento, cada elemento se desanida en una fila de evento independiente.
Por ejemplo, las dos cadenas de direcciones IP en el campo repetido target.ip
del evento $e
en la siguiente regla se desanidan en dos instancias del evento $e
, cada una con un 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 de desenredar el campo repetido
En la siguiente tabla, se muestra el registro del evento antes de desenredar 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 anidar campos repetidos
En la siguiente tabla, se muestra el registro del evento después de anidar campos de forma repetida:
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 que es un elemento secundario de otro
campo repetido, como security_results.action
, el desanidado ocurre en ambos.
el nivel del campo superior y el nivel del campo secundario. El conjunto resultante de
instancias UNNEST a partir de un solo evento es el producto cartesiano de los elementos
en el campo superior
y los elementos en el campo 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 anidan 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 evento antes de desanidar campos repetidos
En la siguiente tabla, se muestra el registro del evento antes de desenredar 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 siguiente tabla, se muestra el registro del evento después de anidar campos de forma repetida:
metadata.id | principal.application | security_results.actions |
---|---|---|
aaaaaaaaa |
Google SecOps |
PERMITIR |
aaaaaaaaa |
Google SecOps |
FAIL |
aaaaaaaaa |
Google SecOps |
DESAFÍO |
aaaaaaaaa |
Google SecOps |
BLOQUEAR |
Este comportamiento de desanidado en la evaluación de reglas puede producir
agregaciones de resultado cuando la regla hace referencia a uno o más campos repetidos
con un campo superior
que también es un campo repetido. Agregaciones no distintivas
como sum()
, array()
y count()
, no pueden dar cuenta de valores duplicados en
otros campos en el mismo evento producidos por el comportamiento de desanidar. En la siguiente regla de ejemplo, el evento $e
tiene un solo nombre de host google.com
, pero el resultado hostnames
agrega cuatro instancias no anidadas del mismo evento $e
, cada una con un valor principal.hostname
duplicado. Este resultado genera cuatro nombres de host en lugar de uno debido al anidamiento de 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 evento antes de desenredar el campo repetido
En la siguiente tabla, se muestra el registro del evento antes de desenredar el campo repetido:
metadata.id | principal.application | principal.hostname | security_results |
---|---|---|---|
aaaaaaaaa |
Google SecOps |
google.com |
[ { action: [ ALLOW, FAIL ] } , { action: [ CHALLENGE, BLOCK ] } ] |
Registro de evento después de desanidar campos repetidos
En la siguiente tabla, se muestra el registro del evento después de anidar campos de forma repetida:
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 |
DESAFÍO |
aaaaaaaaa |
Google SecOps |
google.com |
BLOQUEAR |
Solución alternativa
Las agregaciones que ignoran los valores duplicados o eliminan los valores duplicados no se afectadas por este comportamiento de desanidar. Usa la versión distintiva de un si encuentras valores de resultado inesperados debido al desanidado.
Las siguientes agregaciones no se ven afectadas por el comportamiento de anidación descrito anteriormente.
max()
min()
array_distinct()
count_distinct()
Agregaciones de resultados con múltiples variables de evento
Si una regla contiene varias variables de evento, hay un elemento independiente en la agregación para cada combinación de eventos que se incluye en la detección. Por ejemplo, si la siguiente regla de ejemplo se ejecuta en los eventos en la lista:
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 sobre cada combinación de eventos, lo que te permite usar ambos variables de evento en los cálculos del valor del resultado. Los siguientes elementos son en el 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
Esto da como resultado una suma máxima potencial de 6, aunque $e2 solo puede corresponden a 3 eventos distintos.
Esto afecta a la suma, el recuento y el array. Para conteo y array, usa count_distinct
.
o array_distinct
pueden resolver el problema, pero actualmente no hay una solución alternativa
.
Paréntesis al comienzo de una expresión
El uso de paréntesis al comienzo de una expresión activa el siguiente error:
parsing: error with token: ")"
invalid operator in events predicate
El siguiente ejemplo generaría este tipo de error:
($event.metadata.ingested_timestamp.seconds -
$event.metadata.event_timestamp.seconds) / 3600 > 1
Las siguientes variaciones de sintaxis muestran 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
El array de índice en el resultado requiere la agregación de valores únicos en un campo repetido.
El indexado de arrays en la sección de resultados aún requiere agregación. Por ejemplo, lo siguiente no funciona:
outcome:
$principal_user_dept = $suspicious.principal.user.department[0]
Sin embargo, puedes guardar el resultado del índice de array en una variable de marcador de posición. y usar esa variable en la sección de resultados, como se muestra aquí:
events:
$principal_user_dept = $suspicious.principal.user.department[0]
outcome:
$principal_user_department = $principal_user_dept
Condición O con no existencia
Si se aplica una condición O entre dos variables de evento independientes y si la
regla coincide con la no existencia, la regla se compila correctamente, pero puede producir
detección de falsos positivos. Por ejemplo, la siguiente sintaxis de regla puede coincidir
eventos que tienen $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 es separar las condiciones en dos bloques, en los que cada bloque solo aplica el filtro a una sola 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 evento sin firmar
Si intentas usar una constante de número entero en una operación aritmética con un campo de UDM cuyo tipo es un número entero sin signo, se mostrará un error. Por ejemplo:
events:
$total_bytes = $e.network.received_bytes * 2
El campo udm.network.received_bytes
es un número entero sin firmar. Esto sucede porque las constantes de números enteros se establecen de forma predeterminada en números enteros con signo, que no funcionan con números enteros sin signo en operaciones aritméticas.
La solución es forzar la constante de número entero a un número de punto flotante que luego funcionará con el número entero sin firmar. Por ejemplo:
events:
$total_bytes = $e.network.received_bytes * (2/1)