
Scanner für den keyv/cacheable Supply-Chain-Angriff: erkennt kompromittierte npm-Pakete, verifiziert Payload-Hashes und findet Persistenz-Implantate im Repo- und Host-Modus.
Englisch | Português
Eigenständiger Scanner für den keyv/cacheable-Lieferketten-Zwischenfall („Shai-Hulud: Here We Go Again", 4. Aug. 2026) — mehr als 440 npm-Pakete, kompromittiert durch einen sich selbst verbreitenden Wurm, der Cloud-/CI-Anmeldedaten stiehlt und mit einem Dead-Man's Switch Persistenz einrichtet.
Erkennt in Minuten und ohne etwas zu installieren:
package-lock.json, npm-shrinkwrap.json, yarn.lock (v1 und Berry), pnpm-lock.yaml und bun.lock — einschließlich transitiven Abhängigkeiten, mit der vollständigen Kette (z. B. eslint → file-entry-cache → flat-cache → [email protected]);node_modules (Name + SHA-256-Hash der bekannten Artefakte);SUSPECT markiert, niemals ohne Hash bestätigt;.claude/settings.json und .vscode/tasks.json, temporäre Artefakte (bun-dl-*);keyv/cacheable-Familien wurde kompromittiert; der Angreifer veröffentlichte neue Versionen mit einem "preinstall": "node setup.mjs"-Hook — Code, der vor der Installation des Pakets läuft, mit den Rechten dessen, der npm install ausgeführt hat.setup.mjs lädt die Bun-Laufzeit von GitHub herunter und führt die Payload darin aus — eine Umgehung von Tools, die nur node-Prozesse überwachen.Math_Symbol.js (~728 KB, verschleiert) stiehlt Anmeldedaten: AWS-Instance-Metadaten, AWS/GCP/Azure-Schlüssel, Vault-Tokens, Kubernetes-Service-Accounts, GitHub-Actions-Secrets, npm-Tokens sowie einen generischen Regex-Sweep nach privaten Schlüsseln und Bearer-Tokens auf der Platte.npm install/npm ci mit aktivierten Lifecycle-Skripten ausgeführt hat. Mit --ignore-scripts lief der Hook nicht..claude/settings.json (SessionStart) und .vscode/tasks.json (folderOpen), die den Loader beim Öffnen des geklonten Ordners ausführen — kein npm install, nichts installiert. Das betrifft Personen, die das Repo zur Untersuchung des Vorfalls geklont haben, sowie KI-Coding-Agenten, die das Verzeichnis geöffnet haben — einer der ersten öffentlichen Fälle von AI-Agent-Hooks (.claude/) als Lieferketten-Vektor.Das Implantat installiert einen „Watcher" (gh-token-monitor), der von einem LaunchAgent (macOS) oder einem systemd-User-Service + loginctl enable-linger (Linux) am Leben gehalten wird. Alle 60 Sekunden validiert er das gestohlene GitHub-Token gegen die API. Solange das Token funktioniert, passiert nichts. Wenn die Antwort 4xx wird — also in dem Moment, in dem Sie das Token sperren —, führt er per eval den Inhalt von ~/.config/gh-token-monitor/handler aus: einen beliebigen Befehl, den der Angreifer remote definiert hat. Die öffentliche Analyse weiß nicht, was er enthält — es könnte Datenvernichtung, erneutes Implantieren, Ransomware oder nichts sein. Das Risiko ist nicht abschätzbar; genau deshalb ist die Reihenfolge der Maßnahmen absolut.
Drei Eigenschaften, die das Vorgehen verändern:
host-Modus davor.[email protected] wurde mit einer bestandenen SLSA-Attestierung ausgeliefert. Provenance bezeugt die Build-Integrität, nicht die Quelle: Der legitime Workflow kompilierte bereits trojanisierten Code.package.json (der preinstall-Hook) und in zwei neuen Dateien, die dem Paket hinzugefügt wurden (setup.mjs, Math_Symbol.js).eslint → file-entry-cache → flat-cache → keyv. Deshalb zeigt der Scanner die Kette bei jedem Befund.scan.mjs hat die folgenden Eigenschaften — wichtig für alle, die auf einen Lieferketten-Zwischenfall reagieren:
npm install. Prüfen Sie das gesamte scan.mjs in 15 Minuten, bevor Sie es ausführen.--update (Herunterladen eines frischen IOC-Manifests), explizit und optional.docker run --network=none oder eine isolierte Maschine: einfach scan.mjs + iocs.json kopieren.Voraussetzung: Node.js ≥ 18 (jede Maschine mit npm hat es bereits). Laden Sie die beiden Dateien herunter — scan.mjs + iocs.json — und das war's: keine Installation.
Hinweis: Wenn Sie dieses gesamte Repository geklont haben, enthält der Ordner
fixtures/inerte IOCs, die in den Tests verwendet werden (echte Namen und Versionen, Dummy-Inhalt — keine Malware). Der Scanner überspringt ihn automatisch und warnt in der Ausgabe; Befunde daraus erscheinen nur, wenn Sie ihn absichtlich scannen.
Es gibt zwei Betriebsmodi, die unterschiedliche Fragen beantworten, und das entscheidet, wo Sie ausgeführt werden:
repo-Modus liest Lockfiles und node_modules — und Lockfiles leben in Git, also kann er zentralisiert werden: Eine Person scannt jedes Repository im Unternehmen.host-Modus sucht nach dem Implantat (Watcher, LaunchAgent/systemd, IDE-Hooks), das auf der Maschine lebt, auf der der Code ausgeführt wurde — das ist nicht in Git und kann nicht zentralisiert werden.node scan.mjs repo /pfad/mit/allen/repos --json=result.json --html=report.html