Leitfaden zu YARA-Regeln: Lernen Sie, mit diesem Malware-Forschungstool zu arbeiten

Datensicherheit

Abbildung eines Ausrufezeichens in einem Warndreieck

YARA-Regeln werden zur Klassifizierung und Identifizierung von Malware-Proben verwendet, indem Beschreibungen von Malware-Familien auf Grundlage von Text- oder Binärmustern erstellt werden.

In diesem Artikel behandeln wir die folgenden Themen:

  • Funktionsweise von YARA-Regeln
  • Anwendungsfälle für YARA
  • Elemente von YARA, die Sie kenen sollten
  • Erstellen von YARA-Regeln

Funktionsweise von YARA-Regeln

YARA-Regeln sind wie ein Stück Programmiersprache – sie funktionieren, indem eine Reihe von Variablen mit Mustern definiert wird, die in einer Malware-Probe gefunden wurden. Wenn je nach Regel einige oder alle Bedingungen erfüllt sind, kann sie verwendet werden, um Malware zu identifizieren.

YARA-Demo

Bei der Analyse von Malware-Proben können Forscher eindeutige Muster und Strings innerhalb der Malware identifizieren. Anhand dieser lässt sich ermitteln, zu welcher Bedrohungsgruppe und Malware-Familie sie gehört. Durch die Erstellung einer YARA-Regel aus mehreren Proben der gleichen Malware-Familie ist es möglich, mehrere Proben zu identifizieren, die wahrscheinlich alle mit der gleichen Kampagne oder dem gleichen Bedrohungsakteur in Verbindung stehen.

Bei der Untersuchung von Malware kann ein Analytiker eine YARA-Regel für ein neues zu untersuchendes Muster erstellen. Diese Regel kann dann verwendet werden, um seine eigene private Malware-Datenbank oder Online-Repositories wie VirusTotal nach ähnlichen Proben zu durchsuchen.

Wenn der Malware-Analyst für eine Organisation arbeitet, die ein IPS oder eine andere von YARA unterstützte Plattform für den Malware-Schutz einsetzt, dann können YARA-Regeln als Vorfallsreaktions-Tool verwendet werden. Dadurch lassen sich dann bösartige Binärdateien innerhalb der Organisation erkennen.

Anwendungsfälle

YARA ist in der Informationssicherheits-Community äußerst beliebt. Der Grund dafür ist, dass es eine Reihe von Anwendungsfällen für YARA-Implementierungen gibt:

  • Identifikation und Klassifikation von Malware
  • Finden von neuen Proben basierend auf familienspezifischen Mustern
  • Vorfallsreaktions-Teams können YARA-Regeln einsetzen, um Proben und kompromittierte Geräte zu identifizieren
  • Aktive Bereitstellung von benutzerdefinierten YARA-Regeln kann die Sicherheit eines Unternehmens erhöhen

YARA-Elemente, die Sie kennen sollten

Um eine verwendbare YARA-Regel zu erstellen, müssen Sie die verschiedenen Elemente kennen, aus denen benutzerdefinierte YARA-Regeln erstellt werden.

Metadaten

Metadaten haben keinen Einfluss darauf, wonach die YARA-Regel suchen wird, sondern liefern praktische Informationen über die Regel selbst.

  • Autor – Name, E-Mail-Adresse, Twitter-Benutzername.
  • Datum – Das Datum, an dem die Regel erstellt wurde.
  • Version – Die Versionsnummer der YARA-Regel zur Verfolgung von Änderungen.
  • Referenz – Ein Link zu einem Artikel oder einem Download der Probe. Dieser wird verwendet, um relevante Informationen über die Malware-Probe zu liefern, die die Regel erkennen soll.
  • Beschreibung – Ein kurzer Überblick über den Zweck der Regel und die Malware, die sie erkennen soll.
  • Hash – Eine Liste von beispielhaften Hashes, die zur Erstellung der YARA-Regel verwendet wurden.

Strings

Innerhalb einer Malware-Probe lassen sich oft eindeutige und interessante Strings finden. Diese eignen sich ideal zur Erstellung einer YARA-Regel. Um einen String innerhalb einer Regel zu definieren, muss der String selbst als Variable deklariert werden.

  • $a=”String aus Malware-Probe”

Neben der Deklarierung eines Strings können wir auch Modifikatoren nach dem deklarierten String anhängen, um die Suche zu optimieren.

  • $a=”malwarestring” fullword – Mit diesem Modifikator gibt nur das genaue Wort einen Treffer aus. Beispielsweise würde ‘www.malwarestring.com’ einen Treffer liefern, ‘www.abcmalwarestring.com’ jedoch nicht.
  • $a=”malwarestring” wide – Dadurch geben Unicode-Strings einen Treffer zurück, die durch null-Bytes getrennt sind, beispielsweise ‘w.w.w…m.a.l.w.a.r.e.s.t.r.i.n.g…c.o.m.’
  • $a=”malwarestring” wide ascii – Hiermit gibt die Regel bei Unicode- und ASCII-Zeichen Treffer zurück.
  • $a=”MalwareString” nocase – Hiermit gibt die Regel unabhängig von Groß- und Kleinschreibung einen Treffer zurück.

Im Bild unten habe ich den Hex-Editor HxD verwendet. Wir sehen hier einige Strings innerhalb des Tools.

Hex-String

Ich habe die ASCII-Zeichenfolge “\photo.png” hervorgehoben, die entsprechende hexadezimale Darstellung wird ebenfalls hervorgehoben. Mit diesen Informationen können Sie innerhalb einer YARA-Regel einen Hex-String deklarieren.

  • $a={5C 70 68 6F 74 6F 2E 70 6E 67} –  Hier wurden statt Anführungszeichen geschweifte Klammern benutzt.
  • $a={5C 70 68 6F ?? ?F 2E 70 6E 67} – Fragezeichen können als Wildcards verwendet werden, falls Sie eine geringfügige Abweichung eines Hex-Musters innerhalb mehrerer Proben erkannt haben.
  • $a={5C [2-10] 6F 74 6F 2E 70 6E 67} –  In diesem Beispiel lege ich fest, dass die Zeichenfolge mit dem Wert “5C” beginnen kann, es jedoch 2–10 zufällige Bytes geben kann, bevor das Treffermuster wieder beginnt.
  • $a={5C (01 02 | 03 04) 6F 2E 70 6E 67} –  In diesem Beispiel lege ich fest, dass die Hex-Werte an dieser Stelle ’01 02′ oder ’03 04′ sein können.

Einige Strings und eindeutige Kennungen, die sehr gut für YARA-Regeln geeignet sind:

  • Mutexes – Diese sind für bestimmte Malware-Familien einzigartig und werden von der Malware verwendet, um zu überprüfen, ob ein Gerät bereits kompromittiert wurde. Das erfolgt, indem geprüft wird, ob der Mutex vorhanden ist.
  • Seltene und ungewöhnliche Benutzer-Agents – Identifiziert, wenn Malware mit ihrer C2-Infrastruktur kommuniziert.
  • Registrierungsschlüssel – Wird oft von Malware als Persistenzmechanismus erstellt.
  • PDB-Pfade – Eine Abkürzung für „Programmdatenbank“. Eine PDB enthält Debugging-Informationen über eine Datei. Es ist sehr unwahrscheinlich, dass Sie eine PDB für Malware haben, aber der PDB-Pfad kann oft gefunden und in einer YARA-Regel verwendet werden, z. B. c:\user\desktop\vc++ 6\6.2.20\scrollerctrl_demo\scrollertest\release\scrollertest.pdb.
  • Verschlüsselte Konfigurations-Strings – Malware verschlüsselt häufig ihre Konfiguration, welche nützliche IOCs wie IP-Adressen und Domänen enthält. Wenn Sie über die Reverse-Engineering-Kenntnisse verfügen, um diese verschlüsselten Daten zu identifizieren, dann können Sie sie innerhalb einer YARA-Regel verwenden.

Bedingungen

Der Abschnitt „Strings“ definiert die Suchkriterien, die für eine YARA-Regel verwendet werden. Der Abschnitt „Conditions“ (Bedingungen) definiert die Kriterien, nach denen die Regel einen Treffer auslösen soll. Es gibt mehrere Bedingungen, die verwendet werden können und die ich kurz erläutern werde.

  • uint16(0) == 0x5A4D – Die Überprüfung des Headers einer Datei ist eine sehr gute Bedingung für YARA-Regeln. Diese Bedingung gibt an, dass es sich bei der Datei um eine ausführbare Windows-Datei handeln muss, denn die Hex-Werte 4D 5A befinden sich immer am Anfang des Headers einer ausführbaren Datei. Dies wird in YARA aufgrund der Byte-Reihenfolge umgekehrt.
  • uint32(0)==0x464c457f) or (uint32(0) == 0xfeedfacf) or (uint32(0) == 0xcffaedfe) or (uint32(0) == 0xfeedface) or (uint32(0) == 0xcefaedfe) – Wird verwendet, um Linux-Binaries durch Überprüfen des Datei-Headers zu identifizieren.
  • (#a == 6) – Stringzahl ist gleich 6.
  • (#a > 6)  – Stringzahl ist größer als 6.

Es gibt verschiedene Möglichkeiten, die Bedingung für die Dateigröße anzugeben.

  • (filesize>512)
  • (filesize<5000000)
  • (filesize<5MB)

Sobald die Strings innerhalb einer Regel deklariert wurden, können Sie festlegen, wie viele Treffer als Bedingung ausgelöst werden müssen, damit die Regel eine erfolgreiche Bedingung zurückgibt.

  • 2 of ($a,$b,$c)
  • 3 of them
  • 4 of ($a*)
  • all of them
  • any of them
  • $a and not $b

Wenn möglich, versuchen Sie, 2–3 Gruppen von Bedingungen zu verwenden, um falsch-positive Ergebnisse zu vermeiden und für eine zuverlässige Regel zu sorgen.

Importe

Importe sind eine hervorragende Möglichkeit, zusätzliche Bedingungen in Ihren YARA-Regeln zu implementieren. In diesem Artikel werde ich einige Beispiele für die Verwendung des PE-Imports behandeln.

PE-Bibliothek:

Wenn Sie die Syntax “import pe” zu Beginn einer YARA-Regel hinzufügen, können Sie die PE-Funktionalität von YARA nutzen. Das ist nützlich, wenn Sie keine eindeutigen Zeichenfolgen identifizieren können.

Exporte sind sehr gute Ergänzungen für YARA-Regeln. Dabei handelt es sich um Funktionen, die der Autor der Malware erstellt hat, also achten Sie darauf, ihre eindeutigen Namen zu verwenden. In der Abbildung unten habe ich einige Exporte identifiziert, die von einer DLL verwendet werden, die von einer Formbook-Malware abgelegt wurde.

Exporte

  • pe.exports(“Botanist”, “Chechako”, “Originator”, “Repressions”)

In der Abbildung unten habe ich winhttp.dll identifiziert, eine interessante DLL, die für HTTP-Konnektivität verwendet wird:

Bibliotheken

Wir können auch sehen, dass diese Bibliothek eine Reihe interessanter APIs importiert, die in eine Regel aufgenommen werden könnten.

Importe

  • pe.imports(“winhttp.dll”, “WinHttpConnect”)
  • pe.machine == pe.MACHINE_AMD64 –  Wird zur Überprüfung des Maschinentyps verwendet.

Ein Imphash ist der Hash der Importadressentabelle (IAT), den wir im vorherigen Bild mit PEStudio ermittelt haben. In einer Malware-Familie wird oft dieselbe IAT verwendet. Wenn man sie also in einer YARA-Regel verwendet, sollten sich damit ähnliche Proben erkennen lassen.

  • pe.imphash() == “0E18F33408BE6E4CB217F0266066C51C”

Damit ein Datei-Zeitstempel in einer YARA-Regel verwendet werden kann, muss er in einen Unix-Epochen-Zeitstempel umgewandelt werden. Im folgenden Bild habe ich ermittelt, wann die Malware kompiliert wurde.

Zeitstempel

Mit der Syntax ‘//’ können Kommentare innerhalb der Regel gemacht werden. Unten konnte ich also einen Kommentar hinzufügen, der angibt, was der Epochen-Zeitstempel ist.

  • pe.timestamp == 1616850469 // Tue Dec 08 17:58:56 2020

Der Versionsbereich von PEStudio zeigt, dass dieses Beispiel von Lokibot einige eindeutige Versionskennungen hat. Mit der Funktion pe.version_info können wir festlegen, welche Versions-Eigenschaften verwendet werden sollen, z. B. das Feld ‘CompanyName’.

Versionsinfo

  • pe.version_info[“CompanyName”] contains AmAZon.cOm
  • pe.language(0x0804) // China –  Identifizierte Sprachen können durch Angabe des Microsoft-Sprachcodes verwendet werden.

Im Bild weiter unten habe ich einige Bereiche in der Malware identifiziert, die in anderen von mir analysierten ausführbaren Windows-Dateien häufig nicht zu finden sind. Mithilfe dieser Informationen kann ich bestimmte Abschnittsnamen und die zugehörige Abschnittsnummer angeben.

Beachten Sie, dass die Abschnitte null-indiziert sind, d. h. der erste Abschnitt wäre ‘0’, der zweite ‘1’ usw. Im folgenden Beispiel habe ich also den Abschnitt mit dem Namen “BSS” verwendet, also Abschnitt Nummer zwei.

Abschnitte

  • pe.sections[2].name == “BSS”

Schreiben von YARA-Regeln

Die folgende Abbildung zeigt eine YARA-Regel, die ich auf Grundlage einer Probe der Redline-Malware erstellt habe:

Redline-Demo

Beginn der Regel

Die YARA-Regel beginnt mit der Syntax ‘rule’, gefolgt von dem Namen der Regel. Das ‘{‘ am Ende des Namens kennzeichnet dann den Inhalt der YARA-Regel.

Direkt darüber habe ich die PE-Funktionalität mit der Anweisung “import pe” importiert. Diese Funktionalität wird im Bedingungsteil der Regel verwendet.

Metadaten

In der Beispielregel habe ich den Autor, den Dateityp der Malware, das Datum, an dem die Regel geschrieben wurde, die Regelversion, einen Verweis darauf, woher ich die Probe habe, sowie einen Hash der Malware angegeben. Dadurch erhalten alle anderen, die die Regel verwenden, einige kontextbezogene Informationen. Auch kann das für den Autor von Nutzen sein, wenn er die Regel zu einem späteren Zeitpunkt wieder aufgreift.

Deklarieren von Strings

Als Nächstes habe ich einige Strings angegeben, die ich in der Malware-Probe gefunden habe. Diese werden als Variablen innerhalb der Regel deklariert und können verwendet werden, um nach Dateien mit ähnlichen Inhalten zu suchen.

Die von mir verwendeten Strings wurden mit PEStudio identifiziert und sind eine Mischung aus interessanter Windows-API und Strings, die meiner Meinung nach eindeutig für diese Malware-Familie sind.

Bedingungen

Im Abschnitt „Conditions“ (Bedingungen) wird festgelegt, welche Bedingungen erfüllt sein müssen, damit die YARA-Regel einen Treffer auslöst. Die erste Regel, die ich festgelegt habe, ist, dass der Datei-Header eine ausführbare Windows-Datei sein muss. Dazu müssen die Hex-Werte im Header einer ausführbaren Windows-Datei angegeben werden. In der folgenden Abbildung sehen Sie, wie dies mit einem Hex-Editor identifiziert wird.

PE-Header

Bei der Dateiversion innerhalb der Malware fiel mir auch auf, dass diese für die Malware eindeutig sein könnte. Ich habe sie also auch in die Regel aufgenommen – “Versium Research 5 Installation”.

Außerdem habe ich festgelegt, dass drei Importe vorhanden sein müssen, die PEStudio als verdächtig markiert hat.

Redline-Importe

Mit der Zeit und Erfahrung werden Sie in der Lage sein, verdächtige Bereiche innerhalb von Proben zu erkennen. Einige Beispiele für häufig vorkommende Abschnitte sind: ‘.data’, ‘.reloc’ und ‘.rsrc’. In diesem Beispiel habe ich einige Abschnitte gefunden, die nicht in dieses Muster passen. Meine YARA-Regel sucht daher nach Abschnitten namens ‘CODE’ und ‘BSS’.

Die anderen Bedingungen, die ich festgelegt habe und die erfüllt werden müssen, sind: Der erste String, der als ‘$a1’ deklariert wurde, muss vorhanden sein, ODER drei der ‘$b’-Strings oder einer der ‘$c’-Strings. Die verbleibende Bedingung ist, dass die Dateigröße kleiner als 50.000 Bytes sein muss.

Diese Regel kann nun verwendet werden, um mit der Jagd nach zusätzlichen Redline-Proben zu beginnen.

Abschließende Überlegungen:

Sie haben nun das Wissen, um Ihre eigenen YARA-Regeln zu erstellen, neue Proben für die Analyse zu finden oder alternativ aktive Erkennungen innerhalb Ihrer Organisation zu implementieren.

Wenn Sie die Sicherheitsvorkehrungen in Ihrem Unternehmen ausbauen möchten, sollten Sie einen Blick auf Varonis’ Edge: Perimeter Detection und auf die Data Security Platform werfen.

Neil Fox

Neil Fox

Neil ist ein Cybersicherheitsexperte, der sich auf Vorfallsreaktion und Malware-Analyse spezialisiert hat. Außerdem erstellt er Content zum Thema Cybersicherheit für seinen YouTube-Kanal und seinen Blog unter 0xf0x.com.

 

Möchten Sie Varonis in Aktion erleben?

Vereinbaren Sie eine Demo oder wenden Sie sich an unseren Vertrieb unter +49 89 3803 7990