flawopen.com/Incidents/shai-hulud-npm-worm-september-2025
Shai-Hulud: der npm-Wurm vom September 2025 und Vertrauen bei der Installation
Die Shai-Hulud-Kampagne im September 2025 nutzte kompromittierte npm-Wartungskonten und schädliche postinstall-Hooks, um Zugangsdaten zu stehlen und weitere infizierte Pakete zu veröffentlichen.[1]
Stellen Sie sich eine Fabrik vor, die eine Kiste mit Teilen erhält, deren Auspackanleitung sich selbst ausführt. Sie kopiert die Versandabzeichen der Fabrik und nutzt sie, um manipulierte Kisten an andere Fabriken zu senden. Das Abschalten automatischer Anleitungen schließt diesen Zugang, aber die Teile müssen vor Gebrauch weiter geprüft werden.[1]
Kernkonzepte & Begriffe
Lifecycle hook- Im September führte npm postinstall während der Installation schädlichen Code aus. Das ist Paketverhalten und keine npm-Speicherschwachstelle mit CVE.
Publishing credential- Ein npm-Token gewährt die für Konto oder Paket festgelegten Rechte. Gestohlene Veröffentlichungsrechte ließen den Wurm wachsen; Ablauf, Umfang und MFA hängen von Regeln ab.
Trusted publishing / OIDC- OIDC ermöglicht einem berechtigten CI-Ablauf kurzlebige Veröffentlichungsrechte ohne gespeichertes npm-Token. Ein kompromittierter berechtigter Ablauf bleibt gefährlich.
Framework-Zuordnungen
Vorfall-Zeitstrahl
GitHub wurde nach eigenen Angaben über Shai-Hulud informiert.[1]
GitHub meldete die Entfernung von mehr als 500 kompromittierten Paketen und blockierte Uploads mit passenden Malware-Merkmalen.[1]
Schritt-für-Schritt Angriffsablauf
Quellcode: Verwundbar vs. Sicher
Sicherer Vergleich von Installationsplänen in Python: Keine Funktion startet npm, liest Zugangsdaten oder kontaktiert die Registry. Das Beispiel folgt der npm-v10-Dokumentation. Der gehärtete Plan verlangt eine geprüfte Sperrdatei, unterdrückt Lebenszyklus-Skripte und übernimmt keine Umgebungsvariablen. Ein echter Runner braucht ein bekanntes npm-Programm sowie isoliertes Home und isolierte Konfiguration ohne Geheimnisse oder sensible Einbindungen. --ignore-scripts sichert weder spätere Importe noch ausdrücklich gestartete Skripte; eine Sperrdatei bestätigt keinen harmlosen Code.
def install_plan(reviewed_lockfile, inherited_env):
# Gibt nur einen Plan zurück: Es werden weder Pakete installiert noch Befehle ausgeführt.
return {"argv": ["npm", "ci"],
"env": dict(inherited_env)}
def install_plan(reviewed_lockfile, inherited_env):
# Gibt nur einen Plan zurück: Es werden weder Pakete installiert noch Befehle ausgeführt.
if reviewed_lockfile is not True:
raise ValueError("Review the lockfile before installation")
return {"argv": ["npm", "ci", "--ignore-scripts"],
"env": {}}
Checkliste für Engineering & Systemsicherheit
- ✓Verlangen Sie eine geprüfte Sperrdatei und npm ci --ignore-scripts im Installationsauftrag; CI-Richtlinientests prüfen Befehl und eine Umgebung ohne Geheimnisse. Nötige Hooks erst nach Prüfung in einem eigenen isolierten Auftrag ausführen.[3]
- ✓Halten Sie Veröffentlichungs- und Cloud-Zugangsdaten aus Installationsaufträgen fern, auch aus Home-Verzeichnissen, eingebundenen Dateien und Runner-Identitäten. Testen Sie, dass der Auftrag sie nicht erhalten kann.[1], [2]
- ✓Nutzen Sie nach Möglichkeit Trusted Publishing und begrenzen Sie berechtigte Workflows, Zweige und Umgebungen; verlangen Sie Änderungsprüfungen. Fordern Sie phishingresistentes MFA und entfernen Sie ungenutzte Token.[1]
- ✓Bei bestätigter Offenlegung Runner isolieren und neu aufbauen, betroffene Zugangsdaten widerrufen sowie Paketversionen und Workflow-Änderungen prüfen. Prüfen Sie Abhängigkeitscode: Sperrdatei oder Wartezeit allein belegen keine Sicherheit.[1], [2]