Sintaxis YARA: anatomía de una regla
Estructura de una regla YARA: identificador, etiquetas, secciones meta, strings y condition, imports, comentarios, reglas private y global y errores de sintaxis comunes.
Una regla YARA es un pequeño programa declarativo. Con sus cinco piezas —la cabecera, meta, strings, condition y los imports— puedes leer casi cualquier regla pública. Todos los ejemplos compilan con YARA-X; pégalos en el editor online.
La cabecera
Toda regla empieza con la palabra clave rule y un identificador:
rule MAL_Example_Stealer : windows stealer
{
condition:
false
}
- Identificador: letras, dígitos y guiones bajos, sin dígito inicial, hasta 128 caracteres y nunca una palabra clave (
rule,and,them,filesize…). Distingue mayúsculas. Los conjuntos públicos suelen seguir la convenciónPREFIJO_Familia_Detalledescrita en las convenciones. - Etiquetas (tags): palabras opcionales tras dos puntos. No afectan a la coincidencia; los escáneres las usan para filtrar o etiquetar resultados.
- Cuerpo: todo lo que va entre llaves.
La sección meta
meta guarda documentación en pares clave/valor. Los valores pueden ser cadenas, enteros o booleanos, y una clave puede repetirse (muchas reglas listan varios hash).
rule Meta_Example
{
meta:
= "Muestra los tres tipos de valores meta"
= "yararules.org"
= "2026-09-29"
= 70
= true
condition:
true
}
Los valores meta no se pueden usar en la condición, pero acompañan a cada coincidencia: los escáneres los muestran y la Detection Rule License pide que el campo author siga visible en los resultados.
La sección strings
Los patrones se declaran como $identificador = valor, seguido opcionalmente de modificadores. Hay tres tipos: cadenas de texto entre comillas, cadenas hexadecimales entre llaves y expresiones regulares entre barras.
rule Strings_Example
{
strings:
$text = "cmd.exe /c" ascii wide nocase
$hex = { 4D 5A 90 00 ?? 00 00 00 }
$re = /https?:\/\/[a-z0-9.\-]{4,64}\/gate\.php/
condition:
any of them
}
Los prefijos comunes forman conjuntos ($x1, $x2 → $x*) y un $ solo declara una cadena anónima. La guía de cadenas cubre escapes y modificadores. Toda cadena declarada debe usarse en la condición, directamente o mediante un conjunto como them; si no, YARA da error.
La sección condition
La condición es una expresión booleana. Puede referirse a patrones ($a), recuentos (#a), posiciones (@a[1]), propiedades del archivo (filesize), enteros leídos de los datos (uint16(0)), campos de módulos (pe.number_of_sections) y otras reglas. Ver la guía de condiciones.
Imports y módulos
Los módulos amplían la condición con formatos de archivo analizados y funciones auxiliares. Se importan al principio del archivo:
import "pe"
rule PE_Small_Dll
{
condition:
pe.is_pe and pe.is_dll() and filesize < 200KB
}
La versión WebAssembly de YARA-X que usa este sitio admite pe, elf, macho, dotnet, lnk, math, hash, time, console, string, dex, crx, cuckoo y vt. Ver la guía de módulos.
Comentarios
YARA acepta comentarios de línea // y de bloque /* … */ donde se permita un espacio. Úsalos para el razonamiento; lo que un escáner deba mostrar va en meta.
Reglas private y global
private rule: se evalúa y otras reglas pueden usarla, pero nunca se informa sola. Útil para piezas comunes como «PE pequeño».global rule: actúa como filtro; si es falsa, ninguna otra regla del mismo espacio de nombres puede coincidir. Úsala con moderación, porque oculta todo lo demás sin avisar.
private rule Is_Small_PE
{
condition:
uint16(0) == 0x5A4D and filesize < 3MB
}
rule MAL_Example_Uses_Helper
{
strings:
$a = "EvilConfigMarker" ascii
condition:
Is_Small_PE and $a
}
Una regla solo puede referirse a otra declarada antes.
Espacios de nombres, includes y variables externas
Al compilar varios archivos juntos, cada uno puede tener su espacio de nombres, de modo que dos conjuntos reutilicen un mismo nombre de regla. include "otro.yar" inserta otro archivo al compilar; su soporte depende de la herramienta. Las variables externas se definen al compilar o escanear (yara -d env=prod, o --define en YARA-X) y se usan en la condición como cualquier identificador.
Errores de sintaxis frecuentes
YARA-X informa de cada error con un código, un mensaje y la línea y columna exactas. Los más comunes: una cadena no declarada en la condición, una cadena declarada pero sin usar, falta de condition: y una secuencia de escape no válida.
rule Broken_Example
{
strings:
$a = "one"
$b = "two"
condition:
$a and $c // does not compile: $c no está declarada, $b no se usa
}
Pégala en el editor para ver a YARA-X señalar $c. Para problemas de estilo y rendimiento que no son errores, usa el linter.
Resumen
Una regla es una cabecera, documentación opcional, patrones opcionales y una condición obligatoria, en ese orden. Sigue con las cadenas YARA y ten a mano la chuleta.
FAQ
- ¿Qué secciones necesita una regla YARA?
- Solo la sección condition es obligatoria. Las secciones meta y strings son opcionales, pero si aparecen deben ir en el orden meta, strings, condition.
- ¿Los nombres de reglas distinguen mayúsculas?
- Sí. Los identificadores distinguen mayúsculas y minúsculas, contienen letras, dígitos y guiones bajos, no empiezan por un dígito y no pueden ser palabras clave.
- ¿Cómo compruebo la sintaxis de una regla?
- Con la línea de comandos de YARA-X, yr check rules.yar, o pegando la regla en el editor online de este sitio, que la compila con YARA-X mientras escribes.