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 2.0.
El impacto de la sección condition depende de si ejecutas una consulta ad hoc o implementas una regla persistente, como se indica a continuación:
- Para la búsqueda y los paneles: Actúa como un filtro posterior, ya que solo devuelve y renderiza los registros que satisfacen las expresiones especificadas.
- Reglas de detección (obligatorio): Sirven como lógica de activación. Una alerta solo se activa si las condiciones se resuelven como
truepara un período dematchdeterminado.
Usa la sección condition para definir expresiones que filtren eventos y variables de marcador de posición. Cuando se usa en una búsqueda o en una consulta de panel, solo muestra el resultado que cumple con las condiciones. Cuando se usan 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 de la sección condition. Puedes especificar condiciones match para las variables de la sección events y, de manera opcional, usar la palabra clave and para incluir lógica basada en la sección outcome. Para obtener más información, consulta la sintaxis de la sección Outcome.
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 produzca 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 del 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 limitada,$u1sigue siendo limitada.
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 las 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 la variablematch, debe existir al menos un evento que contenga el valor.En el 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
- Cómo usar 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.