Posted On 26/10/2025

Introducción técnica a YARA Rules

mrodriguez 0 comments
MR >> Ciberseguridad , Gestión de Seguridad , Seguridad Defensiva >> Introducción técnica a YARA Rules
Yara Rules

YARA es un lenguaje declarativo para describir familias de malware, comportamientos o artefactos mediante patrones de bytes, cadenas y propiedades de archivos. Una regla YARA combina strings (literales, regex, hex) con una conditionexpresiva que decide el match, apoyándose en módulos (p. ej., peelfmathhash). Aquí verás su sintaxis a fondo, prácticas de rendimiento y ejemplos listos para producción.


Anatomía de una regla

Una regla típica define metadatos, patrones (strings) y una condición booleana:

rule EXAMPLE_Minimal {
  meta:
    author = "Mario"
    description = "Ejemplo mínimo"
    reference = "interno"
    confidence = 80
    tags = "loader,windows"

  strings:
    $mz = { 4D 5A }              // firma MZ (PE)
    $s1 = "VirtualAlloc" nocase  // literal
    $re = /cmd\.exe\s*\/c/i   // regex

  condition:
    $mz at 0 and any of ($s*)
}

Notas: meta no afecta al match; sirve para trazabilidad. Los patrones se referencian con $nombre. El sufijo at 0ancla el offset.

Patrones: literales, regex y hex

  • Literales: modificadores asciiwidenocasefullwordxor(1-255)base64base64wide.
  • Regex: sintaxis PCRE (escapea correctamente \ si tu fuente es JS/TS).
  • Hex: soporta comodines ??, saltos [n-m] y conjuntos de bytes.
strings:
  $url     = "http://mal.example" ascii
  $wideut  = "CreateProcessW" wide fullword
  $enc     = "API-KEY=" base64
  $xorname = "MALWARE" xor(1-255) ascii
  $rgx     = /powershell\s+-enc\s+[A-Za-z0-9+/=]{20,}/ nocase
  $shell   = { E8 ?? ?? ?? 68 2E 65 78 65 00 } // call + push ".exe\0"
  $jmp     = { 6A 40 68 00 30 00 00 [4-20] 68 ?? ?? ?? ?? } // rango variable

Rendimiento: prioriza literales/hex con buenos “átomos” (subcadenas únicas). Evita wide/xor indiscriminado; úsalo solo cuando sea necesario. Ancla con at o delimita con in (a..b) para reducir búsqueda.

Condiciones expresivas

condition:
  // combinadores
  all of them and filesize < 8MB and
  // conteos
  #url >= 1 and 1 of ($shell,$jmp) and
  // offsets y ventanas
  $mz at 0 and $rgx in (0..filesize) and
  // lectura de enteros (LE/BE)
  uint32(0) == 0x5A4D and
  // llamadas a módulos
  pe.is_pe and pe.number_of_sections >= 4

Operadores útiles: for any i in (0..N): ( ... )for all of ($a*) : ( ... ), comparadores con filesize y funciones de módulos.

Módulos clave

import "pe"
import "elf"
import "math"
import "hash"
  • pepe.imphash()pe.imports(dll, func)pe.sections[i].namepe.sections[i].entropype.is_dllpe.overlay.offset.
  • elfelf.typeelf.machineelf.segments[i].
  • mathmath.entropy(offset, size) para ventanas arbitrarias.
  • hashhash.md5(0, filesize)hash.sha1(...), etc.

Ejemplos prácticos

1) PE sospechoso por secciones y API

import "pe"
import "math"

rule PE_Suspicious_Entropy_And_APIs {
  meta:
    author = "Mario"
    purpose = "Detección genérica de loaders"
    tlp = "AMBER"

  strings:
    $a1 = "VirtualAlloc" ascii nocase fullword
    $a2 = "WriteProcessMemory" ascii nocase fullword
    $a3 = "CreateRemoteThread" ascii nocase fullword
    $mz = { 4D 5A }

  condition:
    $mz at 0 and
    pe.is_pe and
    2 of ($a*) and
    // alta entropía en alguna sección ejecutable
    for any i in (0..pe.number_of_sections - 1) :
      ( pe.sections[i].characteristics & 0x20000000 /* IMAGE_SCN_MEM_EXECUTE */ and
        pe.sections[i].raw_data_size > 0 and
        math.entropy(pe.sections[i].raw_data_offset, pe.sections[i].raw_data_size) > 7.2 )
}

2) Patrón XOR genérico para payloads

rule XOR_Encoded_Marker {
  meta:
    description = "Detecta marcador 'MZ' u otros literales bajo XOR"
  strings:
    $x = "ThisIsASecret" xor(1-255) ascii
  condition:
    #x >= 1 and filesize < 20MB
}

3) Uso de imports específicos

import "pe"
rule PE_Specific_Imports {
  condition:
    pe.is_pe and
    pe.imports("KERNEL32.dll", "VirtualAlloc") and
    pe.imports("ADVAPI32.dll", "CryptEncrypt")
}

Reglas auxiliares, etiquetas y alcance

Usa private para reglas helpers que no quieres reportar, y etiquetas (p. ej. : loader windows) para agrupar. Evita reglas excesivamente genéricas que disparen falsos positivos.

private rule HELP_HighEntropyExec {
  import "pe"
  import "math"
  condition:
    pe.is_pe and
    for any i in (0..pe.number_of_sections - 1) :
      ( (pe.sections[i].characteristics & 0x20000000) != 0 and
        pe.sections[i].raw_data_size > 0 and
        math.entropy(pe.sections[i].raw_data_offset, pe.sections[i].raw_data_size) > 7.2 )
}

rule FAMILY_Loader_Alpha : loader windows {
  meta: family = "Alpha"
  strings: $s = "AlphaLoader" ascii
  condition: $s and HELP_HighEntropyExec
}

Variables externas y parametrización

Puedes pasar variables con -d desde CLI y usarlas en condiciones:

rule SIZE_Greater_Than {
  condition: filesize > MIN_SIZE
}
yara -d MIN_SIZE=1048576 rules.yar /ruta/objetivos

Rendimiento y calidad

  • Prefiere pocos patrones fuertes a muchos débiles; evita .* en regex.
  • Usa at, ventanas in (start..end) y límites de filesize.
  • Desactiva wide/xor/base64 si no aportan señal real.
  • Valida con corpus limpio/sucio y mide tasa de FP/FN.

Pruebas con CLI

# Recursivo con strings que disparan
yara -r -s rules.yar /ruta/muestras

# Con etiquetas y nombres de reglas
yara -r -m -g rules.yar /ruta/muestras

# Mostrar tiempos y profiling (si tu build lo soporta)
yara -r --print-stats rules.yar /ruta/muestras

Integra YARA en pipelines de CI (artefactos, contenedores) y en tu EDR/NSM para inspección bajo demanda. Versiona reglas y exige code review como cualquier pieza de software.


La clave de YARA no es coleccionar cadenas, sino capturar invariantes de familia/actividad: estructuras PE, secuencias de API, distribución de entropía, offsets característicos y rasgos del pipeline de compilación. Con reglas pequeñas, explicables y medibles, la detección escala.

Deja un comentario

Related Post

Seguridad defensiva en tiempos de IA

La irrupción de la inteligencia artificial no solo ha cambiado cómo construimos productos; también ha…

El Rol del CISO en la Transformación Digital

La transformación digital no es un catálogo de tecnologías, sino una disciplina para crear valor…

Análisis de logs con Sysmon: de ruido a detecciones accionables

Sysmon (Sysinternals System Monitor) extiende el registro nativo de Windows con telemetría de alto valor…