Shai-Hulud: npm-Wurm infiziert keyv und über 430 Pakete

Schritt für Schritt
So lief der Shai-Hulud-Angriff ab
Klicken Sie auf eine Phase für Details – oder lassen Sie die Animation durchlaufen.
PHASE 1/7 · Erstzugriff

Angreifer kaperten das GitHub-Konto des keyv-Maintainers Jared Wray und pushten am 4. August 2026 einen vergifteten Commit.

T1195.002 – Supply Chain Compromise: Compromise Software Supply Chain T1078 – Valid Accounts
  • Übernahme des Kontos von Maintainer Jared Wray (Paket keyv)
  • Erster bösartiger Commit um 09:02:37 in jaredwray/keyv (Version 6.0.0)
  • keyv wird ca. 127–153 Mio. Mal pro Woche heruntergeladen
  • Injektion von setup.mjs und Math_Symbol.js
PHASE 2/7 · Ausführung

Beim npm install startete der preinstall-Hook das Skript setup.mjs, lud die Bun-Runtime nach und führte verschleierten Schadcode aus.

T1059.007 – Command and Scripting Interpreter: JavaScript T1204.003 – User Execution: Malicious Image
  • Ausnutzung des npm-Lifecycle-Skripts preinstall
  • setup.mjs lädt Bun-Runtime 1.3.13 von GitHub nach
  • Ausführung von 728 KB verschleiertem Schadcode (Math_Symbol.js / math_init.js)
  • Gültige SLSA-Provenance über GitHub Actions OIDC – Prüfungen wirkungslos
PHASE 3/7 · Sammlung von Zugangsdaten

Der Credential-Stealer durchsuchte das System systematisch nach Cloud-, CI/CD- und Server-Zugangsdaten.

T1552.001 – Unsecured Credentials: Credentials In Files T1552.005 – Cloud Instance Metadata API T1528 – Steal Application Access Token
  • Cloud-Schlüssel für AWS, GCP und Azure
  • HashiCorp Vault Tokens und Kubernetes-Service-Accounts
  • GitHub- und npm-Tokens sowie SSH-Keys
  • Verschlüsselung der Beute mit AES-256-GCM
PHASE 4/7 · Persistenz

Die Malware nistete sich über IDE-Konfigurationsdateien ein und sicherte sich mit einem Dead-Man's-Switch ab.

T1546 – Event Triggered Execution T1554 – Compromise Host Software Binary
  • Hooks in .vscode/tasks.json und .claude/settings.json
  • Erneute Ausführung beim Öffnen des Projekts
  • Dead-Man's-Switch überwacht das gestohlene GitHub-Token
  • Widerruf des Tokens löst Löschfunktion aus
PHASE 5/7 · Seitwärtsbewegung / Wurm-Verbreitung

Mit gestohlenen CI-Credentials kopierte sich der Wurm selbstständig auf hunderte weitere Pakete.

T1195.002 – Supply Chain Compromise: Compromise Software Supply Chain T1078 – Valid Accounts
  • Beginn der zweiten Welle um 09:38:13 mit @thiennq/docs-viewer@1.6.2
  • Infektion des cacheable-Namensraums (flat-cache@6.1.24, file-entry-cache@11.1.6)
  • Über 433 Pakete in 2.201 Versionen bis 13:20 Uhr betroffen
  • Verbreitung auf über 14 Organisationen (u.a. @servicetitan, @onereach, @qlik)
PHASE 6/7 · Exfiltration

Die verschlüsselten Zugangsdaten wurden über GitHub-Repositories und dynamisch verteilte Kontrollserver abgezogen.

T1567 – Exfiltration Over Web Service T1567.001 – Exfiltration to Code Repository
  • Neue GitHub-Repos mit Titel 'Shai-Hulud: Here We Go Again'
  • Wechselnde C2-Server, adressiert über einen Ethereum-Smart-Contract
  • Verschlüsselung mit einem vom Operator bereitgestellten RSA-Schlüssel
  • Daten mit AES-256-GCM gesichert
PHASE 7/7 · Auswirkung

Über 2 Milliarden monatliche Downloads waren betroffen, mit potenziellem Zugriff auf Produktionssysteme und Kundendaten.

T1195.002 – Supply Chain Compromise: Compromise Software Supply Chain
  • Über 440 kompromittierte Pakete in mehr als 2.200 Versionen
  • Mehr als 2 Milliarden monatliche Downloads betroffen
  • Gestohlene Cloud- und CI/CD-Credentials ermöglichen Produktionszugriff
  • DSGVO-Meldepflicht (Art. 33/34) durch Credential-Diebstahl möglich
Kurz & knapp beantwortet
Häufige Fragen zu diesem Vorfall
Bin ich von dem Shai-Hulud-npm-Angriff betroffen?
Betroffen sind alle, die zwischen dem Morgen des 4. August 2026 und der Bereinigung durch npm eine der infizierten Paketversionen installiert oder aktualisiert haben. Prüfen Sie Ihre Lockdateien (package-lock.json, yarn.lock oder pnpm-lock.yaml) auf betroffene Versionen wie keyv 6.0.0, flat-cache 6.1.24 oder file-entry-cache 11.1.6. Da flat-cache und file-entry-cache tiefe transitive Abhängigkeiten sind, stecken sie unbemerkt in fast jedem Node.js-Projekt.
Wie prüfe ich, ob mein Projekt infiziert ist?
Öffnen Sie Ihre Lockdatei und suchen Sie nach den betroffenen Versionen (z.B. keyv 6.0.0, flat-cache 6.1.24, file-entry-cache 11.1.6). Durchsuchen Sie anschließend das Projektverzeichnis nach den Schaddateien setup.mjs, Math_Symbol.js oder math_init.js. Prüfen Sie außerdem auf unerwartete Dateien .vscode/tasks.json oder .claude/settings.json, die einen Aufruf von setup.mjs enthalten.
Was muss ich jetzt tun, wenn ich betroffen bin?
Isolieren Sie zuerst potenziell betroffene Systeme (Entwickler-Rechner und CI/CD-Runner) vom Netzwerk. Entfernen Sie danach den Dead-Man's-Switch (z.B. ~/.local/bin/gh-token-monitor.sh), BEVOR Sie Zugangsdaten widerrufen, sonst kann eine Löschroutine ausgelöst werden. Rotieren Sie erst dann alle Credentials (npm, GitHub, AWS, GCP, Azure, Kubernetes, Vault) und stufen Sie die betroffenen Pakete auf die vorherigen sauberen Versionen zurück.
Warum haben die Sicherheitsprüfungen den Angriff nicht erkannt?
Die Angreifer übernahmen die echte, offizielle Veröffentlichungs-Automatik der Projekte, weshalb alle vergifteten Pakete eine gültige, von GitHub Actions signierte SLSA-Provenance trugen. Diese Herkunftssignatur belegt nur, aus welchem Repository ein Paket stammt – über den tatsächlichen Inhalt sagt sie nichts aus. Deshalb hätten laut StepSecurity Tools, die nur auf gültige Provenance prüfen, das Paket keyv@6.0.0 problemlos durchgewunken.
Bin ich betroffen, wenn ich selbst nicht programmiere, sondern eine Agentur meine Website betreibt?
Viele Web-Projekte basieren im Hintergrund auf Node.js und damit potenziell auf genau diesen Paketen. Fragen Sie Ihren Dienstleister oder Ihre Agentur umgehend, ob und wie er betroffen ist. Da die Malware Cloud-Keys und Datenbank-Zugänge stiehlt, kann laut DSGVO (Art. 33) eine Meldepflicht an die Aufsichtsbehörde binnen 72 Stunden bestehen, wenn Kundendaten gefährdet sind.
Weitere Security-News
Das könnte Sie auch interessieren
Kritische Elementor-Pro-Lücke: Angreifer können WordPress-Seiten komplett übernehmen
Ein Datei-Upload-Bug in Elementor Pro bis 4.2.1 erlaubt RCE ohne Login. Version 4.2.2 schließt die Lücke – jetzt aktualisieren!
Pods-Plugin: Kritische Lücke erlaubt Admin-Übernahme ohne Login
Eine kritische Schwachstelle im WordPress-Plugin Pods lässt Angreifer ohne Login Admin-Passwörter überschreiben. Über 100.000 Sites betroffen.
miniOrange SAML SSO: Kritischer Bypass macht Angreifer zu WordPress-Admins
Zwei kritische Auth-Bypässe im miniOrange SAML SSO Plugin erlauben gefälschte SAML Assertions – bis hin zum vollen Admin-Zugriff.