Sintaxis del lenguaje YARA-L 2.0

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

Comments

Designar comentarios con dos caracteres de barra diagonal (// comment ) o comentarios de varias líneas definidos mediante asteriscos simples (/* comment */ ), como harías en C.

Constantes

Se admiten constantes de números enteros, cadenas, flotantes y regex. Para constantes de cadena, use comillas dobles. Usa /regex/ para las constantes de regex.

Total

El carácter de # es un carácter especial en la sección de condición. Si se utiliza antes de cualquier nombre de variable de marcador de posición o evento, representa el número de eventos o valores que cumplen 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 instrucción net.ip_in_range_cidr(). Tanto los protocolos IPv4 como IPv6 son compatibles.

Si quieres hacer búsquedas en un intervalo de direcciones IP, indica un campo UDM de IP y un intervalo de enrutamiento entre dominios sin clases. YARA-L puede gestionar los campos de direcciones IP individuales y las que se repiten.

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 obtener una regla de ejemplo con la declaración net.ip_in_range_cidr(), consulte la regla de ejemplo: Un único evento del intervalo de direcciones IP.

Operadores

Puedes usar los siguientes operadores en YARA-L:

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

Citas de cadenas

Puedes usar cualquiera de los siguientes comillas para escribir cadenas en YARA-L 2.0. Sin embargo, el texto entrecomillado se interpreta de manera diferente según el que utilices.

  1. Comillas dobles ("): utilícelo para las cadenas normales. Debe incluir caracteres de escape. Por ejemplo, "hola\tmundo":\t se interpreta como una pestaña.

  2. comilla angular (`): se utiliza para interpretar todos los caracteres literalmente. Por ejemplo, `hola\tmundo``\t no se interpreta como una pestaña.

En las expresiones regulares, se debe incluir el carácter de barra invertida (\) en las cadenas. Sin embargo, si utiliza comillas dobles, debe aplicar un formato de escape a los caracteres de barra invertida que contengan caracteres de barra invertida, lo que puede parecer extraño.

Por ejemplo, las siguientes expresiones regulares son equivalentes:

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

Para facilitar la legibilidad, recomendamos utilizar comillas iniciales en las cadenas que contengan expresiones regulares.

Variables

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

Puede definir los siguientes tipos de variables:

  • Variables de eventos: representan grupos de eventos en formato normalizado (UDM). Especifique las condiciones de las variables de evento en la sección events. Las variables de evento se identifican mediante los campos de evento después de la variable. Los campos de evento se representan como una cadena de .<nombre del campo> (por ejemplo, $e.field1.field2). Las cadenas de los eventos siempre empiezan por el UMD de nivel superior.

  • Variables de coincidencia: se declaran en la sección de coincidencias. Las variables de coincidencia se convierten en campos de agrupación de la consulta, ya que se devuelve una fila por cada conjunto único de variables de coincidencia (y por cada periodo de tiempo). Cuando la regla encuentra una coincidencia, se devuelven los valores de las variables de coincidencia. Especifique lo que representa cada variable de coincidencia en la sección events.

  • Variables de marcador de posición: declares y definen en la sección events. Las variables de marcador de posición son similares a las variables de coincidencia. Sin embargo, puede utilizar variables de marcadores de posición en la sección condition para especificar condiciones de coincidencia.

Utilice variables de coincidencia y variables de marcador de posición para declarar las relaciones entre los campos de evento mediante condiciones de unión transitiva (consulte Sintaxis de sección Eventos para obtener más información).

Sintaxis de la sección Eventos

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

  • Qué representa cada variable de coincidencia o marcador de posición
  • Condición del filtro en una única variable de evento
  • Condición de unión en dos variables de evento.

Declaraciones variables

Para declaraciones de variable, utilice 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 de la variable de evento. Cuando el campo de evento es un campo de matriz, la variable de coincidencia puede representar cualquier valor de la matriz. También se pueden asignar varios campos de evento a una única variable de marcador de posición o coincidencia. Se trata de una condición de unión transitiva.

Por ejemplo:

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

Son equivalentes a:

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

Filtra condiciones de variables de eventos

Para usar una condición de filtro en una única variable de evento, siga esta sintaxis:

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

Aunque ambos son equivalentes, se recomienda usar la anterior ([EVENT_FIELD] [OP] [CONST]) para facilitar la lectura.

Por ejemplo:

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

Este predicado se usa como filtro en la variable del evento, lo que significa que debe cumplirlo un grupo de eventos representado por la variable.

Condiciones de unión de las variables de eventos

Para representar una condición de unión para dos variables de evento, utilice 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 utiliza para unir las dos variables de eventos con la condición.

A continuación se muestran 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

Puede utilizar el operador lógicoand y lógicoor de losevents tal y 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)". Puede utilizar paréntesis para modificar la prioridad si es necesario.

Sintaxis de la sección de coincidencias

En la sección Coincidencia, indique las variables de coincidencia de los eventos de grupo antes de comprobar las condiciones de coincidencia. Esos campos se devuelven con cada coincidencia.

  • Especifique lo que representa cada variable de coincidencia en la sección events.
  • Especifique el periodo que se utilizará para correlacionar eventos después de la palabra clave over. Los eventos que estén fuera del intervalo de tiempo se ignoran.
  • Utiliza la sintaxis siguiente para especificar el intervalo de tiempo: <number><s/m/h/d> Donde s/m/h/d significa segundos, minutos, horas y días, respectivamente.
  • El tiempo mínimo que puede especificar es de 1 minuto.
  • El tiempo máximo que puede especificar es de 48 horas.

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

$var1, $var2 over 5m

Esta declaración devuelve $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 duren más de 5 minutos no se relacionan, por lo que la regla los ignora.

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

$user over 1h

Esta declaración devuelve $user cuando la regla encuentra una coincidencia. El periodo especificado es de 1 hora. No se relacionan los eventos que tengan más de una hora de diferencia. La regla no las considera como detección.

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

$source_ip, $target_ip, $hostname over 30s

Esta declaración devuelve $source_ip, $target_ip y $hostname cuando la regla encuentra una coincidencia. El periodo especificado es de 30 segundos. Los eventos que duren más de 30 segundos no están correlacionados. La regla no las considera como detección.

En los siguientes ejemplos se muestran matches no válidos:

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

Sintaxis de la sección Condición

En la sección condition, especifica la condición de coincidencia sobre los eventos y las variables definidas en la sección events. Indica los predicados de concordancia de palabras aquí, unidos con la palabra clave and o or.

Las siguientes condiciones son condiciones límite. Establecen la variable de evento asociada, lo que significa que al menos una vez 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 no están relacionadas entre sí. Permiten que la variable de evento asociada no exista, lo que significa que es posible que no se produzca ninguna repetición del evento en una detección. Permite crear reglas de no existencia, 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 # de una variable (ya sea la variable del evento o la variable de marcador de posición) representa el recuento de eventos o valores de variables diferentes:

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

El siguiente ejemplo no es válido y evalúa el valor "true" si hay más de dos eventos distintos de $event1 y cero eventos distintos de $event2:

#event1 > 2 and !$event2

A continuación se muestran 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

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

  • Usar sintaxis YARA: relacionadas con eventos. A continuación se muestra una representación genérica de la sintaxis: $e.field = /regex/
  • Usar la sintaxis YARA-L como una función que adopta los parámetros siguientes:
    • Campo en el que se aplicará la expresión regular.
    • Expresión regular especificada en forma de cadena. Puedes usar el modificador nocase después de las cadenas para indicar que la búsqueda debe ignorar las mayúsculas. A continuación se muestra una representación genérica de la sintaxis: re.regex($e.field, `regex`)

Para que coincidan con la cadena exacta o solo con un prefijo o sufijo, incluye los caracteres de anclaje ^ (inicial) y $ (terminando) en la expresión regular.

Por ejemplo, /^full$/ coincide exactamente con "full", mientras que /full/ concuerda con "fullest", "lawfull" y "joyfully".

Cadenas sin procesar

Puedes usar YARA-L 2.0 para buscar cadenas sin formato en los datos de eventos de empresa.

Para buscar una cadena sin procesar, encierre la cadena entre caracteres de acentos graves (`) en lugar de comillas dobles (").).

El acento grueso indica que el contenido de la cadena se debe interpretar literalmente (no se analizarán los caracteres de escape).