“Das npm-Paket imgdecode versteckt einen bösartigen Loader in einem kompilierten Node.js-Addon”, erklärte SafeDep. “Seine neunzeilige JavaScript-Datei lädt eine Windows-DLL. Wenn ein Node.js-Programm von einer Windows-Konsole aus require(‘imgdecode’) aufruft, versucht die DLL, verschlüsselten Shellcode von GitHub herunterzuladen. Sie entschlüsselt die Antwort und injiziert das Ergebnis in einen neuen dllhost.exe-Prozess.”
MALFEX wurde zuerst von Checkmarx und CloudSEK dokumentiert. Dahinter steht eine langlaufende Kampagne, in der ein unbekannter Akteur seit dem 6. August 2023 bösartige Pakete auf npm veröffentlicht, um Windows-Systeme zu kompromittieren. Genutzt wurden fünf Publisher-Handles: malfexkkj, malfex_user, malfexteste2, malfexteste3 und malfexteste4. Von den acht identifizierten Paketen dienten drei als Loader für den Overlord RAT, drei weitere – “cdn-img-fetch”, “img-to-native” und “native-runner” – arbeiteten zusammen, um einen Node.js-Stealer herunterzuladen und auszuführen. Ein dritter Infektionsweg nutzte einen postinstall-Hook, über den JavaScript einen externen Server kontaktierte und eine nicht näher bestimmte Binärdatei der nächsten Stufe abrief.
Auffällig ist, dass der Akteur offenbar auf öffentliche Veröffentlichungen und npm-Löschungen reagiert: Innerhalb von zwei Tagen erschienen mit “runhelper” und “imgbundle” Ersatzpakete für “native-runner” und “img-to-native”. Der zeitliche Ablauf:
- September 2026: cdn-img-fetch, img-to-native und native-runner 1.0.0 veröffentlicht
- September 2026, 16:06 UTC: npm entfernt native-runner und img-to-native
- September 2026, 03:29 UTC: imgbundle 1.0.0 als Ersatz für img-to-native veröffentlicht
- September 2026, 03:37 UTC: runhelper 1.0.0 als Ersatz für native-runner veröffentlicht
- September 2026, 16:13 UTC: runhelper zurückgezogen
- September 2026, 22:32 UTC: imgdecode 1.0.0 veröffentlicht
- September 2026, 23:07 UTC: imgdecode 1.0.1 veröffentlicht
- Oktober 2026, 17:48 UTC: imgdecode 1.0.2 veröffentlicht
- Oktober 2026, 23:06 UTC: npm entfernt imgbundle
- Oktober 2026, 13:03 UTC: npm entfernt cdn-img-fetch
- Oktober 2026, 22:09 UTC: imgdecode 1.0.3 veröffentlicht
Die Stealer-Kette kommt ohne Install-Hook aus: Der Schadcode läuft erst, wenn “native-runner” geladen wird. Das Paket führt “img-to-native” als Abhängigkeit, das wiederum “img-to-native” als Abhängigkeit listet. Die Aufgabenverteilung im Einzelnen: “cdn-img-fetch” lädt die Datei “banner.png” aus dem GitHub-Repository “cavecrew/proj” herunter und extrahiert daraus einen verschlüsselten Blob. “img-to-native” entschlüsselt diesen mit dem Schlüssel “malfexteam2027” und schreibt den Inhalt als Go-Programm nach “%APPDATA%\Microsoft\Windows\node_runtime_helper.exe”. “native-runner” führt die Datei aus, die daraufhin die Stealer-Binärdatei (“setup.exe”, auch “movinlike”) von “104.234.65[.]75:700” nachlädt.
“Runhelper”, beworben als Hilfswerkzeug zum “Starten nativer Binärdateien aus Node.js-Projekten”, arbeitet ähnlich wie “native-runner”: Es sucht eine JPG-Datei (“cdn-img-fetch/.runtime/rt.jpg”), extrahiert daraus Shellcode, kopiert ihn in ausführbaren Speicher und startet ihn über Koffi, ein Foreign-Function-Interface-Modul für Node.js.
“Sechs Stunden nachdem runhelper zurückgezogen wurde, veröffentlichte der Betreiber imgdecode mit einer kompilierten DLL zur Ausführung des Shellcodes”, so SafeDep. “Ab Version 1.0.1 lädt und entschlüsselt die DLL auch die Nutzlast. Die Versionen 1.0.1 und 1.0.2 rufen vor dem Laden der DLL weiterhin require(‘imgbundle’) auf. Version 1.0.3 entfernt diese Abhängigkeit und benötigt kein anderes MALFEX-Paket mehr.”
Wie zuvor “runhelper” wartet Version 1.0.0 von “imgdecode” darauf, dass “imgbundle” eine Datei unter “cdn-img-fetch/.runtime/” ablegt, liest deren Inhalt in den Speicher und übergibt ihn einem nativen Node.js-Addon zur Dekodierung. Bei dem Addon handelt es sich um eine 64-Bit-DLL, erstellt mit Microsoft Visual C++. Sie prüft zunächst, ob sie in einem Entwickler-Terminal läuft, holt anschließend die Datei “banner.jpg” aus demselben Repository “cavecrew/proj”, entschlüsselt die eingebettete Nutzlast mit dem Schlüssel “nif-runtime-2027” und injiziert das Ergebnis in “dllhost.exe”.
“Nach der Entschlüsselung prüft die DLL die ersten Bytes des Klartexts”, erläuterte SafeDep. “Stimmen sie mit einer JPEG- oder PNG-Signatur überein, bricht die DLL ab. Schlussfolgerung: Der Betreiber könnte den Loader abschalten, indem er verschlüsselte Inhalte ausliefert, die zu einem Bild entschlüsseln. Die Auslieferung eines gewöhnlichen Bildes würde dagegen in der Regel schon vor dieser Prüfung zu einem Entschlüsselungsfehler führen.”
Das GitHub-Konto “cavecrew” ist nicht mehr erreichbar. Eine auf den 6. Oktober 2026 datierte Aufnahme der Bilddatei aus dem Internet Archive zeigt jedoch, dass es sich um denselben Go-basierten Downloader handelt, der den Node.js-Stealer und das Fernwartungswerkzeug “movinlike” von “104.234.65[.]75:700” nachlädt.
Die Node.js-Anwendung enthält eine .env-Datei mit einer C2-Adresse (“104.234.65[.]75:7007”) und einem MALFEX-Lizenzschlüssel – ein Hinweis auf einen Malware-Baukasten oder ein Lizenzsystem zur Erstellung solcher Nutzlasten. Vor der Ausführung prüft die Schadsoftware auf virtuelle Maschinen, Sandboxes und Analysewerkzeuge wie Process Monitor und Wireshark. Danach sammelt sie Dateien, die Seed-Phrasen oder bestimmten Endungen entsprechen (.kdbx, .pem, .ppk und .env), sowie Daten aus Chromium-basierten Browsern, Discord, Telegram, Kryptowährungs-Wallets und Spieleplattformen (Steam, Epic Games, Riot, Battle.net, Minecraft und Ubisoft).
Über eine WebSocket-Verbindung zum C2-Server nimmt die Malware Befehle entgegen – für Shell-Ausführung, Dateitransfer, Prozesssteuerung, Zugriff auf die Zwischenablage, Screenshots sowie Maus- und Tastatureingaben. Zur Persistenz legt sie einen Registry-Run-Schlüssel an und erstellt eine geplante Aufgabe namens “MicrosoftEdgeUpdateService”.
Entwickler, die eines der genannten Pakete installiert haben, sollten ihre Windows-Systeme als möglicherweise kompromittiert behandeln, sie isolieren, auf Persistenzeinträge prüfen, Zugangsdaten wechseln und Guthaben auf neue Wallets übertragen, falls dort Seed-Phrasen gespeichert waren.
