Du betrachtest gerade Jscrambler npm-Paket kompromittiert: Mehrere Versionen verbreiten plattformübergreifenden Infostealer

Jscrambler npm-Paket kompromittiert: Mehrere Versionen verbreiten plattformübergreifenden Infostealer

Jscrambler-Kompromittierung: Wie ein vertrautes npm-Paket zum Plattform-Infostealer wurde

Stellen Sie sich vor, das Werkzeug, das Ihren JavaScript-Code gerade noch vor Reverse Engineering schützen sollte, kopiert stattdessen Ihre Cloud-Keys, Browser-Passwörter und Krypto-Wallets in ein fremdes Backend. Genau das passierte am 11. Juli 2026 Tausenden Entwicklern, die das offizielle npm-Paket jscrambler installierten. Der CLI-Client für die kommerzielle JavaScript-Obfuskations- und Schutzplattform Jscrambler Code Integrity wurde über einen Zeitraum von etwa drei Stunden in fünf verschiedenen Versionen mit einem plattformübergreifenden, in Rust geschriebenen Infostealer trojanisiert.

Dieser Vorfall ist besonders brisant, weil Jscrambler kein obskures Open-Source-Projekt ist. Das in Porto ansässige Unternehmen betreut Kunden weltweit, die das Tool in Build-Pipelines einsetzen. Wenn genau dort – im Werkzeug, das dem Quellcode vertrauensvoll die letzte Härte verleihen soll – ein Angreifer Fuß fasst, zeigt das die blinden Flecken der modernen Software-Supply-Chain. In diesem Artikel analysieren wir den Angriffsverlauf, die technischen Details des Malware-Droppers, die Auswirkungen und konkrete Schritte, wie Unternehmen und Entwickler jetzt reagieren sollten.

Chronologie des Angriffs: Ein Taktikwechsel in Echtzeit

11. Juli 2026 – die Infektionswellen im Detail

Der Angriff begann um 15:12 UTC mit der Veröffentlichung von jscrambler@8.14.0. Diese Version enthielt im Gegensatz zur letzten sauberen Version 8.13.0 vom 30. Juni 2026 zwei neue Dateien unter dist/: setup.js und intro.js. Zusätzlich wurde in die package.json ein preinstall-Hook eingefügt, der sofort beim Installieren das Skript dist/setup.js ausführte. Die Version wuchs damit von 37,8 KB auf 7,9 MB.

Bereits um 17:07 UTC reagierte Jscrambler mit der sauberen Version 8.15.0. Der Maintainer Joao Pinto veröffentlichte einen entsprechenden Commit auf GitHub und holte sich den latest-Dist-Tag zurück. Doch der Angreifer antwortete fast unmittelbar: Um 17:26 UTC erschien 8.16.0 mit identischer Malware erneut. Nur 19 Minuten nach dem sauberen Fix wurde der Angriffsvektor damit wiederhergestellt.

Die folgende Stunde zeigt den beispiellosen Wettlauf um die Kontrolle über den npm-Account. Version 8.17.0 folgte um 17:41 UTC und ergänzte sogar den pnpm-Schalter allowScripts, um auch dort die Ausführung des Hooks zu erzwingen. Um 17:46 UTC wechselte der Angreifer dann die Taktik vollständig: In 8.18.0 wurde der Dropper nicht mehr über preinstall, sondern direkt in den normalen Modul-Code dist/index.js und dist/bin/jscrambler.js eingebettet. Damit lief die Malware bereits beim require('jscrambler') oder beim Aufruf der CLI – ein klassischer npm install --ignore-scripts-Schutz wirkte nicht mehr. Version 8.20.0 wiederholte diese Technik um 17:53 UTC.

Erst mit 8.22.0 um 18:12 UTC gelang es dem Maintainer Vitor Veiga, den latest-Tag endgültig zurückzuerobern. Die sauberen Versionen 8.13.0, 8.15.0 und 8.22.0 sind nach Analyse von SafeDep und StepSecurity byte-identisch. Dennoch bleiben die bösartigen Versionen auf npm verfügbar; Deprecation schützt nicht vor einer Installation über exakte Versionspinning.

Technische Analyse des Droppers: Versteckt in Plain Sight

Der Preinstall-Hook und der Binär-Container

Die erste Angriffswelle nutzte einen bewährten, aber effektiven Mechanismus: den npm-Lifecycle-Hook preinstall. Das Skript dist/setup.js ist nur 43 Zeilen lang, unverschleiert und damit auf den ersten Blick harmlos. Es liest die Datei dist/intro.js, prüft eine fünf Byte lange Magic-Sequenz \x1bCSI\x01, wählt anhand von process.platform den passenden Eintrag aus und entpackt einen gzip-komprimierten nativen Binary in ein zufällig benanntes Dotfile im temporären Verzeichnis des Betriebssystems.

Der Dateiname intro.js ist bewusst irreführend: Die Datei ist kein JavaScript, sondern ein 7,8 MB großer Container mit drei ausführbaren Dateien – je eine für Linux (ELF x86-64), Windows (PE32+ x86-64) und macOS (Mach-O arm64). Der Windows-Pfad zur Dateiendung wird durch String.fromCharCode(46,101,120,101) konstruiert, was auf .exe hinausläuft und einfache String-Matching-Scanner umgeht. Der gestartete Prozess wird mit detached: true, stdio: 'ignore' und proc.unref() vom Installationsprozess losgelöst und läuft auch nach Beendigung von npm install weiter.

Der Runtime-Dropper ab Version 8.18.0

Die Versionen 8.18.0 und 8.20.0 zeigen eine deutliche Eskalation. Hier wurde derselbe Dropper-Code als Immediately Invoked Function Expression (IIFE) in die regulären Einstiegspunkte des Pakets eingefügt. Beim Importieren des Moduls oder beim Ausführen des CLI-Befehls wird dist/intro.js gelesen und das native Binary entpackt. Weil kein preinstall-Hook mehr existiert, erkennen Tools, die nur auf Installationsskripte achten, den Angriff nicht. Zudem wurde eine selbstreferenzierende Abhängigkeit "jscrambler": "^8.17.0" in die package.json eingetragen, die in bestimmten Dependency-Topologien eine kompromittierte Geschwisterversion nachziehen könnte.

Für Administratoren bedeutet dies: Ein negatives Ergebnis bei der Suche nach preinstall– oder postinstall-Skripten reicht nicht mehr aus, um ein npm-Paket als sauber zu bewerten. Die Prüfung muss die eigentlichen Moduldateien und deren Importzeit-Verhalten umfassen.

Fähigkeiten der Rust-Malware: Mehr als nur ein Credential-Grabber

Browserdaten, Passwort-Manager und Krypto-Wallets

Die abgelegten Binaries sind in Rust kompiliert, nutzen die Tokio-Runtime und tragen intern den Projektnamen agent. Die statische Analyse zeigt eine breite Zielpalette. Auf Windows werden die Profilverzeichnisse von Google Chrome, Chromium, Brave, Microsoft Edge und deren Login Data-, Cookies– und Web Data-Datenbanken ausgelesen. Dazu kommt ein eingebetteter SQLite- sowie LevelDB-Parser, der auch den lokalen Speicher von Browser-Erweiterungen wie MetaMask erreicht.

Besonders alarmierend ist die explizite Adressierung der Bitwarden-Browsererweiterung. Die Erweiterungs-ID nngceckbapebfimnlniiiahkandclblb ist im Windows-Binary hartkodiert. Auch Steam-Sitzungscookies wie steamLoginSecure und sessionid werden gezielt gesammelt. Die Sicherheitsfirma StepSecurity stellte fest, dass die gestartete Payload zudem Verbindungen zu den IPs 37.27.122[.]124 und 57.128.246[.]79 sowie zur Tor-Infrastruktur aufbaut.

Darüber hinaus greift die Malware über den lokalen Rechner hinaus. Sie implementiert AWS Signature Version 4 und kann damit mit gestohlenen Cloud-Credentials auf AWS Secrets Manager und den AWS Systems Manager Parameter Store zugreifen – inklusive der Anforderung WithDecryption: true für verschlüsselte Werte. Auch HashiCorp Vault-API-Antworten können geparst werden, sodass ein kompromittierter Entwicklerrechner schnell zur Kompromittierung der gesamten Cloud-Infrastruktur führt.

Kernel-Level-Fähigkeiten und Persistenz

Das Linux-Binary geht noch tiefer. Es bindet libbpf.so.1 ein und importiert Funktionen wie bpf_object__open_mem sowie bpf_object__load. Das bedeutet: Die Malware kann ein eBPF-Programm direkt aus dem Arbeitsspeicher in den Kernel laden, ohne dass ein Dateiartefakt auf der Festplatte entsteht. Zusammen mit der Ausnutzung generischer syscall-Aufrufe anstelle benannter Wrapper bleibt diese Fähigkeit für herkömmliche dynamische Analysen schwer greifbar.

Auf Windows und macOS sorgt die Malware für dauerhafte Persistenz. Unter Windows erstellt sie eine versteckte Aufgabe im Taskplaner, die im Abstand von einer Minute bis zu 999 Mal neu startet, falls der Prozess beendet wird. Unter macOS wird ein LaunchAgent in ~/Library/LaunchAgents/ abgelegt, der sowohl beim Login als auch alle 30 Sekunden über KeepAlive und StartInterval aktiv bleibt. Diese Maßnahmen zeigen, dass der Angreifer längerfristigen Zugriff anstrebte, nicht nur einen einmaligen Datenraub.

Indikatoren und betroffene Versionen im Überblick

Die folgende Tabelle fasst die Versionen, deren Status und die wichtigsten technischen Merkmale zusammen. Sie dient als schnelle Referenz für Audits und Incident-Response-Checks.

Version Veröffentlicht (UTC) Status Dropper-Mechanismus
8.13.0 30. Juni 2026 Sauber Keiner; letzte saubere Referenz
8.14.0 11. Juli, 15:12 Bösartig, deprecated preinstall: node dist/setup.js
8.15.0 11. Juli, 17:07 Sauber Keiner; erster Fix-Versuch
8.16.0 11. Juli, 17:26 Bösartig, deprecated preinstall; identische Payload
8.17.0 11. Juli, 17:41 Bösartig, deprecated preinstall + allowScripts für pnpm
8.18.0 11. Juli, 17:46 Bösartig, nicht deprecated Runtime-Dropper in dist/index.js und CLI
8.20.0 11. Juli, 17:53 Bösartig, nicht deprecated Runtime-Dropper; byte-identisch zu 8.18.0
8.22.0 11. Juli, 18:12 Sauber, aktuelles latest Keiner; byte-identisch zu 8.13.0/8.15.0

Die Datei dist/intro.js hat in allen bösartigen Versionen dieselbe SHA256-Prüfsumme: a41a523ef9517aab37ed6eea0ec881821bdcb7aefcb5c5f603adc7907f868c86. Die Payloads selbst weisen folgende Hashes auf: Linux fbbcf4d8f98168f78f5c0c47a9ae56d59ec8ac84a7c9ca6b797fedfb8d62d2bd, Windows b7ca95d1b23c8e67416a25cedf741de0917c2096bbc9d24649eea7853d054903 und macOS c8fd47d36bdf7c825378593ab82ed8c24d1dc52e26b507812393e24e1d5201fd. Diese Werte können direkt in EDR-, SIEM- oder YARA-Regeln übernommen werden.

Was Unternehmen jetzt tun müssen

Unmittelbare Reaktion auf eine Installation

Wenn jscrambler@8.14.0, 8.16.0, 8.17.0, 8.18.0 oder 8.20.0 in Ihrer Umgebung installiert wurde, muss der betroffene Host als kompromittiert behandelt werden. Das gilt unabhängig davon, ob der Prozess aktiv erscheint, da die Payload sofort nach dem Entpacken im Hintergrund gestartet wurde. Der erste Schritt ist die Deinstallation der betroffenen Version und der Wechsel auf 8.22.0 oder höher beziehungsweise auf die bekannte saubere Version 8.13.0.

Anschließend müssen alle auf dem Rechner oder der CI-Pipeline erreichbaren Secrets als kompromittiert betrachtet werden. Dazu gehören Cloud-Credentials für AWS, Azure und Google Cloud, npm- und GitHub-Tokens, API-Keys für KI-Tools wie Claude Desktop, Cursor, Windsurf oder VS Code, Discord-, Slack-, Telegram- und Steam-Sitzungen sowie Browser-gespeicherte Passwörter. Wer die Bitwarden-Erweiterung genutzt hat, sollte das Master-Passwort ändern und die gehosteten Vaults prüfen.

Forensische Spuren und Netzwerkindikatoren

Auf Linux- und macOS-Systemen sollten Administratoren das temporäre Verzeichnis nach versteckten Dateien der Form .[a-z0-9]{6,} durchsuchen. Unter Windows lautet das Muster .[a-z0-9]{6,}.exe im %TEMP%-Ordner. Der Windows-Taskplaner muss auf versteckte, wiederkehrende Aufgaben mit einer Neustart-Intervalle von einer Minute geprüft werden. Unter macOS ist ~/Library/LaunchAgents/ auf unbekannte plist-Dateien zu untersuchen.

Netzwerkseitig sollten ausgehende Verbindungen zu den IPs 37.27.122[.]124 und 57.128.246[.]79 sowie zu check.torproject[.]org und archive.torproject[.]org blockiert und retrospektiv in Proxy- und Firewall-Logs gesucht werden. Die C2-Kommunikation nutzt einen verschlüsselten Bearer-Token- und Cookie-basierten HTTP-Dialog, den StepSecurity und SafeDep aus den Binaries rekonstruiert haben.

Lessons Learned: Supply-Chain-Sicherheit neu denken

Vom Installations- zum Importzeit-Angriff

Der Jscrambler-Zwischenfall zeigt, dass Lifecycle-Skripte nur noch die halbe Wahrheit sind. Sicherheitsteams, die ausschließlich auf preinstall-Hooks achten, verpassen Runtime-Dropper, die beim Modul-Import zuschlagen. Eine wirksame Verteidigung muss daher Paket-Diffs, Reputations-Scoring, kurze Cooldown-Perioden für neu veröffentlichte Versionen und Runtime-Überwachung kombinieren. Tools wie StepSecurity Secure Registry oder SafeDep Package Manager Guard setzen genau auf diese Prinzipien, indem sie neue Versionen vor der Auslieferung an Entwickler und CI-Runner kurzzeitig zurückhalten und auf Malware-Indikatoren prüfen.

Auch die Einführung von npm 12 am 8. Juli 2026, das Lifecycle-Skripte standardmäßig deaktiviert, kam drei Tage zu spät, um die erste Welle zu verhindern. Sie ist dennoch richtungsweisend: Teams sollten schnellstmöglich auf npm 12 umsteigen und genehmigte Skripte explizit whitelisten. Zusätzlich hilft das strikte Pinnen von Versionsnummern in Lockfiles kombiniert mit Hash-Verifizierung über package-lock.json und npm audit.

Warum CI/CD-Pipelines besonders gefährdet sind

Jscrambler ist ein Build-Tool. Es wird in CI/CD-Pipelines installiert, die Zugriff auf Quellcode, Deploy-Keys, Container-Registry-Tokens und Cloud-Credentials haben. Ein Infostealer in dieser Umgebung kann weitaus mehr Schaden anrichten als auf einem einzelnen Entwickler-Laptop. Unternehmen sollten daher Pipeline-Secrets von Build-Jobs isolieren, kurzlebige OIDC-Tokens statt langfristiger API-Keys verwenden und jede Pipeline als potenziell kompromittierbar behandeln. Wenn ein Tool wie Jscrambler in einer Pipeline läuft, gehört es zu den am höchsten privilegierten Komponenten und verdient dementsprechende Überwachung.

Im Fokus: Jscrambler als Weckruf für die Branche

Die Kompromittierung des offiziellen jscrambler-Pakets am 11. Juli 2026 ist mehr als ein weiterer Eintrag in der langen Liste npm-basierter Supply-Chain-Angriffe. Sie zeigt, wie schnell ein Angreifer die Verteidigung eines etablierten Anbieters überrennen kann – und wie wichtig es ist, Sicherheit nicht nur auf den Installationszeitpunkt, sondern auf die gesamte Lebensdauer einer Abhängigkeit auszudehnen.

Für Entwickler und Administratoren bleibt die zentrale Erkenntnis: Vertrauen ist kein Ersatz für Verifizierung. Jede neue Version eines Pakets, auch wenn sie vom gleichen Maintainer kommt, sollte kurzzeitig durch automatisierte Sicherheitsgates laufen. Wer jscrambler in Projekten oder Pipelines nutzt, sollte umgehend prüfen, ob eine der betroffenen Versionen je installiert wurde, alle potenziell kompromittierten Secrets rotieren und auf eine saubere Version wechseln. Die vollständigen technischen Details, Indicators of Compromise und die detaillierte Timeline finden sich in den Analysen von The Hacker News, StepSecurity, SafeDep sowie im offiziellen Jscrambler Security Advisory. Darüber hinaus beleuchten unsere früheren Artikel gefälschte SDKs auf npm und PyPI sowie der Red-Hat-NPM-Angriff das wiederkehrende Risiko kompromittierter Paketregistries aus weiteren Perspektiven. Auch unsere Analyse Atomic Lockfile zeigt, wie tief Infostealer mittlerweile ins System vordringen können – ein Muster, das sich hier bei Jscrambler bestätigt.