Sintaxis de la sección de condiciones
En este documento se describe cómo puedes usar la sección condition de una consulta de YARA-L. La sección condition se usa en las búsquedas y los paneles de control, es obligatoria para las reglas y contiene lógica para filtrar aún más los resultados. Cuando se usa en una búsqueda o en una consulta de panel de control, solo muestra el resultado que cumple las condiciones. Cuando se usa en una regla de detección, se deben cumplir las condiciones para activar una alerta.
En la sección condition, puedes usar operadores booleanos, operadores de comparación y resultados de variables outcome para determinar si se debe activar la consulta.
Definir la sección condition
Define las expresiones de condición de los eventos y las variables de marcador de posición en la sección condition. También puede especificar una condición de coincidencia para los eventos y los marcadores de posición definidos en la sección events y, de forma opcional, usar la palabra clave and para especificar una condición de coincidencia con las variables de resultado definidas en la sección outcome. Consulte la sintaxis de la sección de resultados.
Puedes unir las expresiones con las palabras clave and o or:
Usa
andentre las condiciones.Use
orsolo cuando la consulta contenga una sola variable de evento.
Use el carácter # en la sección condition antes de cualquier nombre de evento o variable de marcador de posición para representar el número de eventos o valores distintos que cumplan todas las condiciones de la sección events. Por ejemplo:
#c > 1 significa que la variable c debe aparecer más de una vez.
Use el carácter $ en la sección condition antes del nombre de cualquier variable de resultado para representar el valor de ese resultado. Si se usa antes de cualquier nombre de variable de evento o de marcador de posición (por ejemplo, $event), representa #event > 0.
En este ejemplo de regla, se devuelve una detección cuando se producen más de cinco inicios de sesión fallidos (como se define en la sección condition) para cada usuario en un periodo de 10 minutos (como se define en la sección match):
rule failed_logins
{
meta:
author = "Security Team"
description = "Detects multiple failed user logins within 10-minute windows."
severity = "HIGH"
events:
$e.metadata.event_type = "USER_LOGIN"
$e.security_result.action = "FAIL"
$user = $e.target.user.userid
match:
$user over 10m
outcome:
$failed_login_count = count($e.metadata.id)
$first_fail_time = min($e.metadata.event_timestamp.seconds)
condition:
#e >= 5
}
Condiciones acotadas y no acotadas
Puedes usar condiciones acotadas o no acotadas en una consulta:
Las condiciones acotadas obligan a que exista la variable de evento asociada, lo que significa que el evento debe aparecer al menos una vez en la detección. Las siguientes son condiciones acotadas:
$var // equivalent to #var > 0#var > n // where n >= 0#var >= m // where m > 0Las condiciones sin límites se pueden usar para detectar la ausencia de un evento durante un periodo determinado. Por ejemplo, un evento de amenaza sin un evento de mitigación en un periodo de 10 minutos. Las condiciones ilimitadas permiten que la variable de evento asociada no exista (consultas de no existencia), lo que significa que es posible que no aparezca ninguna instancia del evento en una detección y que cualquier referencia a los campos de la variable de evento dé como resultado un valor cero.
Las siguientes son condiciones sin límites:
!$var // equivalent to #var = 0#var >= 0#var < n // where n > 0#var <= m // where m >= 0
Requisitos de las consultas de inexistencia
Para que se compile una consulta de no existencia, debe cumplir los siguientes requisitos:
- Al menos un evento de datos de marketing unificado debe tener una condición delimitada (es decir, debe existir al menos un evento de datos de marketing unificado).
- Si un marcador de posición tiene una condición ilimitada, debe estar asociado a al menos un evento de UDM limitado.
- Si una entidad tiene una condición ilimitada, debe estar asociada a al menos un evento de UDM limitado.
Ejemplo: consulta de no existencia
Veamos la siguiente consulta, en la que se ha omitido la sección de condiciones:
rule NonexistenceExample {
meta:
author = "Google Security"
description = "Example: non-existence query."
events:
$u1.metadata.event_type = "NETWORK_CONNECTION" // $u1 is a UDM event.
$u2.metadata.event_type = "NETWORK_CONNECTION" // $u2 is a UDM event.
$e1.graph.metadata.entity_type = "FILE" // $e1 is an entity.
$e2.graph.metadata.entity_type = "FILE" // $e2 is an entity.
$user = $u1.principal.user.userid // Match variable is required for multi-event query.
// Placeholder Associations:
// u1 u2
// | \ /
// port ip
// | \
// e1 e2
$u1.target.port = $port
$e1.graph.entity.port = $port
$u1.principal.ip = $ip
$u2.target.ip = $ip
$e2.graph.entity.ip = $ip
// UDM-Entity Associations:
// u1 - u2
// | \ |
// e1 e2
$u1.metadata.event_type = $u2.metadata.event_type
$e1.graph.entity.hostname = $u1.principal.hostname
$e2.graph.entity.hostname = $u1.target.hostname
$e2.graph.entity.hostname = $u2.principal.hostname
match:
$user over 5m
condition:
//Add valid condition
}Sección de condición válida
Estos son algunos ejemplos válidos para la sección de condiciones:
$u1 and !$u2 and $e1 and $e2- Todos los eventos y entidades de UDM están presentes en la sección de condiciones.
- Al menos un evento de UDM está acotado.
$u1 and !$u2 and $e1 and !$e2$e2no tiene límites y está permitido porque está asociado a$u1, que sí tiene límites. Si$e2no estuviera asociado a$u1, no sería válido.#port > 50 and #ip = 0- No hay eventos ni entidades de UDM en la sección de condiciones. Sin embargo, los marcadores de posición que hay cubren todos los eventos y entidades de UDM.
$ipse asigna a$u1y$u2, y#ip = 0es una condición sin límites. Sin embargo, las condiciones acotadas son más estrictas que las no acotadas. Como$portse asigna a$u1y#port > 50es una condición acotada,$u1sigue acotada.
Sección de condición no válida
Estos son algunos ejemplos no válidos para la sección de condiciones:
$u1 and $e1- Todos los eventos y entidades de UDM que aparecen en la sección
eventsdeben aparecer en la seccióncondition(o tener asignado un marcador de posición que aparezca en la seccióncondition). $u1, $u2, $e1, $u2, #port > 50- No se pueden usar comas como separadores de condiciones.
!$u1 and !$u2 and $e1 and $e2- Incumple el primer requisito de que al menos un evento de datos de gestión de usuarios esté delimitado.
($u1 or #port < 50) and $u2 and $e1 and $e2- La palabra clave
orno se admite con condiciones ilimitadas. ($u1 or $u2) and $e1 and $e2- No se admite la palabra clave
orentre diferentes variables de evento. not $u1 and $u2 and $e1 and $e2- No se permite la palabra clave
noten las condiciones de eventos y marcadores de posición. #port < 50 and #ip = 0- Aunque las marcas de posición hacen referencia a todos los eventos y entidades de UDM, todas las condiciones asociadas no tienen límites. Esto significa que ninguno de los eventos de UDM está delimitado, lo que provoca que la regla no se pueda compilar.
Condiciones de resultado
Puede incluir condiciones para las variables de resultado en la sección condition, unidas con las palabras clave and o or, o precedidas por la palabra clave not.
Las condicionales de resultados se especifican de forma diferente en función del tipo de variable de resultado:
Número entero: compara con un literal de número entero con los operadores
=, >, >=, <, <=, !=Por ejemplo:$risk_score > 10Float: compara con un literal de coma flotante con los operadores
=, >, >=, <, <=, !=Por ejemplo:$risk_score <= 5.5string: compara con un literal de cadena con
=o!=. Por ejemplo:$severity = "HIGH"Lista de números enteros o arrays: especifica la condición con la función
arrays.contains. Por ejemplo:arrays.contains($event_ids, "id_1234")
Si especifica una condición de resultado en una consulta que tiene una sección match, la consulta se clasifica como consulta de varios eventos para la cuota de consultas. Consulta la sintaxis de coincidencia para obtener más información sobre las clasificaciones de eventos únicos y múltiples.
Restricciones
No uses una variable
matchen la seccióncondition. Se trata de un error semántico porque los eventos se agrupan por el valor de la variablematch.Evita especificar solo condiciones ilimitadas en todas las variables
eventa las que se asigna una variablematch. Es un error semántico. Para que se devuelva un valor de variablematch, debe haber al menos un evento que contenga el valor.Si usa una ventana de tiempo, la variable de evento de referencia debe estar incluida en al menos una condición delimitada.
Siguientes pasos
- Sintaxis de la sección de opciones
- Usar "o" en la sección de condiciones
- Usar la sintaxis N DE con variables de evento
Información adicional
- Expresiones, operadores y construcciones usados en YARA-L 2.0
- Funciones de YARA-L 2.0
- Crear reglas de detección compuestas
- Ejemplos: consultas de YARA-L 2.0
¿Necesitas más ayuda? Recibe respuestas de los miembros de la comunidad y de los profesionales de Google SecOps.