Probar reglas YARA: muestras, goodware y CI
Cómo probar reglas YARA antes de desplegarlas: muestras positivas, corpus de goodware para falsos positivos, yr check, pruebas unitarias y un pipeline de GitHub Actions.
Una regla sin probar es una suposición. Probar responde a tres preguntas: ¿compila?, ¿detecta lo que debe?, ¿guarda silencio con todo lo demás?
Por qué probar
- Deriva de sintaxis entre YARA 4 y YARA-X.
- Detecciones perdidas por una errata en un hex o una condición demasiado estricta.
- Falsos positivos con instaladores, navegadores o DLL del sistema.
- Regresiones de rendimiento (ver rendimiento).
Un pequeño corpus de pruebas
tests/positive/: muestras que deben coincidir (el malware, cifrado o referenciado por hash).tests/goodware/: archivos limpios que no deben coincidir; cuanto más grande, mejor.
Para probar la lógica sin malware real, crea archivos sintéticos mínimos:
printf 'MZ' > tests/positive/synthetic.bin
head -c 200 /dev/zero >> tests/positive/synthetic.bin
printf 'LoaderInit\0GetProcAddress\0' >> tests/positive/synthetic.bin
Compilar y formatear
yr check rules/
yr fmt rules/example.yar
yr scan rules/example.yar tests/positive/
yr scan rules/example.yar tests/goodware/
Con YARA 4.x: yarac compila y yara -r escanea de forma recursiva.
Una regla de prueba
rule MAL_Test_Target
{
meta:
= "Regla objetivo de la guía de pruebas"
= "yararules.org"
= "2026-09-29"
strings:
$a = "LoaderInit" ascii
$b = "GetProcAddress" ascii
condition:
uint16(0) == 0x5A4D and filesize < 1MB and all of them
}
Pruébala en el editor online: pega la regla, arrastra el archivo sintético al panel de prueba y verás las cadenas encontradas con sus offsets.
Integración continua
name: yara
on: [push, pull_request]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- run: cargo install yara-x-cli
- run: yr check rules/
- name: Positive samples must match
run: |
for f in tests/positive/*; do
yr scan rules/ "$f" | grep -q . || { echo "no match: $f"; exit 1; }
done
- name: Goodware must not match
run: |
out=$(yr scan rules/ tests/goodware/ || true)
if [ -n "$out" ]; then echo "$out"; exit 1; fi
Un binario precompilado de las releases de YARA-X acelera el job.
Qué medir en cada cambio
Además de «coincide / no coincide», compara el tiempo total de escaneo del corpus antes y después del cambio, el número de avisos de YARA-X y el número de reglas afectadas. Un aumento brusco del tiempo suele indicar un patrón con un átomo pobre; un aumento de coincidencias en goodware, una cadena demasiado genérica. Guardar estos números en el propio job de CI permite ver la tendencia de semana en semana.
Seguir los falsos positivos
Anota cada falso positivo (hash, regla, corrección) y añade el archivo al corpus de goodware. Prefiere una exclusión $fp* o una comprobación estructural antes que borrar una cadena útil, y usa un campo score para distinguir reglas débiles de reglas de alta confianza.
Versionar
Mantén un id estable, date, modified, author, reference y los hash de muestras (ver convenciones); actualiza modified cuando cambie la lógica.
Lista rápida
yr checksin errores. 2. Todas las muestras positivas coinciden. 3. Cero coincidencias en goodware. 4. Sin avisos de rendimiento en el linter (o justificados). 5. Metadatos completos.
FAQ
- ¿Cómo pruebo una regla YARA online?
- Pega la regla en el editor de este sitio y arrastra un archivo de muestra al panel de prueba. YARA-X se ejecuta en tu navegador como WebAssembly, así que el archivo nunca se sube.
- ¿Qué es un corpus de goodware?
- Una colección de archivos limpios (binarios del sistema, instaladores comunes, documentos) para medir con qué frecuencia una regla coincide con archivos legítimos.
- ¿Qué comando comprueba la sintaxis con YARA-X?
- yr check rules.yar compila las reglas e informa de errores y avisos sin escanear nada.