
Abwehr des Shai-Hulud-Lieferkettenangriffs
Ein Sicherheitstool zur Erkennung kompromittierter npm-Pakete aus den Shai-Hulud-Lieferkettenangriffen (ursprünglich September 2025 und Shai-Hulud 2.0 November 2025). Scannt sowohl package.json- als auch package-lock.json-Dateien, um exakt installierte Versionen und Indikatoren für eine Kompromittierung (IoCs) zu erkennen. Verfügbar sowohl in Python- als auch in Node.js-Implementierungen mit zentraler YAML-Konfiguration für eine einfache Wartung.
Neuestes Update: 24. November 2025 - Es werden 738+ kompromittierte Pakete mit 1.291 eindeutigen package@version-Kombinationen erfasst. Erkennt jetzt sowohl die ursprünglichen Shai-Hulud- als auch die Shai-Hulud-2.0-Angriffsvarianten.
Für Multi-Ökosystem-Scans siehe ore-mal-pkg-inspector.
Für Multi-Ökosystem-Scans bösartiger Pakete (npm, PyPI, Maven, RubyGems, Go, Cargo) siehe: ore-mal-pkg-inspector - Umfassender Scanner für bösartige Pakete mit dynamischer Threat Intelligence.
OreNPMGuard konzentriert sich speziell auf die Abwehr von Shai-Hulud-Angriffen für npm-Pakete.
Shai-Hulud ist ein selbstreplizierender Wurm, der am 14.-15. September 2025 begann, npm-Pakete zu kompromittieren. Er stellt den ersten erfolgreichen sich selbst verbreitenden Angriff im npm-Ökosystem dar und gilt als einer der schwerwiegendsten bislang beobachteten JavaScript-Lieferkettenangriffe. Benannt nach den riesigen Sandwürmern aus Frank Herberts Dune-Reihe, hat sich diese Malware in mehrere Varianten weiterentwickelt.
Der ursprüngliche Angriff infizierte 200+ npm-Pakete (wie in diesem Tool erfasst), wobei pro Paket mehrere Versionen betroffen waren.
Im November 2025 tauchte eine neue Variante mit erheblichen Änderungen auf:
preinstall-Skripte (nicht nur postinstall)setup_bun.js und bun_environment.js (zusätzlich zu bundle.js)Referenz: Wiz Research - Blogbeitrag zu Shai-Hulud 2.0
Patient Zero: Der Angriff begann mit dem Paket rxnt-authentication, das am 14. September 2025 um 17:58:50 UTC vom kompromittierten npm-Konto "techsupportrxnt" veröffentlicht wurde.
Angriffskette (Original Shai-Hulud):
postinstall-Skript aus, das bundle.js ausführt (3 MB+ JavaScript-Payload)data.json (doppelt base64-codiert).github/workflows/shai-hulud-workflow.yml), der Repository-Geheimnisse an webhook[.]site exfiltriertpostinstall-Hooks hinzuzufügenAngriffskette (Shai-Hulud 2.0 - November 2025):
preinstall-Skript aus, das setup_bun.js oder bun_environment.js ausführt (neue Payload-Dateien)cloud.json, contents.json, environment.json und truffleSecrets.json.github/workflows/discussion.yaml mit selbst gehostetem Runner für Backdoor-Zugriff.github/workflows/formatter_*.yml zur Exfiltration von Geheimnissen (löscht den Workflow anschließend, um die Aktivität zu verbergen)docker run --rm --privileged -v /:/host Root-Zugriff zu erlangenghp_*, gho_*), npm-AuthentifizierungstokensOriginal Shai-Hulud (September 2025):
@ctrl/tinycolor, ngx-bootstrap)Shai-Hulud 2.0 (November 2025):
Verifizierter Diebstahl von Anmeldeinformationen (aus ~20.000 analysierten Repos):
KRITISCH: Die Wiz Research hat bestätigt, dass eine opferübergreifende Exfiltration stattfindet. Das bedeutet:
Auswirkung auf die Untersuchung: Prüfen Sie bei der Durchsicht exfiltrierter Daten in Ihren Repositories, ob die Daten tatsächlich zu Ihrer Organisation oder einem anderen Opfer gehören.
Dieser Angriff steht in direktem Zusammenhang mit der s1ngularity/Nx-Kompromittierung vom August 2025, bei der der anfängliche Diebstahl von GitHub-Tokens den breiteren Lieferkettenangriff ermöglichte. Viele der ersten Shai-Hulud-Opfer waren bekannte Opfer des s1ngularity-Angriffs. Sicherheitsforscher weisen außerdem auf die Integration KI-generierter Inhalte in die Kampagne hin; es wird mit mittlerer Zuversicht angenommen, dass ein LLM verwendet wurde, um das bösartige Bash-Skript zu erzeugen.
Kampagne des ursprünglichen Shai-Hulud:
rxnt-authentication veröffentlicht ("Patient Zero")Shai-Hulud-2.0-Kampagne:
PyYAML (pip install pyyaml)js-yaml (npm install js-yaml)# Make executable
chmod +x shai_hulud_scanner.py
# Scan single package.json
python3 shai_hulud_scanner.py ./package.json
# Scan package-lock.json for exact versions
python3 shai_hulud_scanner.py ./package-lock.json
# Scan entire project directory
python3 shai_hulud_scanner.py ./my-project
# Scan current directory
python3 shai_hulud_scanner.py .
# Install dependencies first
npm install
# Make executable
chmod +x shai_hulud_scanner.js
# Scan single package.json
node shai_hulud_scanner.js ./package.json
# Scan package-lock.json for exact versions
node shai_hulud_scanner.js ./package-lock.json
# Scan entire project directory
node shai_hulud_scanner.js ./my-project
# Scan current directory
node shai_hulud_scanner.js .
✅ Erkennung exakter Übereinstimmungen: Identifiziert Pakete, deren Versionen exakt mit bekannten kompromittierten Versionen übereinstimmen
⚠️ Erkennung potenzieller Risiken: Markiert Pakete mit demselben Namen, aber abweichenden Versionen (sie könnten weiterhin gefährdet sein)
🔍 Unterstützung beider Dateien: Scannt sowohl package.json (deklarierte Abhängigkeiten) als auch package-lock.json (exakt installierte Versionen)
📦 Umfassende Abdeckung: Das Scannen von package-lock.json umfasst verschachtelte Abhängigkeiten und transitive Pakete
🔄 Rekursives Scannen: Scannt automatisch alle Unterverzeichnisse und überspringt dabei node_modules
📋 Detaillierte Berichte: Zeigt Paketnamen, Versionen, Abhängigkeitsabschnitte und betroffene Versionen
🔎 IoC-Erkennung: Identifiziert Indikatoren für eine Kompromittierung sowohl für das ursprüngliche Shai-Hulud als auch für Shai-Hulud 2.0:
"postinstall": "node bundle.js"-Hooks, bundle.js-Dateien, shai-hulud-workflow.yml"preinstall"-Hooks, setup_bun.js, bun_environment.js, discussion.yaml, formatter_*.yml-Workflowswebhook.site-Exfiltrationsendpunkte, SHA1HULUD-Runner-Muster, Docker-Privilegieneskalation🚨 Kritisch (Kompromittierte Pakete gefunden):
🚨 CRITICAL: Found 2 CONFIRMED compromised packages:
• @ctrl/deluge v7.2.2 in dependencies
Affected versions: 7.2.2, 7.2.1
• ngx-bootstrap v19.0.3 in devDependencies
Affected versions: 18.1.4, 19.0.3, 20.0.4, 20.0.5, 20.0.6, 19.0.4, 20.0.3
⚠️ Warnung (Versionsabweichung):
⚠️ WARNING: Found 1 packages with different versions:
• @ctrl/deluge v7.2.0 in dependencies
Known affected versions: 7.2.2, 7.2.1
✅ Sauber:
✅ No affected packages found
npm uninstall <package-name>npm cache clean --forcerm -rf node_modules"postinstall": "node bundle.js"bundle.js-Dateien (über 3 MB groß, enthalten bösartige Payload).github/workflows/shai-hulud-workflow.yml-Dateien"preinstall"-Hookssetup_bun.js und bun_environment.jscloud.json, contents.json, environment.json, Paketdaten sind zentral in affected_packages.yaml gespeichert. So fügen Sie neue kompromittierte Pakete hinzu:
affected_packages.yaml- name: "package-name"
versions: ["1.0.0", "1.0.1"]
Dieser zentrale Ansatz macht es überflüssig, bei neuen Bedrohungen mehrere Dateien aktualisieren zu müssen.
# Create central scanning script
curl -O https://your-domain.com/shai_hulud_scanner.py
chmod +x shai_hulud_scanner.py
# Mass scan multiple projects
for dir in /projects/*/; do
echo "Scanning $dir"
python3 shai_hulud_scanner.py "$dir"
done
# GitHub Actions example
- name: Scan for Shai-Hulud packages
run: |
curl -O https://your-domain.com/shai_hulud_scanner.js
npm install js-yaml
node shai_hulud_scanner.js .
if [ $? -ne 0 ]; then
echo "SECURITY ALERT: Compromised packages detected!"
exit 1
fi
# Add to security toolkit
cp shai_hulud_scanner.py /usr/local/bin/
cp shai_hulud_scanner.js /usr/local/bin/
cp affected_packages.yaml /usr/local/bin/
# Create alias for easy access
echo 'alias scan-shai="python3 /usr/local/bin/shai_hulud_scanner.py"' >> ~/.bashrc
postinstall, Shai-Hulud 2.0 verwendet preinstall (erhöht die Angriffsfläche in Build-Umgebungen)Original Shai-Hulud (September 2025):
"postinstall": "node bundle.js" in package.jsonbundle.js (normalerweise 3 MB+ minifiziertes JavaScript)webhook.site-Domains.github/workflows/shai-hulud-workflow.yml zur Persistenzshai-hulud, die bösartige Commits enthaltenShai-Hulud 2.0 (November 2025):
"preinstall": "node setup_bun.js" oder "preinstall": "node bun_environment.js" in package.jsonsetup_bun.js, bun_environment.js (zusätzlich zu bundle.js)cloud.json, contents.json, environment.json, truffleSecrets.json.github/workflows/discussion.yaml (mit runs-on: self-hosted und RUNNER_TRACKING_ID: 0).github/workflows/formatter_*.yml (Musterabgleich, verwendet zur Exfiltration von Geheimnissen)Gemeinsam für beide Varianten:
webhook.site-Domainspreinstall-Skripte (Ausführungsphase von Shai-Hulud 2.0)setup_bun.js und bun_environment.jscloud.json, contents.json, environment.json, truffleSecrets.jsondiscussion.yaml- und formatter_*.yml-Workflowmusterprevention/block-shai-hulud.shBei Problemen oder Fragen:
truffleSecrets.json.github/workflows/discussion.yaml (mit selbst gehostetem Runner).github/workflows/formatter_*.yml-Dateiendocker run --rm --privileged -v /:/host)webhook.site-Verweise im Code oder in Netzwerkprotokollendocker run --rm --privileged -v /:/hostwebhook.site-Domains (wie beim Original)