Sintaxis de la sección Events
La sección events debe ir justo después de la sección meta en una regla. Define qué eventos debe examinar la consulta y qué atributos específicos deben tener esos eventos para considerarse relevantes para una posible detección.
La sección events es obligatoria para las reglas, pero opcional para la búsqueda y los paneles de control.
Use la sección events para enumerar los predicados que especifican lo siguiente:
- Declaraciones de variables
- Filtros de variables de evento
- Combinaciones de variables de evento
Sección "Definir eventos"
Las reglas y las consultas que se centran en un solo tipo de evento pueden incluir una sola variable de evento, como las siguientes:
events:
$e.metadata.event_type = "USER_LOGIN" // 'e' is the common convention for a single event
Las reglas y las consultas que requieren la correlación entre dos o más tipos de eventos distintos (como el inicio de sesión de un usuario seguido de la modificación de un archivo) necesitan una variable para cada tipo de evento:
events:
$login.metadata.event_type = "USER_LOGIN" // Event 1: User Login
$file_op.metadata.event_type = "FILE_MODIFICATION" // Event 2: File Modification
Una vez que se ha declarado una variable de evento, se usa como prefijo para acceder a campos específicos de ese tipo de evento. Por ejemplo, la siguiente sección event filtra los eventos de inicio de sesión fallidos de Okta:
events:
$e.metadata.vendor_name = "Okta"
$e.metadata.event_type = "USER_LOGIN"
$e.security_result.action = "FAIL"
Declaraciones de variables
Para las declaraciones de variables, utilice la siguiente sintaxis:
<EVENT_FIELD> = <VAR><VAR> = <EVENT_FIELD>
Ambas son equivalentes, como se muestra en los siguientes ejemplos:
$e.source.hostname = $hostname$userid = $e.principal.user.userid
Esta declaración indica que esta variable representa el campo especificado de la variable de evento. Cuando el campo de evento es un campo repetido, la variable match puede representar cualquier valor de la matriz. También puede asignar varios campos de evento a una sola variable de coincidencia o de marcador de posición. Esto se denomina condición de unión transitiva.
Por ejemplo, lo siguiente:
$e1.source.ip = $ip$e2.target.ip = $ip
Son equivalentes a:
$e1.source.ip = $ip$e1.source.ip = $e2.target.ip
Cuando se usa una variable, debe declararse mediante la declaración de variables. Si se usa una variable sin ninguna declaración, se produce un error de compilación.
Para obtener más información sobre las variables, consulta Expresiones, operadores y otras construcciones.
Filtros de variables de evento
Una expresión booleana que actúa sobre una sola variable de evento se considera un filtro.
Combinaciones de variables de evento
Todas las variables de evento que se usen en una regla deben combinarse con todas las demás variables de evento de una de las siguientes formas:
Directamente mediante una comparación de igualdad entre los campos de evento de las dos variables de evento combinadas. Por ejemplo:
$e1.field = $e2.field. La expresión no debe incluir operaciones aritméticas (como $\text{+, -, *, /}$).Indirectamente, a través de una unión transitiva que solo incluya un campo de evento (consulta la declaración de variables para ver la definición de "unión transitiva"). La expresión no debe incluir operaciones aritméticas.
Por ejemplo, si se usan $e1, $e2 y $e3 en la regla, las siguientes secciones de events son válidas:
events:
$e1.principal.hostname = $e2.src.hostname // $e1 joins with $e2
$e2.principal.ip = $e3.src.ip // $e2 joins with $e3
events:
// $e1 joins with $e2 using function to event comparison
re.capture($e1.src.hostname, ".*") = $e2.target.hostname
events:
// $e1 joins with $e2 using an `or` expression
$e1.principal.hostname = $e2.src.hostname
or $e1.principal.hostname = $e2.target.hostname
or $e1.principal.hostname = $e2.principal.hostname
events:
// all of $e1, $e2 and $e3 are transitively joined using the placeholder variable $ip
$e1.src.ip = $ip
$e2.target.ip = $ip
$e3.about.ip = $ip
events:
// $e1 and $e2 are transitively joined using function to event comparison
re.capture($e2.principal.application, ".*") = $app
$e1.principal.hostname = $app
Sin embargo, en los siguientes ejemplos se muestran secciones events no válidas.
events:
// Event to arithmetic comparison is an invalid join condition for $e1 and $e2.
$e1.principal.port = $e2.src.port + 1
events:
$e1.src.ip = $ip
$e2.target.ip = $ip
$e3.about.ip = "192.1.2.0" //$e3 is not joined with $e1 or $e2.
events:
$e1.src.port = $port
// Arithmetic to placeholder comparison is an invalid transitive join condition.
$e2.principal.port + 800 = $port
Siguientes pasos
- Sintaxis de la sección de coincidencias
- Sintaxis de la sección de resultados
- Sintaxis de la sección de condiciones
- Sintaxis de la sección de opciones
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.