Shai-Hulud: 373 npm-Pakete per CI-Cache vergiftet — Ausbreitung auf PyPI

Ein Supply-Chain-Wurm namens „shai-hulud" kompromittierte am 14. Mai innerhalb von weniger als sechs Minuten 373 Paketversionen in 169 npm-Namen, bevor er auf PyPI übergriff. Drei unabhängige Quellen bestätigten den Vorfall; ein Bericht von techsnif belegt, dass zwei Geräte von OpenAI-Mitarbeitern über denselben TanStack-Vektor betroffen waren — Nutzerdaten oder Produktivsysteme wurden jedoch nicht kompromittiert.

Was die Quellen belegen

Fireships technische Analyse führt den Angriff auf eine einzelne CI-Fehlkonfiguration zurück: TanStacks GitHub-Actions-Workflow nutzte den pull_request_target-Trigger, der Fork-PRs im Berechtigungskontext des Haupt-Repositorys ausführt. Der Angreifer forkte TanStack, öffnete einen Pull Request und schloss ihn sofort wieder — ohne Review, ohne Merge. Allein dieser Vorgang reichte aus, um den Workflow auszulösen und eine vergiftete Datei in den gemeinsamen CI-Cache zu schreiben.

Stunden später mergte ein unbeteiligter Maintainer einen legitimen Pull Request. Der Cache wurde hydratisiert, die vergiftete Datei ausgeführt — und griff TanStacks npm-Trusted-Publishing-Token ab, genau jenen Mechanismus, der Credential-Diebstahl verhindern sollte. Mit diesem Token veröffentlichte der Wurm 84 kompromittierte TanStack-Pakete. Jede infizierte Installation scannte daraufhin nach weiteren npm-Tokens und propagierte sich selbst weiter — innerhalb von Stunden zu Mistral AI, UiPath, OpenSearch, Guardrails AI und Squawk. Python-SDKs trugen den Wurm auf PyPI. Bis zum nächsten Morgen verfolgte das Sicherheitsunternehmen Aikido 373 vergiftete Versionen in 169 Paketen.

Die Beseitigung wurde gezielt vereitelt. Der Wurm hatte sich in Claude Code und VS Code eingenistet, sodass das Entfernen der infizierten Pakete ihn nicht eliminierte — beim nächsten Start des Editors würde das Payload erneut ausgeführt. Ein Hintergrundprozess prüfte alle 60 Sekunden, ob das gestohlene GitHub-Token noch gültig war; lief es ab, wurde sofort das Home-Verzeichnis gelöscht. Um nicht aufzufallen, fälschte der Wurm Commits, die als von der Claude Code GitHub-App signiert erschienen — in Imitation KI-generierter Commits, die Maintainer bereits routinemäßig akzeptierten. Matthew Bermans GTIG-gestützte Analyse ordnet den Vorfall in einen dokumentierten Anstieg KI-beschleunigter Supply-Chain-Angriffe ein; die Credential-Harvesting-Kampagnen von Team PCP werden als Faktor identifiziert, der die Einstiegshürde für Folgewürmer senkt.

Strategische Einschätzung

Upgrade auf PNPM v1+: Die Optionen minimum-release-age (verweigert Pakete unter 24 Stunden alt), block-exotic-subdeps (blockiert Nicht-Registry-Transitivabhängigkeiten) und approved-builds (Whitelist für Install-Skripte) schließen gemeinsam die drei Vektoren, die dieser Wurm ausnutzte. Jeder pull_request_target-Workflow in Ihrer CI-Pipeline sollte auf Fork-Berechtigungsscope geprüft werden — Trusted Publishing ist keine ausreichende Absicherung, wenn der Cache selbst die Persistenzschicht darstellt.