Zum Inhalt springen

YARA-Regeln testen: Proben, Goodware und CI

YARA-Regeln vor dem Einsatz testen: positive Proben, ein Goodware-Korpus gegen False Positives, yr check, Unit-Tests und eine CI-Pipeline mit GitHub Actions.

Veröffentlicht am 2 Min. Lesezeit

Eine ungetestete Regel ist eine Vermutung. Tests beantworten drei Fragen: Kompiliert sie? Trifft sie, was sie soll? Schweigt sie bei allem anderen?

Warum testen

  • Syntax-Drift zwischen YARA 4 und YARA-X.
  • Verpasste Treffer durch Tippfehler in Hex oder zu strenge Bedingungen.
  • False Positives bei Installern, Browsern oder System-DLLs.
  • Performance-Regressionen (siehe Performance).

Ein kleines Testkorpus

  • tests/positive/: Proben, die treffen müssen (Malware verschlüsselt oder per Hash referenziert).
  • tests/goodware/: saubere Dateien, die nicht treffen dürfen — je größer, desto besser.

Für reine Logiktests genügen winzige synthetische Dateien:

printf 'MZ' > tests/positive/synthetic.bin
head -c 200 /dev/zero >> tests/positive/synthetic.bin
printf 'LoaderInit\0GetProcAddress\0' >> tests/positive/synthetic.bin

Kompilieren und formatieren

yr check rules/
yr fmt rules/example.yar
yr scan rules/example.yar tests/positive/
yr scan rules/example.yar tests/goodware/

Mit YARA 4.x: yarac kompiliert, yara -r scannt rekursiv.

Eine Testregel

rule MAL_Test_Target
{
    meta:
        description = "Zielregel des Test-Leitfadens"
        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
}

Im Online-Editor die Regel einfügen, die synthetische Datei ablegen und die Treffer mit Offsets ansehen.

Continuous Integration

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

Ein vorkompiliertes Binary aus den YARA-X-Releases beschleunigt den Job.

Was bei jeder Änderung messen

Neben „Treffer / kein Treffer“: Gesamtscanzeit des Korpus, Anzahl der YARA-X-Warnungen und betroffene Regeln. Ein plötzlicher Zeitanstieg deutet auf ein schlechtes Atom hin, mehr Goodware-Treffer auf einen zu generischen String. Diese Zahlen im CI-Job festzuhalten zeigt den Trend von Woche zu Woche.

False Positives verfolgen

Jeden False Positive mit Hash, Regel und Korrektur notieren und die Datei ins Goodware-Korpus aufnehmen. Lieber eine $fp*-Ausnahme oder strengere Strukturprüfung als einen nützlichen String löschen; ein score-Feld trennt schwache von sicheren Regeln.

Tests im Browser

Für schnelle Iterationen ohne Toolchain: Regel in den Editor einfügen, positive Probe ablegen, dann im Scanner ein ZIP mit sauberen Dateien prüfen. Beides nutzt YARA-X als WebAssembly, die Dateien verlassen den Rechner nicht — praktisch, wenn Beweismittel das Labor nicht verlassen dürfen.

Versionieren

Stabile id, date, modified, author, reference und Proben-hash pflegen (siehe Konventionen); modified bei jeder Logikänderung aktualisieren.

Kurzcheckliste

  1. yr check ohne Fehler. 2. Alle positiven Proben treffen. 3. Null Treffer im Goodware-Korpus. 4. Keine Performance-Warnungen im Linter (oder begründet). 5. Vollständige Metadaten.

FAQ

Wie teste ich eine YARA-Regel online?
Regel in den Editor dieser Website einfügen und eine Beispieldatei im Testbereich ablegen. YARA-X läuft als WebAssembly im Browser, die Datei wird nie hochgeladen.
Was ist ein Goodware-Korpus?
Eine Sammlung sauberer Dateien (Systemdateien, gängige Installer, Dokumente), mit der man misst, wie oft eine Regel legitime Dateien trifft.
Welcher Befehl prüft die Syntax mit YARA-X?
yr check rules.yar kompiliert die Regeln und meldet Fehler und Warnungen, ohne etwas zu scannen.