Rhadamanthys-Malware-Analyse: Wie Infostealer VMs nutzen, um Analysen zu erschweren
Die Infostealer-Malware Rhadamanthys wurde im letzten Quartal des Jahres 2022 entdeckt. Aufgrund ihrer Funktionen richtet sie sich besonders an Krypto-Wallets und visiert sowohl Wallet-Clients, die auf dem Rechner des Opfers installiert sind, als auch Browser-Erweiterungen an. Die wichtigsten Verbreitungsmethoden sind gefälschte Software-Websites, die über Google Ads beworben werden, und Phishing-E-Mails. Dabei wird nicht nach Region oder Branche unterschieden.
Während dessen Fähigkeit, Informationen zu stehlen, und Verbreitungsmechanismen bekannt sind, ist es die Downloader-Komponente, die hervorsticht. Durch die Kombination fortschrittlicher Anti-Analyse-Techniken mit starker Obfuscation wird die Analyse mittels konventioneller Sicherheitsmethoden unglaublich erschwert.
Der Rhadamanthys-Downloader ist hauptsächlich in C++ programmiert und verfügt über eine gestaffelte Abfolge, die eine Vielzahl von Anti-Analyse-Techniken nutzt:
- Virtual Machine (VM) Obfuscator.
- Umfangreiche VM- und Sandbox-Erkennungsfunktionen. Sowohl maßgeschneidert als auch aus dem Open-Source-Tool al-khaser übernommen.
- Integriertes Dateisystem, das spezielle Dateiformate verwendet.
Die Anti-Analyse-Funktionen von Rhadamanthys sind nicht unbemerkt geblieben. Die Ermittler von Zscaler fanden heraus, dass es sich bei dem verwendeten VM-Obfuscator um die Quake 3 VM handelt. Außerdem brachten die Analysten diese speziellen Dateiformate mit denen in Verbindung, die von dem Krypto-Miner Hidden Bee verwendet werden. Kürzlich veröffentlichte CheckPoint eine ausführliche Analyse der inneren Funktionsweise des virtuellen Dateisystems.
In diesem Beitrag werfen wir einen Blick darauf, wofür die Rhadamanthys-Entwickler die Quake-VM verwenden, welche Änderungen daran vorgenommen wurden und wie sich der virtualisierte Code in den verschiedenen Versionen der Malware entwickelt hat. Wir haben auch IDA Pro-Module zum Zerlegen von Standard- und Rhadamanthys‘ QVM-Binärdateien veröffentlicht, die Sie in unserem öffentlichen GitHub-Repository finden können.
Devirtualisierung der Quake VM
Eine kurze Einführung in das Konzept: VM-Obfuskatoren zielen darauf ab, Code zu verbergen, indem sie einen eigenen Prozessor mit eigenen Anweisungen und einen Interpreter implementieren, der die Anweisungen in nativen Code übersetzt. Es gibt eine Fülle von Dokumentationen über die Grundlagen und Komponenten dieses Obfuskationsmechanismus, wie z. B. diesen Artikel von Tim Blazytko.
Um den Rhadamanthys-Downloader zu untersuchen, ist es notwendig, die Quake 3 VM zu analysieren. Glücklicherweise gibt es eine ausführliche Dokumentation über das Innenleben und eine Open-Source-Version wurde auf GitHub veröffentlicht.
Diese Art von Open-Source-Projekt kann für Malware-Entwickler, die VM-Obfuskatoren verwenden möchten, attraktiv sein, da sie umfassend getestete Komponenten bereitstellen. Die Aufgabe der Implementierung eines benutzerdefinierten virtuellen Prozessors ist nicht trivial und kann zu Fehlern aller Art und/oder erheblichen Leistungseinbußen führen, wenn es dem Entwickler an Erfahrung und soliden Kenntnissen in diesem Bereich mangelt.
Nachdem wir den Q3VM-Interpreter in der ersten Stufe von Rhadamanthys ausfindig gemacht und den eingebetteten Code, den er verarbeitet, extrahiert hatten, beschlossen wir, einen Disassembler zu erstellen, um einen Blick auf seine Funktionen zu werfen.

Frühe Versionen des Rhadamanthys-Loaders
In den Malware-Samples, die in den ersten Monaten des Jahres 2023 verteilt wurden, kann man die Q3VM-Interpreterschleife erkennen, wie sie im ursprünglichen Github-Repository implementiert ist. Die wichtigsten Änderungen, die die Malware-Entwickler an der VM vorgenommen haben, finden sich in den Syscalls. Innerhalb des Q3VM-Projekts und für den Rest dieses Artikels wird der Begriff Syscall verwendet, um sich auf Funktionen zu beziehen, die in nativem Code implementiert sind, die dem virtualisierten Code zur Verfügung stehen und es ihm ermöglichen, mit dem nativen Ökosystem zu interagieren, z. B. Funktionen von Windows-DLLs aufzurufen oder Speicher aus dem VM-Bereich an das native Programm zu übertragen.

Diese Calls können in QVM-Dateien durch die Suche nach CALL-Anweisungen mit einem negativen Argument aufgespürt werden. Ursprünglich gibt es 4 Syscalls des Q3VM-Projekts, die den Aufruf der Funktionen printf, fprintf, memset und memcpy aus dem virtualisierten Code ermöglichen.
Allerdings enthält diese Version der Malware insgesamt 12 Syscalls, die die ursprünglichen ersetzen. Neben dem Zugriff auf die Funktionen memset und memcpy ermöglichen die geänderten Syscalls dem virtualisierten Code die Interaktion mit wichtigen Komponenten des nativen Programms. Sie ermöglichen das Lesen des Speicherbereichs von kernel32.dll und die Auflösung seiner Exporte sowie die Bereitstellung einiger Hilfsprogramme zum Dekodieren und Übertragen von Zeichenketten aus der eingebetteten QVM-Datei an das Hauptprogramm.


Nachdem wir die grundlegenden Funktionen der Quake-VM kennengelernt haben, können wir nun das Innenleben von Rhadamanthys‘ verborgenem Code diskutieren. Für diese Version der Malware hat der Code 4 verschiedene Pfade, die je nach dem ersten von der VM empfangenen Argument gewählt werden:
0: Dekodierung des als Argument empfangenen Shellcodes.
1: Resolve VirtualProtect.
2: Verwendung von VirtualProtect, um dem Shellcode Ausführungsrechte zu erteilen.
3: Übertragen und Dekodieren der Zeichenketten ‚Avast‘ und ’snxhk‘ an das Hauptprogramm. Der Loader von Rhadamanthys prüft auf das Vorhandensein von Avast AV, bevor er seinen nächsten Schritt ausführt.


Rhadamanthys 4.5 und höher
Mit der Einführung von Version 4.5 und den nachfolgenden Versionen wurde die VM-Komponente des Loaders wesentlich verändert. Die Logik des virtualisierten Codes wurde überarbeitet und damit die Syscalls modifiziert.
Auf der nativen Seite wurde die Anzahl der Syscalls reduziert, obwohl ihre Hauptfunktionalität immer noch dieselbe ist. Sie stellen Mittel für den Zugriff auf den Speicherbereich geladener Module und den Datentransfer zwischen der virtuellen und der nativen Umgebung bereit.


Der Interpreter der VM wurde ebenfalls aktualisiert, die Opcodes der Anweisungen wurden geändert, um die Identifizierung der VM und deren Zerlegung zu verhindern. Innerhalb der eingebetteten QVM-Datei ist eine neue Logik zu beobachten. Die neuen Operationen, die von dem vom nativen Programm übergebenen Argument abhängen, sind:
0: Auflösen eines Exports von ntdll. Hashes sind in der QVM-Datei nicht mehr fest kodiert, sondern werden als Argument übergeben. Die ROR13-Kodierung hat Vorrang.
1: Nicht implementiert.
2: Resolve kernel32 Function.
3: Entschlüsselung der Stufe 2 mit einem Algorithmus der TEA-Familie,

Neues Modul heur.bin
Neben dem Umbau der VM-Komponenten der Stufe 1 haben die Rhadamanthys-Entwickler kürzlich ein neues Modul mit Anti-VM-Fähigkeiten hinzugefügt, das noch vor den Prüfungen von al-khaser während der Ausführung des entschlüsselten Shellcodes ausgeführt wird.
Das Modul enthält drei Methoden zur Erkennung von virtualisierten Umgebungen, die alle die cpuid-Anweisung verwenden.
Die erste Prüfung vergleicht die Zeit, die der Opfercomputer für die Ausführung der cpuid-Anweisung benötigt, mit der Leistung der fyl2xp1-Anweisung. Aufgrund der Art und Weise, wie VMs die Ausführung des cpuid-Befehls handhaben müssen, dauert die Ausführung des Befehls in solchen virtualisierten-Umgebungen länger als auf einem gewöhnlichen Rechner. Eine ausführlichere Erklärung dieses Verhaltens finden Sie in dem Vortrag My Ticks Don’t Lie New Timing Attacks for Hypervisor Detection von Daniele Cono.

Die anderen beiden Prüfungen sind sehr ähnlich und verwenden die Instruktion cpuid mit dem Parameter 0x40000000, der auf physischen Maschinen keine Ergebnisse liefern sollte. Dann wird es mit dem Ergebnis des Aufrufs von cpuid mit einer ungültigen Eingabe verglichen. Wenn eines der Ergebnisse nicht 0 ist, nimmt heur.bin an, dass es in einer VM ausgeführt wird.
Die beschriebene Implementierung dient zwei Zwecken: Sie erkennt nicht nur das Vorhandensein eines Hypervisors, sondern auch mögliche Manipulationen an der Ausgabe von cpuid und versucht, Analysetools gegen diese Erkennungstechniken zu wappnen.

Entpacken von Standard- und Rhadamanthys‘ Quake VM-Binärdateien
Obwohl die Aktivität von Rhadamanthys seit seinem Höhepunkt zu Beginn des Jahres zurückgegangen ist, erhält es immer noch umfangreiche Updates. Das ständige Hinzufügen neuer Anti-Analyse-Funktionen und die Verbesserung der vorhandenen sowie deren Komplexität zeigen die Reife des Threat-Actors, der hinter seiner Entwicklung steht.
Allerdings ist die Verschleierung oft ein zweischneidiges Schwert, da sehr spezifische Schutzmaßnahmen zu sehr präzisen Erkennungsmöglichkeiten führen können; daher ist eine gründliche Analyse so wichtig. Um diese Aufgabe zu erleichtern, finden Sie den Quellcode der QVM-Prozessor- und Lademodule für IDA Pro in unserem GitHub-Repository.
IOCs
0843a128cf164e945e6b99bda50a7bdb2a57b82b65965190f8d3620d4a8cfa2c
e915dccc9e65da534932476e8cec4b7e5446dbd022f242e9302ac18d2a041df5
9950788284df125c7359aeb91435ed24d59359fac6a74ed73774ca31561cc7ae
dd4bb5e843a65e4e5a38032d12f19984daad051389853179bd8fdb673db82daf
4b350ae0b85aa7f7818e37e3f02397cd3667af8d62eb3132fb3297bd96a0abe2