Saltar al contenido

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.

Publicado el 2 min de lectura

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:
        description = "Regla objetivo de la guía de pruebas"
        author = "yararules.org"
        date = "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

  1. yr check sin 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.