Am 30. März 2026 wurde das weit verbreitete NPM-Paket axios durch nordkoreanische Angreifer kompromittiert. Über einen übernommenen Maintainer-Account veröffentlichten sie zwei manipulierte Versionen, die den Remote-Access-Trojaner „WAVESHAPER.V2“ für Windows, macOS und Linux enthielten.
Enginsight nutzt das Paket ebenfalls, hatte die spezifische, kompromittierte Version (1.14.1) aber nicht installiert und ist somit nicht betroffen!
Betroffene Versionen und Sicherheitskennungen
Zwei manipulierte axios-Versionen wurden über den kompromittierten Account veröffentlicht, beide mit einer neuen bösartigen Abhängigkeit plain-crypto-js:
| Paket | Version | npm-Tag | Status |
|---|---|---|---|
| axios | 1.14.1 | latest | Entfernt durch npm |
| axios | 0.30.4 | legacy | Entfernt durch npm |
| plain-crypto-js | 4.2.1 | — | Security Hold, ersetzt durch Stub 0.0.1-security.0 |
| plain-crypto-js | 4.2.0 | — | Sauberes Täuschungspaket (18h vorher veröffentlicht) |
Sichere Versionen: axios@1.14.0 (letztes legitimes 1.x-Release) und axios@0.30.3 (letztes legitimes 0.x-Release). Weitere betroffene Pakete im Ökosystem: @shadanai/openclaw (mehrere Versionen) und @qqbrowser/openclaw-qbot@0.0.130, die den manipulierten axios transitiv auslieferten.
Ablauf des Angriffs
Die Angriffskette begann mit der Vorbereitung einer bösartigen Abhängigkeit. Der Angreifer veröffentlichte zunächst das Paket plain-crypto-js als nahezu identischen Klon von crypto-js, um Vertrauen aufzubauen und eine unauffällige Historie in der npm-Registry zu erzeugen. Wenige Stunden später folgte eine neue Version, die ein manipuliertes postinstall-Skript enthielt.
Anschließend wurden zwei scheinbar legitime axios-Versionen veröffentlicht. Der einzige Unterschied bestand darin, dass sie die präparierte Abhängigkeit plain-crypto-js einbanden. Der eigentliche Schadcode befand sich somit nicht direkt in axios, sondern versteckt in dieser transitiven Abhängigkeit.
Beim Ausführen von npm install wurde automatisch das bösartige postinstall-Skript gestartet. Dieses war stark verschleiert, entschlüsselte sich zur Laufzeit und lud benötigte Systemfunktionen dynamisch nach. Danach identifizierte es das Betriebssystem und nahm Kontakt zu einem Command-&-Control-Server auf.
Im nächsten Schritt wurde je nach Plattform ein passender Remote-Access-Trojaner nachgeladen und ausgeführt. Dabei nutzte der Angreifer Tarntechniken, etwa unauffällige Domainnamen, um die Kommunikation weniger verdächtig erscheinen zu lassen.
Abschließend führte die Malware Anti-Forensik-Maßnahmen durch. Dabei löschte das Installationsskript sich selbst und manipulierte Dateien so, dass die Installation wie eine harmlose Version wirkte. Sicherheitsprüfungen wie npm audit schlugen daher nicht an. Der einzige verbleibende Hinweis auf eine Kompromittierung war das Vorhandensein des verdächtigen Pakets im node_modules-Verzeichnis.
Indicators of Compromise
Malicious npm Packages
- axios@1.14.1 · shasum: 2553649f2322049666871cea80a5d0d6adc700ca
- axios@0.30.4 · shasum: d6f3f62fd3b9f5432f5782b62d8cfd5247d5ee71
- plain-crypto-js@4.2.1 · shasum: 07d889e2dadce6f3910dcbc253317d28ca61c766
Network Indicators
- C2 domain · sfrclak.com
- C2 IP · 142.11.206.73
- C2 URL · http://sfrclak.com:8000/6202033
- C2 POST body (macOS) · packages.npm.org/product0
- C2 POST body (Windows) · packages.npm.org/product1
- C2 POST body (Linux) · packages.npm.org/product2
File System Indicators
- macOS · /Library/Caches/com.apple.act.mond
- Windows (persistent) · %PROGRAMDATA%\wt.exe
- Windows (temp, self-deletes) · %TEMP%\6202033.vbs
- Windows (temp, self-deletes) · %TEMP%\6202033.ps1
- Linux · /tmp/ld.py
Attacker-Controlled Accounts
- jasonsaayman · compromised legitimate axios maintainer, email changed to ifstap@proton.me
- nrwise · attacker-created account, nrwise@proton.me, published plain-crypto-js
Erkennung durch Enginsight SIEM
Die Streams wurden anhand der unten aufgeführten Quellen erarbeitet. Da das Paket nicht mehr zur Verfügung steht, konnten bisher keine Tests durchgeführt werden.
Kill Chain Windows:
- Der Entwickler hat auf axios@1.14.1 aktualisiert, wodurch automatisch der postinstall- Hook, über das Paket plain-crypto-js ausgeführt wird. Dadurch erzeugt node eine cmd.exe oder cscript.exe als Kindprozess
sysmon.EventID:"1" AND sysmon.ParentImage_str:"node" AND (sysmon.Image_str:"cmd.exe" OR sysmon.Image_str:"cscript.exe") - Es wird eine Verbindung zum C2 Server aufgebaut (siehe Indicators of Compromise)
sysmon.EventID:"3" AND gen.dest.ip_str: "142.11.206.73" AND (gen.dest.port:"8000" OR gen.dest.port:"3000") - Es wird eine unbenannte Powershell-Kopie wt.exe und eine versteckte Batch Datei system.bat (als Fallback Loader) in %PROGRAMDATA% abgelegt. %PROGRAMDATA% erfordert keine Admin-Rechte und wird von vielen AV-Lösungen weniger restriktiv behandelt.
sysmon.EventID:"11" AND sysmon.TargetFilename_str:in("C:\ProgramData\wt.exe", "C:\ProgramData\system.bat") - Als letzten Schritt schreibt der Dropper den Registry-Eintrag HKCU\Software\Microsoft\Windows\CurrentVersion\Run\MicrosoftUpdate mit dem Wert %PROGRAMDATA%\system.bat Damit wird sichergestellt, dass system.bat bei jedem Login des aktuellen Benutzers automatisch ausgeführt wird
sysmon.EventID:"13" AND sysmon.TargetObject_str: "\CurrentVersion\Run\MicrosoftUpdate"
Quellen:

