Kai Ole Hartwig
7 Min. Lesezeit
Hoch

jscrambler-npm-Paket kompromittiert: plattformübergreifender Rust-Infostealer in Version 8.14.0–8.20.0

Am 11. Juli 2026 um 16:12 BST wurde auf npm eine kompromittierte Version des JavaScript-Schutz-Tools jscrambler veröffentlicht: 8.14.0 enthielt einen plattformübergreifenden, in Rust geschriebenen Infostealer, verpackt in einem obfuskierten Binärcontainer. Jscrambler selbst bestätigt in einem offiziellen Advisory ein kompromittiertes Publish-Credential als Ursache. Binnen Stunden folgten vier weitere bösartige Versionen (8.16.0, 8.17.0, 8.18.0, 8.20.0) — ab 8.18.0 ganz ohne Install-Hook, um Scanner zu umgehen, die nur Skripte prüfen. Betroffen sind auch vier abhängige Pakete. Die sichere Version ist 8.22.0.

TL;DR — 90 Sekunden

Betroffen?

jscrambler 8.14.0/8.16.0/8.17.0/8.18.0/8.20.0 sowie jscrambler-webpack-plugin 8.6.2, gulp-jscrambler 8.6.2, grunt-jscrambler 8.5.2, jscrambler-metro-plugin 9.0.2. Sichere Versionen: 8.22.0 bzw. 8.6.3/8.6.3/8.5.3/9.0.3.

Risiko?

Plattformübergreifender Rust-Infostealer: Cloud-Keys (AWS Secrets Manager, GCP-Metadata, Azure IMDS), Krypto-Wallets (MetaMask, Phantom, Exodus), KI-Tool-Configs (Claude Desktop, Cursor-MCP-Server), Browser-/Discord-/Slack-Sessions, Kubernetes-API-Zugänge. Persistenz via Windows-Scheduled-Tasks/macOS-LaunchAgents; auf Linux werden eBPF-Programme direkt in den Kernel geladen.

Sofortmaßnahme?

Betroffene Version(en) sofort entfernen, auf 8.22.0 (bzw. die jeweilige sichere Version) aktualisieren, alle in CI/Dev-Umgebungen erreichbaren Credentials rotieren.

Empfehlung?

Auch wenn nur ~1.479 Downloads über alle bösartigen Versionen gemeldet sind: Wer jscrambler in CI/CD einsetzt, sollte Installationslogs auf dist/setup.js-Ausführung prüfen, unabhängig von der exakten installierten Version.

Kritikalität?

hoch (Hero-Badge) — Kernel-Level-Zugriff unter Linux via eBPF, breite Credential-Abdeckung.

Was ist passiert?

Der Vorfall begann mit einem kompromittierten npm-Publish-Credential, über das ein Angreifer die Version 8.14.0 von jscrambler veröffentlichen konnte — ohne passende Commits im öffentlichen Repository. Socket entdeckte die kompromittierte Version rund sechs Minuten nach Veröffentlichung. Jscrambler selbst erkannte den Vorfall „innerhalb von Sekunden“ über automatische Benachrichtigungen an Paket-Maintainer und deprecatete die Version umgehend.

Der Angreifer blieb aktiv: Am selben Tag folgten 8.16.0 und 8.17.0 (weiterhin über einen preinstall-Hook ausgeliefert), dann 8.18.0 und 8.20.0 — hier verschwindet der Install-Hook komplett, stattdessen wird derselbe Dropper als selbstausführende Funktion beim Modul-Import injiziert, um Scanner zu umgehen, die ausschliesslich Install-Skripte prüfen. Die Payload besteht aus plattformspezifischen Binaries für Linux, macOS und Windows, eingebettet in einem obfuskierten Container (dist/intro.js, laut Analyse rund 7,8 MB), geladen über einen kleinen Loader (dist/setup.js).

Betroffen sind neben dem Hauptpaket vier abhängige Pakete: jscrambler-webpack-plugin 8.6.2, gulp-jscrambler 8.6.2, grunt-jscrambler 8.5.2 und jscrambler-metro-plugin 9.0.2.

Wer ist betroffen?

PaketBetroffene Version(en)Sichere Version
jscrambler8.14.0, 8.16.0, 8.17.0, 8.18.0, 8.20.08.22.0
jscrambler-webpack-plugin8.6.28.6.3
gulp-jscrambler8.6.28.6.3
grunt-jscrambler8.5.28.5.3
jscrambler-metro-plugin9.0.29.0.3

Laut Jscrambler-Advisory liegen die Gesamt-Downloads über alle bösartigen Versionen bei rund 1.479 — die tatsächliche Kompromittierungsrate (wie viele Installationen die Payload tatsächlich ausgeführt haben) ist damit nicht beziffert. Primär betroffen sind Entwicklungsumgebungen und CI/CD-Systeme mit Zugriff auf Deployment-Token und Quellcode.

Auswirkungen

Der Infostealer zielt breit: Cloud-Zugangsdaten (AWS, Azure, GCP), Krypto-Wallets (MetaMask, Phantom, Exodus), Passwort-Manager, Browser-Sessions sowie — bemerkenswert — Konfigurationen von KI-Tools wie Claude Desktop und Cursor-MCP-Servern. Für CI/CD-Umgebungen besonders relevant: Kubernetes-API-Zugriff wird ebenfalls erfasst. Persistenz erfolgt plattformabhängig über Windows-Scheduled-Tasks bzw. macOS-LaunchAgents, inklusive Anti-Debugging-Prüfungen. Unter Linux lädt die Malware eBPF-Programme direkt in den Kernel — ein deutlich tieferer Zugriffsgrad als klassische Userspace-Stealer. Die Exfiltration läuft laut Socket-Analyse über TLS (rustls-Bibliothek) mit Multipart-Form-Uploads; konkrete C2-Domains/IPs sind in den öffentlichen Analysen nicht disclosed.

Für Teams, die jscrambler zum Schutz eigener Production-Bundles einsetzen, liegt die Ironie auf der Hand: ein Sicherheits-Tool wurde selbst zum Einfallstor.

Mitigation / Sofortmassnahmen

Hinweis: Basierend auf dem offiziellen Jscrambler-Advisory und der Socket-Analyse — konkrete Versionsstände gegen die Originalquellen abgleichen.

Operativer Entscheidungsblock

Schritt 1 — betroffene Version entfernen und aktualisieren

 

# Lockfile / package.json auf betroffene Versionen prüfen
grep -E "jscrambler|gulp-jscrambler|grunt-jscrambler" package-lock.json yarn.lock pnpm-lock.yaml 2>/dev/null
# hart auf die sichere Version pinnen
npm install jscrambler@8.22.0 --save-exact
npm install jscrambler-webpack-plugin@8.6.3 gulp-jscrambler@8.6.3 grunt-jscrambler@8.5.3 jscrambler-metro-plugin@9.0.3 --save-exact 2>/dev/null

 

Schritt 2 — Installationslogs und CI-Historie prüfen

 

# CI-Build-Logs auf Ausführung von dist/setup.js durchsuchen
grep -RIn "dist/setup.js\|dist/intro.js" ci-logs/ 2>/dev/null
# Node-Modules-Cache auf betroffene Versionen prüfen
find . -path "*/node_modules/jscrambler/package.json" -exec grep -H '"version"' {} \;

 

Schritt 3 — Credentials rotieren

 

- AWS/Azure/GCP-Keys aller CI-Runner, die das Paket installiert haben
- npm-/Registry-Publish-Token
- Deployment- und Repository-Tokens
- Browser-/Discord-/Slack-Sessions auf betroffenen Entwickler-Maschinen

 

Schritt 4 — Install-Skripte grundsätzlich einschränken

 

# CI: keine Install-Skripte automatisch ausführen
npm ci --ignore-scripts
# und danach gezielt genehmigen, was wirklich gebraucht wird
npm approve-scripts

Detection / Prüfung

Version & Lockfile prüfen

 

npm ls jscrambler jscrambler-webpack-plugin gulp-jscrambler grunt-jscrambler jscrambler-metro-plugin 2>/dev/null

 

Auf Ausführungsspuren prüfen

 

# wurden setup.js/intro.js jemals ausgeführt? CI-Logs und Shell-History prüfen
grep -RIn "dist/setup.js\|dist/intro.js" . 2>/dev/null
# ungewöhnliche geplante Tasks (Windows) bzw. LaunchAgents (macOS) auf Build-Maschinen
schtasks /query /fo LIST /v 2>nul | findstr /i "jscrambler"
ls ~/Library/LaunchAgents/ 2>/dev/null | grep -i jscrambler

 

Laufzeit-Indikatoren

 

- unerwarteter ausgehender TLS-Traffic von Build-/CI-Runnern kurz nach npm install
- neue eBPF-Programme auf Linux-Build-Hosts (bpftool prog list)
- unbekannte AWS-/GCP-/Azure-API-Aufrufe kurz nach CI-Läufen mit betroffenem Paket

Betreiberempfehlung

Mid-Market

Prüfen Sie Lockfiles auf die betroffenen Versionen, aktualisieren Sie auf 8.22.0 (bzw. die jeweils sichere Version) und rotieren Sie vorsorglich Zugangsdaten aus CI-Umgebungen, die das Paket je installiert haben — selbst wenn kein Kompromittierungsnachweis vorliegt.

Enterprise

SBOM-/Dependency-Scan über alle Repositories nach den fünf betroffenen Paketen, inklusive transitiver Abhängigkeiten. Besonders relevant: Der Angriff funktioniert ab Version 8.18.0 ohne Install-Hook — Scanner, die ausschliesslich preinstall/postinstall-Skripte prüfen, übersehen diese Varianten. Statische Analyse auf Modul-Import-Ebene ergänzen.

CI/CD

Standardmässig --ignore-scripts in CI-Pipelines, explizite Allowlist über npm approve-scripts für tatsächlich benötigte Install-Skripte, und ein Blick auf ausgehenden Netzwerk-Traffic von Build-Runnern (Egress-Filtering hätte die TLS-Exfiltration zumindest erschwert).

Häufige Fragen zum jscrambler-Vorfall

Was, wenn ich --ignore-scripts global in CI gesetzt habe?+

Das schützt gegen die frühen Varianten (8.14.0-8.17.0, Install-Hook), nicht gegen 8.18.0/8.20.0, wo der Dropper beim Modul-Import ausgeführt wird. Versions-Pinning bleibt trotzdem die zuverlässigere Massnahme.

Betrifft das nur Nutzer der npm-Version, oder auch andere Distributionswege?+

Das Advisory bezieht sich auf die npm-Registry-Veröffentlichung; laut Jscrambler wurde die Ursache — ein kompromittiertes Publish-Credential — inzwischen widerrufen und rotiert. Andere Distributionskanäle sind in den öffentlichen Quellen nicht als betroffen benannt.

Warum wurde die Version ab 8.18.0 ohne Install-Hook ausgeliefert?+

Um Scanner zu umgehen, die ausschliesslich preinstall/postinstall-Skripte prüfen. Der Dropper wurde stattdessen als selbstausführende Funktion in den Modulcode selbst verlegt, ausgelöst beim Import.

Muss ich meine AWS-/GCP-Keys wirklich rotieren, auch ohne Kompromittierungsnachweis?+

Wenn eine betroffene Version in einer CI-Umgebung mit Zugriff auf diese Keys installiert wurde: ja. Die Malware exfiltriert automatisiert, ein fehlender expliziter Nachweis ist kein Beleg für Unversehrtheit.

Reicht es, nur 8.14.0 zu entfernen?+

Nein — auch 8.16.0, 8.17.0, 8.18.0 und 8.20.0 sind kompromittiert, und ab 8.18.0 fehlt der Install-Hook, was die Erkennung erschwert. Pinnen Sie hart auf 8.22.0 bzw. die sichere Version der jeweils genutzten Zusatzpakete.

Fazit

Der jscrambler-Vorfall zeigt zwei Dinge gleichzeitig: Wie schnell Angreifer nach einem kompromittierten Publish-Credential iterieren (fünf bösartige Versionen an einem Tag), und wie gezielt neuere npm-Supply-Chain-Malware inzwischen Scanner umgeht, die nur auf Install-Skripte schauen. Dass ausgerechnet ein Sicherheits-Tool betroffen war, unterstreicht: Vertrauen in eine Paket-Kategorie ist kein Ersatz für Versions-Pinning, Lockfile-Audits und Egress-Kontrolle in CI.

Quellen

Ich prüfe Ihre Lockfiles auf kompromittierte Pakete, schränke Install-Skripte in CI ein und rotiere betroffene Credentials.

Dependency-Audit gegen aktuelle Supply-Chain-Vorfälle, Einführung von --ignore-scripts/approve-scripts-Allowlisting in CI, Egress-Filtering für Build-Runner, und Credential-Rotation nach Verdachtsfällen.

Plattform-Betrieb statt Beratung auf Papier: Ich prüfe, härte und validiere Ihre npm-/CI-Lieferkette laufend.

Über den Autor

[Translate to English:] Foto von Kai Ole Hartwig.

Kai Ole Hartwig

Freelance DevSecOps consultant · OnlyOle Consulting

Programming since 2002 – self-taught, set up my own business with KO-Web in 2012. Over 100 projects, with a focus on security, performance, automation and quality. Today freelance: DevSecOps consulting, training and software development.

IronWorm, npm, Supply Chain, Worm, Rust, eBPF, Rootkit, Trusted Publishing, OIDC, GitHub Actions, Credential Harvesting, CI/CD, Shai-Hulud, JFrog, Kubernetes, Docker, Bun, DevSecOps

IronWorm (Rust-npm-Worm)

Rust-npm-Worm IronWorm laeuft ueber einen preinstall-Hook, erntet 86 Umgebungsvariablen samt KI-Provider-Keys und ~/.claude-Credentials, publiziert sich in CI ueber npm Trusted Publishing weiter, exfiltriert ohne C2 ueber ausgetauschte GitHub-Actions-Workflows und versteckt sich per eBPF-Rootkit (das bei Kernel-Lockdown auffliegt). Mit Mitigation, Detection-IOCs, Root-Cause-Deep-Dive und Betreiberempfehlung; Paketliste an JFrog delegiert.

npm, Supply-Chain, Mini Shai-Hulud, Miasma, TeamPCP, @redhat-cloud-services, preinstall, GitHub Actions, OIDC, CI/CD, Credential Theft, Cloud Identity, AWS, GCP, Azure, Kubernetes, MCP, Dead-Man-Switch, DevSecOps, NIS-2, DSGVO, Mittelstand

Miasma npm-Wurm (@redhat-cloud-services)

Vorfall-Analyse zur Miasma-Welle: 32 kompromittierte @redhat-cloud-services-npm-Pakete, Variante des open-sourcten Mini-Shai-Hulud von TeamPCP. Patient Zero war ein kompromittierter Red-Hat-Mitarbeiter-GitHub-Account mit Orphan-Commits an zwei RedHatInsights-Repos; Veröffentlichung via GitHub-Actions-OIDC-Trusted-Publishing inkl. Sigstore. preinstall-Hook führt ein 4,2-MB-Obfuskat aus, räumt GitHub/AWS/GCP/Azure/Kubernetes/Vault/npm/SSH/Docker-Credentials ab, sammelt neu auch GCP-/Azure-Cloud-Identitäten, setzt kitty-monitor-Persistenz und einen destruktiven gh-token-monitor-Dead-Man-Switch. Operative Einschätzung: kritisch. Reihenfolge: isolieren, Persistenz entfernen, dann rotieren.

npm, binding.gyp, node-gyp, Supply Chain, Worm, Credential Harvesting, CI/CD, GitHub Actions, Bun, AES-128-GCM, dangling commit, autotel, awaitly, node-env-resolver, StepSecurity, ignore-scripts, DevSecOps

binding.gyp npm-Worm (node-gyp)

Laufender npm-Lieferketten-Vorfall: ein selbst-replizierender Worm nutzt binding.gyp/node-gyp statt postinstall, laedt die Bun-Runtime, erntet Cloud-/Registry-Credentials, injiziert setup-bun in GitHub-Actions-Workflows und vergiftet weitere Pakete des Opfers. Mit Mitigation, Detection-IOCs und Betreiberempfehlung — Paketliste an die Primaerquelle delegiert.