Sintaxis de la sección Condition
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 la búsqueda y los paneles, 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, solo muestra el resultado que cumple con 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 búsqueda.
Define la sección condition
Define las expresiones de condición para los eventos y las variables de marcador de posición en la sección condition. También puedes especificar una condición de coincidencia para los eventos y los marcadores de posición definidos en la sección events y, de manera opcional, usar la palabra clave and para especificar una condición de coincidencia con las variables de resultado definidas en la sección outcome (consulta la sintaxis de la sección de resultados).
Puedes unir las expresiones con las palabras clave and o or:
Usa
andentre las condiciones.Usa
orsolo cuando la consulta contenga una sola variable de evento.
Usa el carácter # en la sección condition antes de cualquier evento o nombre de variable de marcador de posición para representar la cantidad de eventos o valores distintos que satisfacen todas las condiciones de la sección events. Por ejemplo:
#c > 1 significa que la variable c debe aparecer más de 1 vez.
Usa el carácter $ en la sección condition antes de cualquier nombre de variable de resultado para representar el valor de ese resultado. Si se usa antes de cualquier nombre de variable de evento o marcador de posición (por ejemplo, $event), representa #event > 0.
Este ejemplo de regla devuelve una detección cuando hay más de cinco (como se define en la sección condition) intentos de acceso fallidos para cada usuario en un período 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 delimitadas y no delimitadas
Puedes usar condiciones delimitadas o no delimitadas en una consulta:
Las condiciones acotadas fuerzan la existencia de la variable de evento asociada, lo que significa que debe aparecer al menos una ocurrencia del evento 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 no acotadas se pueden usar para detectar la ausencia de un evento durante un período; por ejemplo, un evento de amenaza sin un evento de mitigación en un período de 10 minutos. Las condiciones no acotadas permiten que la variable de evento asociada no exista (consultas de no existencia), lo que significa que es posible que no aparezca ninguna ocurrencia del evento en una detección y que cualquier referencia a los campos de la variable de evento genere un valor cero.
Las siguientes son condiciones no acotadas:
!$var // equivalent to #var = 0#var >= 0#var < n // where n > 0#var <= m // where m >= 0
Requisitos para las búsquedas de no existencia
Para que se compile una búsqueda de no existencia, debe satisfacer los siguientes requisitos:
- Al menos un evento del UDM debe tener una condición delimitada (es decir, debe existir al menos un evento del UDM).
- Si un marcador de posición tiene una condición no acotada, debe estar asociado con al menos un evento de UDM acotado.
- Si una entidad tiene una condición no acotada, debe estar asociada con al menos un evento del UDM acotado.
Ejemplo: Consulta de no existencia
Considera la siguiente consulta con la sección de condición omitida:
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
Los siguientes son ejemplos válidos para la sección de condición:
$u1 and !$u2 and $e1 and $e2- Todos los eventos y entidades del UDM están presentes en la sección de condiciones.
- Al menos un evento de UDM está delimitado.
$u1 and !$u2 and $e1 and !$e2$e2no está acotada y se permite porque está asociada a$u1, que sí está acotada. Si$e2no se asoció con$u1, esto no sería válido.#port > 50 and #ip = 0- No hay eventos ni entidades del UDM presentes en la sección de condiciones. Sin embargo, los marcadores de posición presentes abarcan todos los eventos y entidades del UDM.
$ipse asigna a$u1y$u2, y#ip = 0es una condición no acotada. Sin embargo, las condiciones acotadas son más sólidas que las no acotadas. Como$portse asigna a$u1y#port > 50es una condición acotada,$u1sigue siendo acotada.
Sección de condición no válida
Los siguientes son ejemplos no válidos para la sección de condiciones:
$u1 and $e1- Cada evento y entidad del UDM que aparezca en la sección
eventsdebe aparecer en la seccióncondition(o tener un marcador de posición asignado que aparezca en la seccióncondition). $u1, $u2, $e1, $u2, #port > 50- No se permiten comas como separadores de condiciones.
!$u1 and !$u2 and $e1 and $e2- Incumple el primer requisito de que al menos un evento del UDM esté delimitado.
($u1 or #port < 50) and $u2 and $e1 and $e2- La palabra clave
orno se admite con condiciones no acotadas. ($u1 or $u2) and $e1 and $e2- La palabra clave
orno se admite entre diferentes variables de eventos. not $u1 and $u2 and $e1 and $e2- No se permite la palabra clave
notpara las condiciones de eventos y marcadores de posición. #port < 50 and #ip = 0- Si bien los marcadores de posición hacen referencia a todos los eventos y entidades del UDM, cada condición asociada no está limitada. Esto significa que ninguno de los eventos de UDM está delimitado, lo que provoca que la regla no se compile.
Condiciones de resultado
Puedes incluir condiciones para las variables de resultado en la sección condition, unidas con la palabra clave and o or, o precedidas por la palabra clave not.
Los condicionales de resultado se especifican de manera diferente según el tipo de variable de resultado:
integer: Compara con un literal de número entero con los operadores
=, >, >=, <, <=, !=Por ejemplo:$risk_score > 10float: Compara con un literal de número de punto flotante con 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 especificas una condición de resultado en una búsqueda que tiene una sección match, la búsqueda se clasifica como una búsqueda de varios eventos para la cuota de búsquedas. Consulta la sintaxis de coincidencia para obtener más información sobre las clasificaciones de eventos únicos y múltiples.
Restricciones
Evita usar una variable
matchen la seccióncondition. Es un error semántico porque los eventos se agrupan según el valor de la variablematch.Evita especificar solo condiciones no acotadas en todas las variables
eventa las que se asigna una variablematch. Es un error semántico. Para que se muestre un valor de variablematch, debe existir al menos un evento que contenga el valor.En caso de usar una ventana deslizante, la variable del evento pivote debe estar involucrada en al menos una condición acotada.
Próximos pasos
- Sintaxis de la sección de opciones
- Usa "o" en la sección de condiciones
- Usa la sintaxis N OF con variables de eventos
Información adicional
- Expresiones, operadores y construcciones que se usan en YARA-L 2.0
- Funciones en YARA-L 2.0
- Cómo compilar reglas de detección compuestas
- Ejemplos: Consultas de YARA-L 2.0
¿Necesitas más ayuda? Obtén respuestas de miembros de la comunidad y profesionales de Google SecOps.