Malware-Signaturen mit Yara selbst schreiben

Mit selbstgeschriebenen Yara-Regeln können Sie Schadsoftware erkennen. Die einfache Syntax macht das Tool auch für Einsteiger interessant.

Lesezeit: 6 Min.
In Pocket speichern
vorlesen Druckansicht Kommentare lesen 3 Beiträge
Von

Das schlanke Open-Source-Tool Yara ist ein solides und vielseitiges Werkzeug, das im Arbeitsalltag vieler Sicherheitsforscher eine zentrale Rolle spielt. Mit Signaturen in Textform – Yara-Regeln – kann Schadsoftware klassifiziert und erkannt werden. Die Regeln kommen mittlerweile nicht nur in Anti-Viren-Produkten namhafter Hersteller zum Einsatz, sondern sind oft auch fester Bestandteil von Analysen zu aktuellen Sicherheitsbedrohungen.

Mit Yara kann man aber noch andere coole Sachen machen: Mit geeigneten Regeln durchsucht das Tool Dateien, Ordner und laufende Prozesse auf Windows-, Linux- und macOS-Rechnern nach allem, was man finden möchte. Erinnern Sie sich zum Beispiel daran, wo Sie das Kuchenrezept gespeichert haben, das in Ihrer Familie seit Generationen weitergegeben wird? Ob Sie es nun vermisst haben oder nicht: Yara findet es für Sie wieder.

Und wenn Sie möchten, sucht das Tool bei der Gelegenheit auch gleich nach der neuen Spyware, vor der die Spezialisten vom US-CERT erst heute Morgen gewarnt hat. Die Regel-Syntax ist gar nicht so kompliziert.

Um Yara auszuprobieren, laden Sie zunächst die aktuelle Version von GitHub herunter und speichern sie in einem neu angelegten Ordner. Eine Installation ist unter Windows nicht notwendig. Allerdings benötigt Yara zur Ausführung dort das Visual Studio Redistributable Package (Download).

Yara beachtet Dateityp, -größe und andere Eigenschaften nur dann, wenn sie innerhalb einer Regel als Bedingung definiert wurden. Die folgende erste Beispielregel enthält nur ein paar Zutaten, die in jeder Donauwelle stecken:

rule donau {
strings:
$a = "Zucker"
$b = "Mehl"
$c = "Eier"
$d = "Kirschen"
condition:
all of them
}

Jede Yara-Regel beginnt mit dem Schlüsselwort rule, gefolgt vom Namen der Regel. Die wichtigsten Elemente zwischen den geschweiften Klammern sind die Strings, nach denen Yara suchen soll, sowie die Bedingung (condition), unter der die Regel einen Treffer erzeugt. Das all of them im Beispiel besagt, dass jeder String mindestens einmal in der Datei vorkommen muss.

Um die Regel zu testen, tippen Sie sie in einen Texteditor Ihrer Wahl ein und speichern sie unter dem Namen donau.yar im zuvor angelegten Yara-Ordner. Dort speichern Sie auch das fiktive Familienrezept (donau.txt), das Sie aus dem Archiv von unserem Server herunterladen können. Alternativ können Sie auch selbst eine donau.txt-Datei anlegen und die vier Kuchenzutaten unter Beachtung der Groß- und Kleinschreibung hineinschreiben. Für die Erkennung spielt es keine Rolle, ob die Datei noch weiteren Text enthält und in welcher Reihenfolge die Strings vorkommen.

Über die Kommandozeile testen Sie Yara auf einem 32-Bit-Windows-System mit folgendem Befehl:

yara32 donau.yar donau.txt

Wenn Sie den Namen der Regel und den der gefundenen Datei am Bildschirm sehen, können Sie die Rührschüssel hervorkramen – die Suche war erfolgreich:

donau donau.txt

Die erste Testregel ist zwar recht anschaulich; würde man mit ihr jedoch eine größere Anzahl von Kuchenrezepten durchsuchen, wären Fehlerkennungen vorprogrammiert. Gerade im Hinblick auf Yaras Hauptaufgabe – dem Erkennen von Schadsoftware – müssen Regeln immer eine Gratwanderung bewältigen: Sie müssen spezifisch genug sein, um Fehlalarme (False Positives) weitgehend zu vermeiden, dabei aber allgemein genug, um unterschiedliche Varianten aus ein und derselben Malware-Familie zu erkennen.

Unicode-Strings wie "notepad.exe" benötigen in Yara das Schlüsselwort "wide".

Doch eins nach dem anderen: Um überhaupt eine Regel schreiben zu können, benötigt man erst einmal ein paar Strings aus der Zieldatei. Linux- und macOS-User können zum Extrahieren den "strings"-Befehl auf der Kommandozeile nutzen. Unter Windows erledigt ein Hex-Viewer oder das strings-Tool aus der Sysinternals-Suite (Download) denselben Job. Beim Extrahieren sollte man in jedem Fall (unter Verwendung der jeweiligen Kommandozeilenargumente) zwischen ASCII- und Unicode-Strings unterscheiden. Letztere muss man in Yara-Regeln nämlich mit dem Schlüsselwort wide versehen, da das Tool standardmäßig nach ASCII-Strings sucht. wide ascii berücksichtigt beide Stringtypen.

Nach dem Extrahieren gilt es, eine sinnvolle Auswahl zu treffen. Einen ersten Eindruck davon vermittelt die zweite Beispielregel: Sie erkennt den vorinstallierten Windows-Texteditor notepad.exe.

rule notepad {
meta:
description = "Notepad-Regel"
strings:
$x1 = "notepad.exe" wide
$x2 = "Windows.Shell.notepad"
$x3 = {6e 6f 74 65 70 61 64 2e 70 64 62}
condition:
uint16(0) == 0x5A4D and
filesize < 300KB and 2 of ($x*)
}

Hinter der Variablen $x3 verbirgt sich (der Einfachheit halber) der String "notepad.pdb" als Bytefolge. Diese Darstellung bietet sich in der Praxis vor allem für Befehlssequenzen (Opcodes) oder charakteristische Binärdaten an. Sie kann auch mit regulären Ausdrücken kombiniert werden, wenn diese in verschiedenen Varianten einer aufzuspürenden Datei variieren.

Zum Anwenden der Regel auf den system32-Ordner speichern Sie sie in einer Datei namens "notepad.yar" im Yara-Ordner. Das Notepad-Programm finden Sie dann mit dem Befehl:

yara32 -m -r notepad.yar C:\Windows\system32

Die Option "-r” veranlasst einen rekursiven Scan aller Unterordner; "-m" liefert bei Ausgabe des Scan-Ergebnisses zusätzlich die in der Regel definierten Metadaten zurück. Das sieht dann so aus:

notepad [description="Notepad-Regel"]C:\Windows\system32\notepad.exe

Die Beispielregel erkennt notepad.exe zuverlässig und ohne False Positives im system32-Ordner samt Unterordnern. Die Strings sind zusammen mit der definierten Condition also Notepad-spezifisch genug. Letztere sorgt dafür, dass ausschließlich EXE-Dateien gefunden werden: Die hexadezimale Bytefolge 0x5A4D steht für das typische "MZ" im Dateiheader und uint16(0) veranlasst Yara, zwei Bytes ab Offset 0 (also am Dateianfang) nach dieser Folge zu durchsuchen. Die Dateien müssen außerdem kleiner als 300 KByte sein und mindestens zwei passende $x-Strings enthalten (2 of ($x*)).

Yara kann auch laufende Prozesse scannen. Um etwa herauszufinden, ob es sich bei einem laufenden Prozess im Task-Manager wirklich um notepad.exe und nicht um getarnte Malware handelt, tippen Sie Folgendes in die Kommandozeile:

yara32 notepad.yar [Prozess-ID]

Noch einmal zurück zur Regel: Wenn Sie die drei enthaltenen Strings beispielsweise durch "Microsoft Corporation" (wide ascii), "WindowsCreateStringReference" und die in vielen Programmen auftauchende API-Funktion "RaiseException" ersetzen, werden Sie feststellen, dass diese als alleiniges Erkennungsmerkmal zu ungenau sind. Sie kommen außer in notepad.exe noch in anderen Dateien im system32-Ordner vor und erzeugen auch dann noch False Positives, wenn Sie 2 of ($x*) durch all of them ersetzen.

Dennoch gibt es durchaus sinnvolle Möglichkeiten, allgemeinere Strings mit spezifischeren zu verknüpfen, um bei einer großen Zahl von Samples die False-Positive-Rate zu senken. Gute Hinweise zur Priorisierung von Strings liefert Software-Entwickler Florian Roth in seinem Blog. Er rät zu einer Unterscheidung zwischen sehr spezifischen Strings ($x*) – beispielsweise Schreibfehlern wie "Microsoft Corportation" in einem Malware-Sample –, etwas allgemeineren Strings ($a*) und solchen, die auch in Goodware vorkommen könnten und lediglich der näheren Eingrenzung dienen ($s*). Damit die Regel greift, muss Yara dann entweder mindestens einen sehr spezifischen String oder eine Kombination aus den übrigen Strings finden. Insgesamt gilt: Je spezifischer eine Stringgruppe, desto weniger Elemente sind für die Erkennung nötig. Das könnte dann zum Beispiel so aussehen:

( 1 of ($x*) ) or ( 2 of ($a*) and all of ($s*) )

Es lohnt sich, ein wenig mit der Notepad-Regel zu experimentieren und sie beispielsweise nach Roths Schema zu erweitern, um ein Gefühl für das Formulieren guter Yara-Regeln zu bekommen. Falls Sie bezüglich der "Einzigartigkeit" einzelner Strings doch einmal unsicher sind, hilft neben Tests mit möglichst vielen Dateien oft auch eine schnelle Online-Recherche weiter. Unter Umständen zeigt sich dabei, dass ein vermeintlich ungewöhnlicher String in Programmen fast ebenso oft auftaucht wie Zucker, Mehl und Eier in Rezeptsammlungen.

Die Yara-Regelsyntax umfasst noch viele weitere Möglichkeiten, die den Rahmen dieses Artikels sprengen würden: Unter anderem dienen zusätzliche PE- und ELF-Module dem Einbeziehen formattypischer Eigenschaften wie Header-Informationen oder Imports in die Regel. Außerdem gibt es ein Hash-Modul, mit dem man einzelne Samples quasi "bedingungslos" identifizieren kann. Wer tiefer in die Materie einsteigen möchte, findet im Online-Manual des Yara-Projekts detaillierte Informationen und zahlreiche Beispiele.

Praktisch für die Malware-Suche und zum Testen von Yara-Regeln: der Sandbox-Dienst Hybrid Analysis.

Falls Sie nicht nur Kuchenrezepte wiederfinden, sondern sich an Regeln für Schadcode versuchen wollen, sollten Sie dies im Schutz einer virtuellen Maschine tun. Denn dort können Sie Yara auch an laufenden Malware-Prozessen testen.

Wir haben zahlreiche Websites zusammengestellt auf denen (meist nach vorheriger Registrierung) Schadcode für Sicherheitsforscher und Hobby-Analysten bereitsteht. Der Download geschieht auf eigene Gefahr. Auch raten wir dringend davon ab, außerhalb einer gut isolierten virtuellen Maschine mit Samples zu hantieren.

  • Hybrid Analysis.
  • Das Malwerk: Malware-Sammlung, die im 24-Stunden-Rythmus um neue Dateien erweitert wird.
  • kernelmode.info: In Threads dieses Forums, das sich unter anderem der Malware-Analyse widmet, finden man häufig aktuellen Schadcode nebst weiterführenden Informationen.
  • malshare.com Ein Malware-Repository mit Yara-Regeln als Suchfilter.
  • malwr.com: Ein Online-Sandbox-Dienst, der Hybrid Analysis ähnelt.

Auf vielen von ihnen ist es möglich, gezielt nach Dateihashes und teilweise auch nach Strings zu suchen, die Bestandteil aktueller Schadcode-Analysen sind – und die Sie praktischerweise auch gleich in Ihre Regeln einbinden können.

Da Yara-Regeln im besten Fall nicht nur einzelne Samples, sondern verschiedene Exemplare aus ein und derselben Malware-Familie erkennen sollen, ist es ratsam, sie mit möglichst vielen Varianten zu testen. Als Gegenprobe sollte Ihre Testumgebung weitere Malware sowie reichlich "Goodware" (z. B. Betriebssystemdateien und häufig verwendete Software) umfassen. Zum Testen von Regeln in einem möglichst realistischen Umfeld eignet sich ein virtuelles Abbild Ihrer bestehenden Betriebssystem-Installation.

Die Wirksamkeit von Yara-Regeln kann man übrigens auch online testen: Der Sandbox-Service Hybrid Analysis erlaubt seit Kurzem die Verwendung eigener Yara-Regeln zum Durchsuchen seiner Malware-Datenbank. Die Ergebnislisten kann man dann auf Übereinstimmungen und False Positives überprüfen; außerdem führen die einzelnen Einträge zu detaillierten Malware-Reports, denen oft auch ein Schadcode-Sample anhängt.

Falls Ihnen das Schreiben und Testen eigener Yara-Regeln zu mühsam ist, Sie Yara aber dennoch verwenden möchten, lohnt sich ein Blick in das GitHub-Repository des Community-Projekts "Yara rules". Es enthält zahlreiche frei verfügbare Yara-Regeln und wird laufend um aktuelle Signaturen erweitert. Auch die Sicherheitshinweise und Analysen von US-CERT und Softwareherstellern wie Kaspersky, Check Point & Co. enthalten mittlerweile oft Yara-Regeln.

Gegen komplexe Angriffsszenarien auf Unternehmen stehen mitunter ganze Regelsätze bereit, die alle Einbruchswerkzeuge und Schadcode-Komponenten umfassen. Solche Regelsätze kann man in einer einzigen Yara-Datei zusammenfassen und zwecks Zeitersparnis mit dem Kommandozeilen-Tool Yarac kompilieren. Sofern Sie Yara heruntergeladen und die Beispiele ausprobiert haben, sind Sie sicher schon im Archiv darüber gestolpert. Die Syntax zum Kompilieren auf einem Windows-System lautet:

Yarac32 [Option] [Yara-Datei] [Ausgabedatei]

–help listet die verfügbaren Optionen auf.

Die Beispiele in diesem Artikel zeigen die Grenzen des Yara-eigenen Scanners bereits auf: Zum Testen einzelner Regeln ist er gut geeignet, für die tägliche Suche nach Malware aber zu unkomfortabel.

Zum Glück gibt es Tools, die vollständige Systemscans mit Yara ermöglichen. Dazu gehört etwa der quelloffene IoC-Scanner LOKI von Florian Roth. IoC steht für "Indicators of Compromise"; das Kommandozeilentool durchsucht Systeme also nach Einbruchsspuren wie Schadcode und typischen Hacking-Tools. Es läuft ebenfalls unter Windows, Linux und macOS, bietet detaillierte Einstellungsmöglichkeiten und spuckt zusätzlich zu den Suchergebnissen weiterführende Informationen zur jeweiligen Bedrohung aus. Auch der Virenscanner ClamAV (Download) kann mit Yara-Regeln arbeiten. Dazu braucht man die Regeln nicht einmal zu konvertieren – man schiebt sie einfach in den Ordner, in dem sich auch ClamAVs übrige Signaturen befinden.

Es gibt noch viele weitere kreative Möglichkeiten, Yara-Regeln für die effektive Suche nach Malware oder andere erfreulichere Dinge zu nutzen. Es liegt bei Ihnen, ob Sie gleich durchstarten oder lieber erst in Ruhe Ihren Kuchen aufessen möchten. Viel Spaß!

(str)