Unauffällig war die manipulierte Version nicht. Gegenüber der vorherigen Ausgabe 8.13.0 zeigt der Paketvergleich zwei neue Dateien im Verzeichnis dist/: setup.js als kleiner Loader und intro.js. Trotz des Namens ist intro.js laut Analyse kein JavaScript, sondern ein rund 7,8 Megabyte großer Container mit drei gzip-komprimierten nativen Binärdateien für Linux, Windows und macOS.

Beim Installieren wählt setup.js das passende Programm für das jeweilige Betriebssystem aus, schreibt es unter einem zufälligen Namen in das temporäre Systemverzeichnis, markiert es als ausführbar und startet es losgelöst mit unterdrückter Ausgabe. Die Dateien sind nur im auf npm veröffentlichten Paket enthalten, nicht aber im öffentlichen Quellcode. StepSecurity und SafeDep haben die Version jeweils heruntergeladen und analysiert und berichten übereinstimmend, dass es im GitHub-Repository keinen korrespondierenden Commit, Tag oder Pull Request für 8.14.0 gibt.

Nach aktualisierter Analyse von Socket und einer Stellungnahme an The Hacker News handelt es sich bei der Nutzlast um einen in Rust geschriebenen Infostealer für alle drei Plattformen. Er durchsucht Entwicklerrechner nach Geheimnissen und überträgt sie per TLS an einen Ablageserver. Im Fokus stehen Zugangsdaten für AWS, Azure und Google Cloud, einschließlich der Metadaten-Endpunkte, die CI-Runner verwenden. Hinzu kommen Kryptowallets und Seed-Phrasen aus MetaMask, Phantom und Exodus, der Tresor des Passwortmanagers Bitwarden, im Browser gespeicherte Passwörter und Cookies sowie Sitzungen von Discord, Slack, Telegram und Steam.

Die Schadsoftware greift außerdem Konfigurationsdateien von KI-Coding-Werkzeugen an, darunter Claude Desktop, Cursor, Windsurf, VS Code und Zed. Dort liegen laut Quelle häufig API-Schlüssel und Zugangsdaten für Model Context Protocol-Server.

Die Binärdateien können mehr als nur Daten stehlen. Unter Linux bindet die Nutzlast die BPF-Bibliothek des Kernels ein und kann ein eBPF-Programm direkt aus dem Speicher in den Kernel laden. StepSecurity und SafeDep haben diese Fähigkeit beide hervorgehoben; was das eBPF-Programm konkret tut, wird den Angaben zufolge noch untersucht. Die Windows- und macOS-Varianten enthalten Anti-Debugging-Prüfungen und richten Persistenz ein: unter Windows über eine versteckte geplante Aufgabe, die jede Minute neu startet, unter macOS über einen LaunchAgent, der bei der Anmeldung neu geladen wird. Die Command-and-Control-Informationen bleiben in der Binärdatei verschlüsselt und wurden in der statischen Analyse nicht sichtbar.

StepSecurity beobachtete zur Laufzeit Verbindungen zu zwei fest kodierten IP-Adressen sowie zu Tor-Infrastruktur. Das sind die ersten veröffentlichten Netzwerkindikatoren zu der Kampagne. Als Artefakte auf dem betroffenen System nennt die Quelle eine zufällig benannte versteckte Datei im temporären Verzeichnis, im Format .{zufall} beziehungsweise unter Windows .{zufall}.exe, dazu entweder eine versteckte Windows-Aufgabe oder einen macOS-LaunchAgent.

jscrambler wird als Build-Werkzeug typischerweise als Entwicklungsabhängigkeit installiert oder in CI ausgeführt. Genau diese Umgebungen enthalten nach Angaben der Quelle die für den Stealer interessanten Cloud-Schlüssel, Deployment-Token und Quellcodes. Das Paket kommt auf etwa 15.800 Downloads pro Woche; wie viele davon die kompromittierte Version bezogen haben, ist noch unbekannt.

Brisant ist auch der Zeitpunkt. npm 12 wurde am 8. Juli ausgeliefert, drei Tage vor dieser Veröffentlichung, und deaktiviert Installationsskripte für Abhängigkeiten standardmäßig. Auf npm 12 läuft ein preinstall-Hook wie in jscrambler 8.14.0 nur nach ausdrücklicher Freigabe, ältere Clients führen solche Skripte weiterhin automatisch aus.

Inzwischen steht Version 8.15.0 an der Spitze der npm-Versionsliste. Sie wurde vom selben Maintainer-Konto veröffentlicht und löst laut Quelle keine der Malware-Warnungen aus, die 8.14.0 ausgelöst hat: kein Installationsskript, keine gebündelte Binärdatei. Die kompromittierte Version 8.14.0 wurde jedoch nicht entfernt. Sie bleibt auf npm verfügbar, sodass jede Lockfile oder jeder Befehl, der explizit auf diese Version festgelegt ist, den Stealer weiter installiert. Betroffen war nur das Hauptpaket der Kommandozeilenanwendung; die jscrambler-Plugins für webpack, gulp, Metro und grunt blieben bei ihren sauberen Juni-Versionen ohne Installationshaken.