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.
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:
= "Zielregel des Test-Leitfadens"
= "yararules.org"
= "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
yr checkohne 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.