Pattern Matching mit YARA
YARA trägt den vielversprechenden Titel eines „Pattern matching swiss army knife for malware researchers (and everyone else)“ – nicht zu Unrecht.
Von Ralph Dombach, Germering
YARA ist ein Open-Source-Tool, das unter Linux, Windows und Mac OS läuft (https://virustotal.github.io/yara/). Seine Stärke ist es, einfache und komplexe Vergleiche für Suchmuster auf (auch gepackte) Dateien, in Ordnerstrukturen oder sogar im Hauptspeicher durchzuführen. Damit bietet es sich unter anderem für ein Prototyping im Umfeld der Malware-Bekämpfung an (vgl. [1]): So lässt sich damit etwa ein komplexes Pattern, das den neuesten Trojaner beschreibt, effektiv testen (Erkennung) und relativ einfach selbst weiterentwickeln oder anpassen.
YARA lässt sich aber auch für andere Zwecke nutzen – beispielsweise, um eine einfache Form einer Data-Leakage-Prevention (DLP) zu implementieren: Denn Dokumente nach Schlagworten wie „Vertraulich“, „Streng vertraulich“ oder „nur für internen Gebrauch“ usw. zu durchsuchen, ist für YARA eine Kleinigkeit! Integriert man das in den Attachment-Scanner eines E-Mail-Gateways, erhält man ergo einen akzeptablen Minimal-Schutz gegen den unerwünschten Versand klassifizierter Dateien.
Installation und Anwendung
Als Oberfläche nutzt YARA ein klassisches Kommandozeileninterface, das aber durch Add-ons verschiedener Anbieter auch mit einer zeitgemäßen GUI zu bedienen ist (bspw. mit dem Yara Editor von Adlice, www.adlice.com/download/yaraeditor/). Der Schwerpunkt von YARA liegt klassisch klar im Unix/Linux-Bereich, aber Windows gewinnt zunehmend an Unterstützern und Popularität.
YARA erfreut sich in der Szene und im produktiven Umfeld großer Beliebtheit – viele namhafte Security-Unternehmen, unter anderem AlienVault, ESET, Hornetsecurity, Kaspersky Lab, Symantec, Trend Micro oder auch Virustotal und ClamAV, nutzen und unterstützen dieses Tool. Außerdem bieten viele freie Experten und Programmierer ihre YARA-Regeln und -Erweiterungen auf GitHub zur Nutzung an (siehe etwa https://github.com/InQuest/awesome-yara sowie https://github.com/Yara-Rules/rules).
Die Installation von YARA ist recht einfach: Unter Unix/Linux gibt es fertige Installationsroutinen und für Windows muss man nur die entsprechenden Binärdateien (.EXE) auf das System kopieren (https://github.com/virustotal/yara/releases/). Für die Nutzung via Python gibt es eine spezielle Erweiterung (https://github.com/VirusTotal/yara-python). Abbildung 1 zeigt eine Übersicht der YARA-Optionen, wie sie „yara -h“ ausgibt.
Abbildung 1: Kurzhilfe von YARA
YARA-Rules
Eine YARA-Regel ist eine ASCII-Datei, die Anweisungen für YARA liefert – im einfachsten Fall ein Einzeiler; für komplexe Suchmuster kann diese Datei aber auch hunderte von Zeilen umfassen. Die Sprache orientiert sich an etablierten Konzepten (C) und unterstützt beispielsweise:
- Deklarationen unterschiedlicher Datentypen
- Variablen vom Typ Integer, String und Float
- Funktionen mit Funktionsargumenten und Rückgabewerten
- Kontrollstrukturen
- reguläre Ausdrücke
Für sehr komplexe Bedingungen und Datenstrukturen stehen überdies Zusatz-Module zur Verfügung (etwa für den Zugriff auf Felder in Windows PE-Headers). Mithilfe von eigenen, in C geschriebenen Modulen lassen sich bei Bedarf die Fähigkeiten von YARA auch erweitern – dazu ist dann allerdings eine Neu-Kompilierung erforderlich.
Das Erlernen von YARA an sich ist nicht schwer, wenn man über eine gewisse Programmiererfahrung verfügt. Ein Einstieg ganz ohne solche Kenntnisse dürfte dagegen deutlich schwerer fallen, auch wenn man auf zahlreiche Beispiele zurückgreifen kann und deren Analyse vieles einfacher macht. Leider gibt es bis heute aber kein entsprechendes „Wie lerne ich YARA?“-Buch und auch andere Anti-Malware-Literatur streift YARA oft nur kurz. Ein erster Ansatzpunkt ist die YARA-Doku auf https://yara.readthedocs.io.
Vereinfacht gesagt, besteht eine YARA-Regel (bzw. ein YARA-„Programm“) aus String-Definitionen und Bedingungen (Conditions), die verifizieren, ob die per String-Definition bestimmten Suchmuster in einer Datei enthalten sind. Ist dies der Fall, gibt das Tool die per Kommandozeilen-Parameter ausgewählten Informationen aus.
Minimalbeispiel „Malware“-Suche
Als minimales Beispiel für den YARA-Einsatz möge die Suche nach dem Wort „Malware“ dienen – in beliebigen Textdateien (*.txt) an einer beliebigen Stelle in beliebiger Schreibweise. Die Regel dazu ist einfach:
test.yar
1 rule string_malware_found
2 {
3 strings:
4 $a = „malware“ wide ascii nocase
5 condition:
6 $a
7 }
Zeile 1 legt einen Namen für die Regel fest, es folgt die Angabe der gesuchten Zeichenkette als String „$a“ – der Parameter „nocase“ sorgt für die Suche in beliebiger Schreibweise (Groß- und Klein-Schreibung), „wide“ und „ascii“ unterstützen verschiedene Kodierungen, in denen beispielsweise ein Buchstabe entweder durch ein (ascii) oder durch zwei Byte (wide, z. B. UTF-16) abgebildet wird. In der Zeile 5 wird der Conditions-Bereich eingeleitet, der beschreibt, wann etwas als zutreffend gilt – im Beispiel immer dann, wenn der Begriff „Malware“ ($a) in beliebiger Schreibweise erscheint.
Lässt man diese Regel über eine Datei probe.txt laufen, die den Begriff „Malware“ (dreimal) enthält, so gibt YARA die zutreffende Regel und den Dateinamen aus – mit dem Parameter „-s“ zusätzlich auch den „matchenden“ String und dessen Offset (hexadezimal) vom Start der Datei:
C:\tmp> yara64.exe test.yar probe.txt
string_malware_found probe.txt
C:\tmp> yara64.exe -s test.yar probe.txt
string_malware_found probe.txt
0x12:$a: malware
0x20:$a: MaLWare
0x3e:$a: malWARe
C:\tmp> yara64.exe test.yar .
string_malware_found .\probe.txt
string_malware_found .\probe.txt.bak
string_malware_found .\test.yar
Gibt man als Ziel ein Verzeichnis an, werden alle darin enthaltenen Dateien untersucht – mit dem Parameter „-r“ auch rekursiv in darunter liegenden Ordnern. Will man allerdings beispielsweise ausschließlich in Textdateien (*.txt) suchen, so muss man auf Shell-Funktionen zurückgreifen, um die Dateiliste zu erstellen und YARA damit aufzurufen, also beispielsweise mit der Windows Powershell via:
PS C:\tmp> ls -filter *.txt | % {.\yara64.exe
test.yar $_.fullname}
string_malware_found
C:\tmp\probe.txt
Weitere Möglichkeiten und Beispiele
Auch wenn ein kurzer Fachbeitrag wie dieser nur „den Appetit anregen“ kann, sollen doch ein paar weitere YARA-Features kurz angerissen werden:
- $hexa = { 52 61 6? 70 ?? } – zeigt ein Beispiel für einen hexadezimalen Suchstring, an dessen dritter Stelle ein Halbbyte variabel ist („?“) und an dessen letzter Stelle ein beliebiger Inhalt („??“) stehen kann.
- $d = „domaninname“ fullword – ein Suchbegriff wird durch die Angabe „fullword“ nur dann erkannt, wenn er von nicht-alphanumerischen Zeichen umgeben wird. „www.domainname.de“ wird gefunden – „Kurzdomainnamenklartext“ jedoch nicht.
- $hexa = { aa 2b ( 55 cd | 80 ) 3c } – bei diesem Suchbegriff kann ab der dritten Stelle entweder „55 cd“ oder nur „80“ stehen – beide Varianten sind valide (auch erheblich komplexere reguläre Ausdrücke sind möglich).
- Abbildung 2 zeigt ein ausführlicheres Beispiel einer Regeldatei von ESET für die Suche nach Anzeichen der „Turla Carbon Malware“ – mit nur zwei Regeln und wenigen Suchstrings dürfte man hier eine hohe Selektivität erreichen
Die Kombination solcher Such-Patterns in Verbindung mit Conditions, bei denen man beispielswiese auch einen Offset angeben, direkt im PE-Header suchen oder einzelne Konditionen durch logische Verknüpfungen kombinieren kann, machen YARA zu einer mächtigen String- beziehungsweise Pattern-Suchmaschine.
Abbildung 2: Regeln „carbon.yar“ zur Erkennung von Infektionsvektoren der „Carbon Paper“ Second-Stage-Backdoor
Fazit
YARA ist ein sehr effektives Suchprogramm – aber wonach man suchen muss, dieser Input muss von dritter Stelle kommen. Vieles findet man auf den angegebenen Github-Seiten, auf die man durchaus einen ausführlichen Blick werfen sollte. In den Repositories findet man ebenfalls etliches, was das Herz begehrt und die Nutzung von YARA im Ernstfall unterstützt – einerlei ob dies nun ein Honeypot-System ist, um Samples im einem Testumfeld zu isolieren, ein Memory-Forensics-Werkzeug, um im Speicher nach Daten zu suchen, oder ein Netzwerk-Analysetool, um herauszufinden, wer da „nach Hause telefonieren“ will.
Wobei es die schiere Menge an Tools und Informationen unmöglich macht, „mal eben“ während eines Vorfalls für eine halbe Stunde zu stöbern, um dann die richtige Vorgehensweise auszuwählen und umzusetzen. Generell gilt, dass Malwareanalyse neben dem richtigen Tool auch Übung, Wissen und Erfahrung erfordert und das ist nichts, was man sich in zwei bis drei Tagen aneignen könnte. Yara-Regeln zu schreiben, kann man zwar gut in wenigen Tagen erlernen, aber das ist halt nur eine Seite der Medaille.
Auch wenn YARA häufig in die Ecke der „Anti-Malware-Tools“ geschoben wird, kann man das Utility doch überall dort einsetzen, wo ein effektiver Pattern-Vergleich benötigt wird – also etwa auch beispielsweise zur Spam/Phishing-Erkennung oder, wie eingangs erwähnt, als Werkzeug beim DLP.
Literatur
[1] Ralph Dombach, Die zweite Meinung, Tools zur Malwareanalyse, <kes>2018#6, S. 48