Zusammenfassung
Cyberkriminelle bringen zunehmend ihre eigenen Treiber mit – entweder nutzen sie einen anfälligen legitimen Treiber aus oder verwenden einen speziell entwickelten Treiber, um EDR-Systeme (Endpoint Detection and Response) zu deaktivieren und Erkennungs- oder Präventionsfunktionen zu umgehen.
Elastic Security Labs hat eine finanziell motivierte Kampagne zum Einsatz von MEDUSA-Ransomware mithilfe eines HEARTCRYPT-Loadersüberwacht. Dieser Loader wurde zusammen mit einem gesperrten, mit einem Zertifikat signierten Treiber eines chinesischen Anbieters namens ABYSSWORKER bereitgestellt, den er auf dem Opfercomputer installiert und dann verwendet, um verschiedene EDR-Anbieter ins Visier zu nehmen und zum Schweigen zu bringen. Dieser EDR-Killer-Treiber wurde kürzlich von ConnectWise in einer anderen Kampagne gemeldet, in der ein anderes Zertifikat und andere IO-Steuercodes verwendet wurden, wobei einige seiner Funktionen diskutiert wurden. Im Jahr 2022 enthüllte Google Cloud Mandiant einen bösartigen Treiber namens POORTRY , von dem wir glauben, dass er die früheste Erwähnung dieses Treibers ist.
In diesem Artikel werfen wir einen detaillierten Blick auf diesen Treiber und untersuchen seine verschiedenen Funktionen und Techniken. Wir stellen auch relative virtuelle Adressen (RVA) unter jedem Reversed-Code-Screenshot bereit, um die Forschung mit dem Referenzbeispiel zu verknüpfen, zusammen mit einem kleinen Client-Beispiel, das Sie verwenden können, um weiter mit dieser Malware zu experimentieren.
Technische Analyse
PE-Header
Bei der Binärdatei handelt es sich um einen 64-Bit-Windows PE-Treiber mit dem Namen smuol.sys, der einen legitimen CrowdStrike Falcon-Treiber imitiert.
Zum Zeitpunkt der Analyse fanden wir ein Dutzend Proben auf VirusTotal, die aus dem Zeitraum vom 08.08.2024 bis zum 24.02.2025 stammen. Die meisten waren mit VMProtect vollgepackt, aber zwei – auf die in den folgenden beobachtbaren Tabellen verwiesen wird – waren nicht geschützt.
Alle Muster werden mit möglicherweise gestohlenen, widerrufenen Zertifikaten chinesischer Unternehmen signiert. Diese Zertifikate sind weithin bekannt und werden von verschiedenen Malware-Samples und -Kampagnen gemeinsam genutzt, sind jedoch nicht spezifisch für diesen Treiber. Die Fingerabdrücke des Zertifikats sind unten aufgeführt:
| fingerprint | Name |
|---|---|
51 68 1b 3c 9e 66 5d d0 b2 9e 25 71 46 d5 39 dc | Foshan Gaoming Kedeyu Insulation Materials Co., Ltd |
7f 67 15 0f bb 0d 25 4e 47 42 84 c7 f7 81 9c 4f | FEI XIAO |
72 88 1f 10 cd 24 8a 33 e6 12 43 a9 e1 50 ec 1d | Fuzhou Dingxin Trade Co., Ltd. |
75 e8 e7 b9 04 3b 13 df 60 e7 64 99 66 30 21 c1 | Verifizierter Lieferant - Changsha Hengxiang Informationstechnologie Co., Ltd |
03 93 47 e6 1d ec 6f 63 98 d4 d4 6b f7 32 65 6c | Xinjiang Yishilian Network Technology Co., Ltd |
4e fa 7e 7b ba 65 ec 1a b7 74 f2 b3 13 57 d5 99 | Shenzhen Yundian Technology Co., Ltd |
Verdunkelung
ABYSSWORKER verwendet Funktionen, die immer den gleichen Wert zurückgeben und sich auf eine Kombination aus undurchsichtigen Prädikaten und anderen Ableitungsfunktionen stützen. Die folgende Null-Rückgabefunktion gibt z. B. immer eine 0 zurück, die auf hartcodierten abgeleiteten Werten basiert.
Nachfolgend finden Sie eine der Ableitungsfunktionen:
Diese konstant wiederkehrenden Funktionen werden in der Binärdatei wiederholt aufgerufen, um die statische Analyse zu behindern. Es gibt jedoch nur drei solcher Funktionen, und sie werden in keinem Prädikat verwendet, sondern einfach aufgerufen. Wir können sie leicht identifizieren, was dies zu einem ineffizienten Verschleierungsschema macht.
Initialisierung
Nach der Initialisierung beginnt der Treiber mit dem Abrufen von Zeigern auf mehrere Kernelmodule und seine Clientschutzfunktion, die in den folgenden Abschnitten erläutert wird.
Anschließend wird ein Gerät mit dem Pfad \\device\\czx9umpTReqbOOKF und einem symbolischen Link mit dem Pfad \\??\\fqg0Et4KlNt4s1JTerstellt.
Die Initialisierung wird abgeschlossen, indem Rückrufe für die Hauptfunktionen registriert werden.
Client-Schutz beim Öffnen des Geräts
Beim Öffnen des Treibergeräts wird der IRP_MJ_CREATE Major-Callback aufgerufen. Diese Funktion ist dafür verantwortlich, die Prozess-ID zur Liste der zu schützenden Prozesse hinzuzufügen und alle bereits vorhandenen Handles des Zielprozesses aus der Liste der laufenden Prozesse zu entfernen.
Die Funktion ruft die Prozess-ID aus dem aktuellen Kernel-Thread ab, da der Kernel-Callback beim Öffnen des Geräts im Kontext des Client-Prozesses ausgeführt wird.
Vor dem Hinzufügen der Prozess-ID zur Schutzliste sucht ABYSSWORKER nach allen vorhandenen Handles für den Clientprozess in anderen laufenden Prozessen und entfernt diese.
Um dies zu erreichen, iteriert die Malware bestehende Prozesse, indem sie ihre Prozess-IDs (PIDs) mit Brute-Force erzwingt, um die Abhängigkeit von einer API zu vermeiden. Für jeden Prozess iteriert es über deren Handles, auch mit Brute-Force, und prüft, ob das zugrunde liegende Objekt dem Clientprozess entspricht. Wenn eine Übereinstimmung gefunden wird, werden die Zugriffsrechte mit dem als Parameter übergebenen Wert (0x8bb) entfernt.
Schließlich wird die PID zur globalen Liste der geschützten Prozesse hinzugefügt.
Wie bereits erwähnt, richtet der Treiber seine Schutzfunktion während der Initialisierungsphase ein. Dieser Schutz beruht auf der Registrierung von zwei pre-operation Rückrufen mithilfe der ObRegisterCallback -API: einer, um das Öffnen von Handles für seine geschützten Prozesse zu erkennen, und ein weiterer, um das Öffnen von Handles für die Threads dieser geschützten Prozesse zu erkennen.
Die beiden Callbacks funktionieren auf die gleiche Weise: Sie setzen den gewünschten Zugriff für das Handle auf Null und verweigern so effektiv die Erstellung des Handles.
DeviceIoControl-Handler
Nach dem Empfang einer Geräte-E/A-Steuerungsanforderung sendet ABYSSWORKER die Anforderung basierend auf dem E/A-Steuerungscode an Handler. Diese Handler decken eine breite Palette von Vorgängen ab, von der Dateimanipulation bis hin zur Prozess- und Treiberbeendigung, und bieten ein umfassendes Toolset, das zum Beenden oder dauerhaften Deaktivieren von EDR-Systemen verwendet werden kann.
In der folgenden Tabelle werden die verschiedenen E/A-Steuerelemente detailliert beschrieben:
| Name | Code |
|---|---|
| Aktivieren von Malware | 0x222080 |
| Datei kopieren | 0x222184 |
| Entfernen von Rückrufen und Geräten nach Modulname | 0x222400 |
| Ersetzen Sie die Hauptfunktionen des Treibers durch den Modulnamen | 0x222404 |
| Beenden von Systemthreads nach Modulname | 0x222408 |
| Mini-Filtergeräte abnehmen | 0x222440 |
| Datei löschen | 0x222180 |
| Deaktivieren Sie Malware | 0x222084 |
| API laden | 0x2220c0 |
| Verringern des Referenzindikators für alle Treiber | 0x222100 |
| Verringern des Referenzzählers für alle Geräte | 0x222104 |
| Prozess beenden | 0x222144 |
| Thread beenden | 0x222140 |
| Entfernen von Hooks aus den Hauptfunktionen von Ntfs- und Pnp-Treibern | 0x222444 |
| Neustart | 0x222664 |
Aktivieren der Malware (0x222080)
Wie in diesem Blogbeitrag erläutert, muss der Client den Treiber aktivieren, indem er ein Kennwort (7N6bCAoECbItsUR5-h4Rp2nkQxybfKb0F-wgbJGHGh20pWUuN1-ZxfXdiOYps6HTp0X) an den Treiber sendet, in unserem Fall über die 0x222080 IO-Steuerung.
Der Handler vergleicht einfach die Benutzereingabe mit dem hartcodierten Kennwort. Wenn korrekt, wird ein globales Flag auf true (1) gesetzt. Dieses Flag wird in allen anderen Handlern überprüft, um die Ausführung zuzulassen oder zu verweigern.
Laden der API (0x2220c0)
Die meisten Handler in der Malware verlassen sich auf Kernel-APIs, die mit diesem Handler geladen werden müssen. Dieser Handler lädt diese globalen Variablen zusammen mit mehreren Strukturen, wobei die Zeiger des Kernelmoduls verwendet werden, die zuvor während der Initialisierung geladen wurden. Sobald der Ladevorgang abgeschlossen ist, wird ein globales Flag festgelegt, um die Verfügbarkeit dieser APIs zu signalisieren.
Dieser Handler verfügt über zwei Betriebsmodi: einen vollständigen und einen partiellen Modus. Im Vollmodus werden die APIs mithilfe einer Zuordnungsstruktur aus Funktionsnamen und RVA geladen, die vom Benutzer als Eingabe für das E/A-Steuerelement bereitgestellt werden. Im partiellen Modus sucht es selbst nach einigen der APIs, lädt aber nicht alle APIs, die im vollständigen Modus geladen werden, daher der Begriff partieller Modus. Wenn sich der Benutzer für den partiellen Modus entscheidet, da diese Zuordnungsstruktur nicht bereitgestellt werden kann, werden einige Handler nicht ausgeführt. In diesem Kapitel gehen wir nur auf die vollständige Funktionsweise ein.
Im Folgenden werden die verwendeten Strukturen detailliert beschrieben:
#define AM_NAME_LENGTH 256
typedef struct _struct_435
{
uint64_t rva;
char name[AM_NAME_LENGTH];
} struct_435_t;
#define AM_ARRAY_LENGTH 1024
typedef struct _struct_433
{
struct_435_t array[AM_ARRAY_LENGTH];
uint32_t length;
} struct_433_t;
Im Folgenden finden Sie ein kurzes Beispiel für die Verwendung:
struct_433_t api_mapping = {
.length = 25,
.array = {
[0] = {.rva = 0xcec620, .name = "PspLoadImageNotifyRoutine"},
[1] = {.rva = 0xcec220, .name = "PspCreateThreadNotifyRoutine"},
[2] = {.rva = 0xcec420, .name = "PspCreateProcessNotifyRoutine"},
// (...)
[24] = {.rva = 0x250060, .name = "NtfsFsdShutdown"},
}};
uint32_t malware_load_api(HANDLE device)
{
return send_ioctrl(device, IOCTRL_LOAD_API, &api_mapping, sizeof(struct_433_t), NULL, 0);
}
Um die API zu laden, lädt die Funktion zunächst drei "Callback-Listen" von verschiedenen Kernel-Objekttypen. Diese werden von dem Handler verwendet, der registrierte Benachrichtigungsrückrufe entfernt, die zu einem bestimmten Modul gehören.
Anschließend werden Zeiger auf Funktionen geladen, indem die bereitgestellte Struktur verwendet wird, indem einfach nach dem Funktionsnamen gesucht und die zugehörige RVA zur Basisadresse des Moduls hinzugefügt wird.
Dies geschieht für die folgenden 25 Funktionen:
PspLoadImageNotifyRoutinePspCreateThreadNotifyRoutinePspCreateProcessNotifyRoutineCallbackListHeadPspSetCreateProcessNotifyRoutinePspTerminateThreadByPointerPsTerminateProcessIopInvalidDeviceRequestClassGlobalDispatchNtfsFsdReadNtfsFsdWriteNtfsFsdLockControlNtfsFsdDirectoryControlNtfsFsdCloseNtfsFsdCleanupNtfsFsdCreateNtfsFsdDispatchWaitNtfsFsdDispatchSwitchNtfsFsdDispatchNtfsFsdFlushBuffersNtfsFsdDeviceControlNtfsFsdFileSystemControlNtfsFsdSetInformationNtfsFsdPnpNtfsFsdShutdown
Kopieren und Löschen von Dateien (0x222184, 0x222180)
Um Dateien zu kopieren oder zu löschen, setzt ABYSSWORKER auf eine Strategie, die zwar nicht neu, aber dennoch interessant ist. Anstatt eine gängige API wie NtCreateFilezu verwenden, wird ein I/O Request Packet (IRP) von Grund auf neu erstellt und direkt an das entsprechende Laufwerk gesendet, das die Zieldatei enthält.
Erstellen einer Datei
Die Dateierstellungsfunktion wird verwendet, um zu veranschaulichen, wie dieser Mechanismus funktioniert. Die Funktion beginnt mit dem Abrufen des Laufwerks aus dem Dateipfad. Anschließend wird ein neues Dateiobjekt erstellt und mit dem Ziellaufwerk verknüpft, wobei sichergestellt wird, dass das neue Objekt ordnungsgemäß mit dem Laufwerk verknüpft ist.
Anschließend wird ein neues IRP-Objekt erstellt und alle erforderlichen Daten zum Ausführen des Dateierstellungsvorgangs festgelegt. Die Hauptfunktion, auf die dieses IRP abzielt, wird in der MajorFunction -Eigenschaft angegeben, die in diesem Fall auf IRP_MJ_CREATEfestgelegt ist, wie für die Dateierstellung erwartet.
Anschließend sendet die Malware das IRP an das Ziellaufwerk. Obwohl es die IoCallDriver -API hätte verwenden können, sendet es das IRP stattdessen manuell, indem es die Hauptfunktion des entsprechenden Geräts aufruft.
Zu diesem Zeitpunkt ist das Dateiobjekt für die weitere Verwendung gültig. Der Handler beendet seine Arbeit, indem er den Referenzzähler des Dateiobjekts inkrementiert und ihn seinem Ausgabeparameter für die spätere Verwendung zuweist.
Kopieren einer Datei
Um eine Datei zu kopieren, öffnet ABYSSWORKER sowohl die Quell- als auch die Zieldatei, liest (IRP_MJ_READ) aus der Quelle und schreibt (IRP_MJ_WRITE) in das Ziel.
Löschen einer Datei
Der Löschhandler legt das file-Attribut auf ATTRIBUTE_NORMAL fest, um den Schutz schreibgeschützter Dateien aufzuheben, und legt die Dateidisposition auf delete (disposition_info.DeleteFile = 1) fest, um die Datei mithilfe des IRP_MJ_SET_INFORMATION IRP zu entfernen.
Entfernen von Benachrichtigungsrückrufen nach Modulname (0x222400)
Malware-Clients können diesen Handler verwenden, um EDR-Produkte und ihre Sichtbarkeit zu blenden. Es sucht nach allen registrierten Benachrichtigungsrückrufen und entfernt diese. Die Zielrückrufe sind diejenigen, die mit den folgenden APIs registriert sind:
PsSetCreateProcessNotifyRoutinePsSetLoadImageNotifyRoutinePsSetCreateThreadNotifyRoutineObRegisterCallbacksCmRegisterCallback
Darüber hinaus werden Callbacks entfernt, die über einen MiniFilter-Treiber registriert wurden, und optional Geräte, die zu einem bestimmten Modul gehören.
Um diese Benachrichtigungsrückrufe zu löschen, sucht der Handler sie mithilfe verschiedener Methoden, z. B. der drei globalen Rückruflisten, die zuvor im Lade-API-Handler geladen wurden und Rückrufe enthalten, die bei ObRegisterCallbacks und CmRegisterCallbackregistriert sind. Anschließend werden sie mithilfe der entsprechenden APIs wie ObUnRegisterCallbacks und CmUnRegisterCallbacksgelöscht.
EDR mit diesen Methoden zu verblinden, verdient einen eigenen Blogbeitrag. Um diesen Beitrag kurz zu halten, werden wir hier keine weiteren Details geben, aber wir laden den Leser ein, diese Methoden in zwei gut dokumentierten Projekten zu erkunden, die diese Techniken implementieren:
Ersetzen Sie die Hauptfunktionen des Treibers durch den Modulnamen 0x222404
Eine andere Möglichkeit, in einen Treiber einzugreifen, besteht darin, diesen Handler zu verwenden, um alle seine Hauptfunktionen durch eine Dummyfunktion zu ersetzen, wodurch jede Interaktion mit dem Treiber deaktiviert wird, wenn ein Zielmodulname angegeben wird.
Um dies zu erreichen, durchläuft ABYSSWORKER die Treiberobjekte in den Objektverzeichnissen Driver und Filesystem . Für jedes Treiberobjekt wird der zugrunde liegende Modulname mit dem Zielmodul verglichen, und wenn sie übereinstimmen, werden alle Hauptfunktionen durch IopInvalidDeviceRequestersetzt.
Mini-Filtergeräte (0x222440) abnehmen
Dieser Handler durchläuft alle Treiberobjekte, die in den Objektverzeichnissen Driver und FileSystem gefunden wurden. Für jeden Treiber wird die Gerätestruktur untersucht und alle Geräte getrennt, die dem Minifiltertreiber zugeordnet sind: FltMgr.sys.
Die Funktion funktioniert, indem sie über die Geräte des Treibers über die AttachedDevice - und NextDevice Zeiger iteriert, den Modulnamen des jedem Gerät zugeordneten Treibers abruft und ihn mit dem Namen des Zielmoduls vergleicht, der als Parameter übergeben wird (”FltMgr.sys”). Wenn die Namen übereinstimmen, wird die Funktion IoDetachDevice verwendet, um die Verknüpfung des Geräts aufzuheben.
Beenden von Systemthreads nach Modulname (0x222408)
Dieser Handler iteriert über Threads, indem er ihre Thread-IDs mit Brute-Force erzwingt und sie beendet, wenn es sich bei dem Thread um einen Systemthread handelt und seine Startadresse zum Zielmodul gehört.
Um den Thread zu beenden, stellt die Malware einen APC (asynchroner Prozeduraufruf) in die Warteschlange, um Code im Kontext des Ziel-Threads auszuführen. Nach der Ausführung ruft dieser Code wiederum PsTerminateSystemThreadauf.
Prozess beenden und Thread beenden (0x222144, 0x222140)
Mit diesen beiden Handlern können Sie jeden Prozess oder Thread anhand seiner PID oder Thread-ID (TID) mit PsTerminateProcess und PsTerminateThreadbeenden.
Entfernen von Hooks aus den Hauptfunktionen von Ntfs- und Pnp-Treibern (0x222444)
Zusätzlich zur Registrierung von Benachrichtigungsrückrufen binden einige EDRs gerne wichtige Funktionen des NTFS und PNP Treiber ein. Um diese Hooks zu entfernen, kann die Malware diesen Treiber aufrufen, um die ursprünglichen Hauptfunktionen dieser Treiber wiederherzustellen.
ABYSSWORKER iteriert einfach über jede registrierte Hauptfunktion, prüft, ob die Funktion zum Treibermodul gehört, und wenn nicht, bedeutet dies, dass die Funktion eingehakt wurde, also ersetzt es sie durch die ursprünglichen Funktionen.
Neustart 0x222664
Um den Rechner neu zu starten, verwendet dieser Handler die undokumentierte Funktion HalReturnToFirmware.
Beispiel für eine Client-Implementierung
In diesem Blogbeitrag stellen wir ein Beispiel für eine Implementierung eines kleinen Clients vor. Dieses Beispiel funktioniert mit dem Referenzbeispiel und wurde zum Debuggen verwendet, implementiert jedoch nicht alle IOCTRLs für den Treiber und wird wahrscheinlich in Zukunft nicht aktualisiert.
Es enthält jedoch alle Funktionen, um es zu aktivieren und seine API zu laden, daher hoffen wir, dass jeder motivierte Leser mit Hilfe der Informationen in diesem Artikel in der Lage sein wird, es zu erweitern und weiter mit dieser Malware zu experimentieren.
Das Repositorium des Projekts ist hier verfügbar.
Malware und MITRE ATT&CK
Elastic verwendet das MITRE ATT&CK-Framework , um gängige Taktiken, Techniken und Verfahren zu dokumentieren, die Bedrohungen gegen Unternehmensnetzwerke einsetzen.
Taktiken
Techniken
Techniken stellen dar, wie ein Angreifer ein taktisches Ziel erreicht, indem er eine Aktion ausführt.
- Datei- und Verzeichnisberechtigungen manipuliert
- Deaktivieren oder Ändern von Werkzeugen
- Unterzeichnen von Codes
Gegenmaßnahmen
YARA
Elastic Security hat die folgenden YARA-Regeln im Zusammenhang mit diesem Beitrag erstellt:
Beobachtungen
Die folgenden Observablen wurden in dieser Studie diskutiert:
| Überwachbar | Typ | Referenz | Datum |
|---|---|---|---|
6a2a0f9c56ee9bf7b62e1d4e1929d13046cd78a93d8c607fe4728cc5b1e8d050 | SHA256 | ABYSSWORKER Referenzbeispiel | VT zuerst gesehen: 2025-01-22 |
b7703a59c39a0d2f7ef6422945aaeaaf061431af0533557246397551b8eed505 | SHA256 | ABYSSWORKER-Beispiel | VT zuerst gesehen: 2025-01-27 |
Referenzen
- Google Cloud Mandiant, Mandiant Intelligenz. Ich schwöre feierlich, dass mein Fahrer nichts Gutes im Schilde führt: auf der Jagd nach Attestation Signed Malware. https://cloud.google.com/blog/topics/threat-intelligence/hunting-attestation-signed-malware/
- Unit42, Jerome Tujague, Daniel Bunce. Crypted Hearts: Expoposing the HeartCrypt Packer-as-a-Service-Operation, 13. Dezember 2024. https://unit42.paloaltonetworks.com/packer-as-a-service-heartcrypt-malware/
- ConnectWise, Blake Eakin. "Angreifer, die Microsoft Teams-Standardeinstellungen und Quick Assist für Social-Engineering-Angriffe nutzen", 31 . Januar 2025. https://www.linkedin.com/pulse/attackers-leveraging-microsoft-teams-defaults-quick-assist-p1u5c/
- wavestone-cdt, 30. August 2024. https://github.com/wavestone-cdt/EDRSandblast/tree/master
- myzxcg, 24. Mai 2024. https://github.com/myzxcg/RealBlindingEDR
