Sintaxis del lenguaje YARA-L 2.0

En esta sección, se describen los elementos principales de la sintaxis YARA-L. Consulta también Descripción general del lenguaje YARA-L 2.0.

Comentarios

Designa comentarios con dos caracteres de barra diagonal (// comment) o comentarios de varias líneas que se activen con caracteres de asterisco diagonal (/* comment */), como lo harías en C.

Constantes

Se admiten constantes de números enteros, strings, flotantes y regex. Para constantes de strings, usa comillas dobles. Usa /regex/ para constantes de regex.

Recuento

El carácter # es un carácter especial en la sección de condición. Si se usa antes de cualquier nombre de variable de evento o marcador de posición, representa la cantidad de valores o eventos distintos que satisfacen todas las condiciones de la sección events.

.

Puedes usar YARA-L para buscar eventos de UDM en todas las direcciones IP dentro de una subred con la declaración net.ip_in_range_cidr(). Se admiten IPv4 e IPv6.

Para buscar en un rango de direcciones IP, especifique un campo de UDM de IP y un rango de enrutamiento entre dominios sin clases (CIDR). YARA-L puede controlar campos de direcciones IP singulares y recurrentes.

Ejemplo de IPv4:

net.ip_in_range_cidr($e.principal.ip, "192.0.2.0/24")

Ejemplo de IPv6:

net.ip_in_range_cidr($e.network.dhcp.yiaddr, "2001:db8::/32")

Para ver una regla de ejemplo con la declaración net.ip_in_range_cidr(), consulta la regla de ejemplo: Evento único dentro del rango de direcciones IP.

Operadores

Puedes usar los siguientes operadores en YARA-L:

Operador Descripción
= iguales
!= no igual
< menor que
<= menor o igual que
> mayor que
>= mayor o igual que

Comillas para strings

Puedes usar cualquiera de los siguientes caracteres de comillas para encerrar strings en YARA-L 2.0. Sin embargo, el texto entre comillas se interpreta de manera diferente según el que use.

  1. Comillas dobles ("): Usesalas para strings normales. Debe incluir caracteres de escape. Por ejemplo: “hello\tworld”: “\t” se interpreta como una pestaña.

  2. Comillas inversas (`): Se usan para interpretar todos los caracteres literalmente. Por ejemplo: “hello\tworld”—\t no se interpreta como una pestaña.

En el caso de las expresiones regulares, a menudo debes incluir la barra inversa (carácter \) en las strings. Sin embargo, si usas comillas dobles, debes escapar los caracteres de barra invertida con caracteres de barra invertida, que pueden parecer incómodos.

Por ejemplo, las siguientes expresiones regulares son equivalentes:

  • re.regex($e.network.email.from, `.*altostrat\.com`)
  • re.regex($e.network.email.from, ".*altostrat\\.com")

Recomendamos usar comillas inversas para las strings en las expresiones regulares a fin de facilitar la lectura.

Variables

En YARA-L 2.0, todas las variables se representan como $<variable name>.

Puedes definir los siguientes tipos de variables:

  • Variables de evento: representan grupos de eventos en forma normalizada (UDM). Especifica las condiciones para las variables de eventos en la sección events. Las variables de eventos se identifican mediante los campos de eventos después de la variable. Los campos de eventos se representan como una cadena .<field name> (por ejemplo, $e.field1.field2). Las cadenas de campos de eventos siempre comienzan desde la UDM de nivel superior.

  • Variables de coincidencia: Declara en la sección de coincidencia. Las variables de coincidencia se convierten en campos de agrupación para la consulta, ya que se muestra una fila por cada conjunto único de variables de concordancia (y por cada período). Cuando la regla encuentra una coincidencia, se muestran los valores de la variable de coincidencia. Especifica lo que representa cada variable de coincidencia en la sección events.

  • Variables de marcador de posición: declara y define en la sección events. Las variables de marcador de posición son similares a las variables de coincidencia. Sin embargo, puedes usar variables de marcador de posición en la sección condition para especificar las condiciones de las coincidencias.

Usa variables de coincidencia y variables de marcador de posición para declarar relaciones entre campos de eventos mediante condiciones de unión transitiva (consulta Sintaxis de la sección de eventos para obtener más detalles).

Sintaxis de la sección Eventos

En la sección events, enumera los predicados para especificar lo siguiente:

  • Representa cada variable variable o de coincidencia.
  • Condición de filtro en una variable de evento única
  • Condición de unión en dos variables de evento.

Declaraciones de variables

Para las declaraciones variables, usa la siguiente sintaxis:

  • EVENT_FIELD = VAR
  • VAR = EVENT_FIELD

Ambos 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 para la variable de evento. Cuando el campo de evento es un campo de arreglo, la variable de coincidencia puede representar cualquier valor en el arreglo. También es posible asignar varios campos de evento a una sola variable de coincidencia o de marcador de posición. Esta es una condición de unión transitiva.

Por ejemplo:

  • $e1.source.ip = $ip
  • $e2.target.ip = $ip

Son equivalentes a lo siguiente:

  • $e1.source.ip = $ip
  • $e1.source.ip = $e2.target.ip

Condiciones de filtro para variables de evento

Para una condición de filtro en una sola variable de evento, usa la siguiente sintaxis:

  • [EVENT_FIELD] [OP] [CONST]
  • [CONST] [OP] [EVENT_FIELD]

Si bien ambas opciones son equivalentes, recomendamos usar la anterior ([EVENT_FIELD] [OP] [CONST]) para mejorar la legibilidad.

Por ejemplo:

  • $e.source.hostname = "host1234"
  • $e.source.port < 1024
  • 1024 < $e.source.port

Este predicado se usa como filtro en la variable de evento, lo que significa que un grupo de eventos representado por esa variable debería satisfacerlo.

Condiciones de unión para las variables de evento

A fin de representar una condición de unión para dos variables de evento, usa la siguiente sintaxis:

[EVENT_FIELD] [OP] [EVENT_FIELD]

Por ejemplo:

  • $e1.source.hostname = $e2.target.hostname
  • $e1.metadata.timestamp < $e2.metadata.timestamp

Este predicado se usa para unir las dos variables de eventos con la condición.

Los siguientes son ejemplos de predicados no válidos:

  • $e.source.hostname != $hostname //comparison over match/placeholder var
  • $hostname != "host1234" //comparison over match/placeholder var
  • $var1 //variable itself does not mean anything

Operadores lógicos

Puedes usar los operadores lógicos and y or lógicos en la sección events, como se muestra en los siguientes ejemplos:

  • $e.metadata.event_type = "NETWORK_DNS" or $e.metadata.event_type = "NETWORK_DHCP"
  • ($e.metadata.event_type = "NETWORK_DNS" and $e.principal.ip = "192.0.2.12") or ($e.metadata.event_type = "NETWORK_DHCP" and $e.principal.mac = "AB:CD:01:10:EF:22")
  • not $e.metadata.event_type = "NETWORK_DNS"

De forma predeterminada, el orden de prioridad de mayor a menor es not, and, or.

Por ejemplo, "a or b and c" se evalúa como "a or (b and c)". Puedes usar paréntesis para alterar la prioridad si es necesario.

Hacer coincidir la sintaxis de la sección

En la sección de coincidencias, enumera las variables de coincidencia para los eventos de grupos antes de verificar las condiciones de coincidencia. Esos campos se muestran con cada coincidencia.

  • Especifica lo que representa cada variable de coincidencia en la sección events.
  • Especifica el intervalo de tiempo que se debe usar para correlacionar eventos después de la palabra clave over. Se ignoran los eventos fuera del intervalo de tiempo.
  • Usa la siguiente sintaxis para especificar el intervalo de tiempo: <number><s/m/h/d>, en el que s/m/h/d significa segundos, minutos, horas y días, respectivamente.
  • El tiempo mínimo que puedes especificar es 1 minuto.
  • El tiempo máximo que puedes especificar es de 48 horas.

A continuación, se muestra un ejemplo de un match válido:

$var1, $var2 over 5m

Esta declaración muestra $var1 y $var2 (definidos en la sección events) cuando la regla encuentra una coincidencia. El tiempo especificado es de 5 minutos. Los eventos que se encuentran a más de 5 minutos de diferencia no se correlacionan y, por lo tanto, la regla los ignora.

A continuación, se muestra otro ejemplo de un objeto match válido:

$user over 1h

Esta declaración muestra $user cuando la regla encuentra una coincidencia. El período especificado es de 1 hora. Los eventos que están a más de una hora de diferencia no están correlacionados. La regla no los considera una detección.

A continuación, se muestra otro ejemplo de un objeto match válido:

$source_ip, $target_ip, $hostname over 2m

Esta declaración muestra $source_ip, $target_ip y $hostname cuando la regla encuentra una coincidencia. El período especificado es de 2 minutos. Los eventos que se encuentran a más de 2 minutos de diferencia no se correlacionan. La regla no los considera una detección.

En los siguientes ejemplos, se ilustran objetos match no válidos:

  • var1, var2 over 5m // invalid variable name
  • $user 1h // missing keyword

Sintaxis de la sección Condiciones

En la sección condition, especifica la condición de coincidencia sobre los eventos y variables definidos en la sección events. Aquí se muestran los predicados de concordancia de lista, unidos con la palabra clave and o or.

Las siguientes condiciones son condiciones de límite. Fuerzan la existencia de la variable de evento asociada, lo que significa que al menos una instancia del evento debe aparecer en cualquier detección.

  • $var // equivalent to #var > 0
  • #var > n // where n is >= 0
  • #var >= m // where m > 0

Las siguientes condiciones son no delimitantes. Permiten que la variable de evento asociada no exista, lo que significa que es posible que no se muestre ningún caso en la detección. Esto permite crear reglas de inexistencia, que buscan la ausencia de una variable en lugar de la presencia de una variable.

  • !$var // equivalent to #var = 0
  • #var < n // where n is > 0
  • #var <= m // where m >= 0

En el siguiente ejemplo, el carácter especial # en una variable (ya sea la variable de evento o la variable de marcador de posición) representa el recuento de eventos o valores distintos de esa variable:

$e and #port > 50 or #event1 > 2 or #event2 > 1 or #event3 > 0

El siguiente ejemplo de inexistencia también es válido y se evalúa como verdadero si hay más de dos eventos distintos de $event1 y cero eventos distintos de $event2:

#event1 > 2 and !$event2

Los siguientes son ejemplos de predicados no válidos:

  • $e, #port > 50 // incorrect keyword usage
  • $e or #port < 50 // or keyword not supported with non-bounding conditions

Expresiones regulares

Puedes definir expresiones regulares en YARA-L 2.0 con cualquiera de las siguientes sintaxis:

  • Uso de la sintaxis YARA: contenido relacionado con eventos. La siguiente es una representación genérica de esta sintaxis: $e.field = /regex/
  • Se usa la sintaxis YARA-L para la función, con los siguientes parámetros:
    • Campo al que se aplicará la expresión regular.
    • Expresión regular especificada como una string. Puedes usar el modificador nocase después de las strings para indicar que la búsqueda debe ignorar el uso de mayúsculas. La siguiente es una representación genérica de esta sintaxis: re.regex($e.field, `regex`)

Para hacer coincidir la string exacta o solo un prefijo o sufijo, incluye los caracteres de anclaje ^ (inicial) y $ (final) en la expresión regular.

Por ejemplo, /^full$/ coincide exactamente con "full", mientras que /full/ podría coincidir con "fullest", "lawfull" y "joyfully".

Strings sin procesar

Puedes usar YARA-L 2.0 para buscar una string sin procesar en los datos de eventos de tu empresa.

Para buscar una string sin procesar, encierra la string con caracteres de acento grave (`) en lugar de comillas dobles (").

El acento grave indica que el contenido de la string debe interpretarse de manera literal (no se analizarán los caracteres de escape).