Malware mit Shai-Hulud-Thema in der PyTorch-Lightning-Bibliothek für AI-Training entdeckt | Semgrep
(semgrep.dev)- Die PyPI-Versionen
lightning2.6.2 und 2.6.3 wurden nach ihrer Veröffentlichung am 30. April 2026 für einen Supply-Chain-Angriff missbraucht; bereitspip install lightningkonnte ein verstecktes Verzeichnis_runtimeund eine verschleierte JavaScript-Payload ausführen - Die bösartige Payload wird beim Import des Moduls automatisch ausgeführt und stiehlt Zugangsdaten, Authentifizierungs-Token, Umgebungsvariablen und Cloud-Geheimnisse; außerdem versucht sie, GitHub-Repositories zu kompromittieren
- Der Einstiegspunkt dieses Angriffs ist zwar PyPI, die Wurmverbreitung erfolgt jedoch über npm; findet die Malware npm-Publishing-Zugangsdaten, injiziert sie
setup.mjsals Dropper undrouter_runtime.jsin veröffentlichbare Pakete und publiziert anschließend eine neue Patch-Version - Für den Datenabfluss werden vier parallele Kanäle genutzt: HTTPS-POST, ein Dead-Drop über die GitHub-Commit-Suche, öffentlich zugängliche GitHub-Repositories unter Kontrolle der Angreifer und direkte Pushes in Repositories der Opfer; als Indikatoren bleiben das Commit-Präfix
EveryBoiWeBuildIsAWormyBoiund die Repository-Beschreibung"A Mini Shai-Hulud has Appeared"zurück - Die Malware verankert sich über den
SessionStart-Hook in.claude/settings.jsonvon Claude Code und über Tasks mitrunOn: folderOpenin.vscode/tasks.jsonvon VS Code, sodass der Dropper jedes Mal beim Öffnen des Repositories ausgeführt wird; Maschinen, die das bösartige Paket im betroffenen Zeitraum importiert haben, sollten als vollständig kompromittiert gelten
Betroffene Pakete und Prüfverfahren
lightningist ein Deep-Learning-Framework, das häufig im Dependency-Tree von Teams enthalten ist, die Bildklassifikatoren bauen, LLMs feintunen, Diffusionsmodelle ausführen oder Zeitreihenprognosen entwickeln-
Betroffene Pakete
lightningVersion2.6.2lightningVersion2.6.3
-
Prüfverfahren für Semgrep-Kunden
- Wenn in letzter Zeit kein Projekt-Scan durchgeführt wurde, sollte ein neuer Scan gestartet werden
- Auf der Advisories-Seite kann geprüft werden, ob ein Projekt diese Paketversionen kürzlich installiert hat
- Mit dem Dependency-Filter lassen sich Treffer prüfen; wenn „No matching dependencies“ angezeigt wird, bedeutet das, dass das Projekt die bösartige Abhängigkeit aktuell nicht aktiv verwendet
- Wenn Treffer vorhanden sind, sollten die unerwarteten Dateien in den Verzeichnissen
.claude/und.vscode/, die unten als Kompromittierungsindikatoren aufgeführt sind, im Repository geprüft werden - GitHub-Token, Cloud-Zugangsdaten und API-Keys, die sich in betroffenen Umgebungen befunden haben könnten, sollten ausgetauscht werden
- Allgemeine Hinweise zur Reaktion auf Supply-Chain-Angriffe und zu Wartezeiten finden sich unter $foo compromised in $packagemanager und Attackers are Still Coming for Security Companies
Wie sich der Angriff von PyPI auf npm ausbreitet
- Anders als mini Shai-Hulud, das npm direkt ins Visier nahm, liegt der Einstiegspunkt dieses Angriffs bei PyPI
- Die bösartige Payload ist weiterhin JavaScript, und die Wurmverbreitung erfolgt über npm
- Findet die ausgeführte Malware npm-Publishing-Zugangsdaten, injiziert sie
setup.mjsals Dropper undrouter_runtime.jsin alle Pakete, die mit diesem Token veröffentlicht werden können - Anschließend setzt sie
scripts.preinstallso, dass der Dropper ausgeführt wird, erhöht die Patch-Version und veröffentlicht das Paket erneut - Nachgelagerte Entwickler, die das jeweilige Paket installieren, führen die komplette Malware auf ihren Maschinen aus; darauf folgen Token-Diebstahl und eine weitere Wurminfektion von Paketen
Methode des Datenabflusses
- Die Exfiltrationsfunktion teilt Mechanismen und Design mit der früheren Kampagne Mini Shai-Hulud und verwendet vier parallele Kanäle, damit Daten selbst dann abfließen, wenn einzelne Pfade blockiert werden
- Der Angriff enthält ein Shai-Hulud-Thema, darunter die Erstellung eines öffentlichen Repositories mit dem Namen
EveryBoiWeBuildIsaWormBoi - Die Struktur der Angriffsspuren entspricht der früheren Kampagne mini Shai-Hulud; die bösartigen Commit-Nachrichten verwenden jedoch das Präfix
EveryBoiWeBuildIsAWormyBoi, um sich vom ursprünglichen Mini-Shai-Hulud-Angriff zu unterscheiden -
C2-Übertragung per HTTPS POST
- Exfiltrierte Daten werden sofort über Port 443 per POST an Server unter Kontrolle der Angreifer gesendet
- Domain und Pfad sind als verschlüsselte Strings in der Payload gespeichert, um die statische Analyse zu erschweren
-
Dead-Drop über GitHub-Commit-Suche
- Die Malware pollt die GitHub-Commit-Such-API und sucht nach Commit-Nachrichten mit dem Präfix
EveryBoiWeBuildIsAWormyBoi - Die Commit-Nachrichten transportieren ein doppelt Base64-kodiertes Token im Format
EveryBoiWeBuildIsAWormyBoi:<base64(base64(token))> - Das decodierte Token wird anschließend zur Authentifizierung eines Octokit-Clients für weitere Aktionen verwendet
- Die Malware pollt die GitHub-Commit-Such-API und sucht nach Commit-Nachrichten mit dem Präfix
-
Öffentliches GitHub-Repository unter Kontrolle der Angreifer
- Es wird ein neues öffentliches Repository mit einem zufällig gewählten Dune-Wortnamen und der Beschreibung
"A Mini Shai-Hulud has Appeared"erstellt - Diese Beschreibung kann direkt auf GitHub gesucht werden
- Gestohlene Zugangsdaten werden als
results/results-<timestamp>-<n>.jsoncommittet; über die API sind sie Base64-kodiert, intern aber normales JSON - Dateien über 30 MB werden in nummerierte Chunks aufgeteilt
- Als Tarnung wird die Commit-Nachricht
chore: update dependenciesverwendet
- Es wird ein neues öffentliches Repository mit einem zufällig gewählten Dune-Wortnamen und der Beschreibung
-
Direkter Push in Opfer-Repositories
- Erhält die Malware ein GitHub-Server-Token mit Präfix
ghs_, pusht sie Exfiltrationsdaten direkt auf alle Branches vonGITHUB_REPOSITORYdes Opfers
- Erhält die Malware ein GitHub-Server-Token mit Präfix
Ziele der Exfiltration
- Die Malware zielt auf Zugangsdaten in lokalen Dateien, der Umgebung, CI/CD-Pipelines und bei Cloud-Anbietern
-
Dateisystem
- Es werden mehr als 80 Pfade zu Dateien mit Zugangsdaten nach Token wie
ghp_,gho_undnpm_durchsucht - Pro Datei werden bis zu 5 MB verarbeitet
- Es werden mehr als 80 Pfade zu Dateien mit Zugangsdaten nach Token wie
-
Shell und Umgebungsvariablen
gh auth tokenwird ausgeführt- Alle Umgebungsvariablen aus
process.envwerden ausgegeben
-
GitHub Actions
- Auf Linux-Runnern wird mit dem eingebauten Python der Prozessspeicher von
Runner.Workergedumpt - Alle Geheimnisse mit Markierung
"isSecret":truesowieGITHUB_REPOSITORYundGITHUB_WORKFLOWwerden extrahiert
- Auf Linux-Runnern wird mit dem eingebauten Python der Prozessspeicher von
-
GitHub-Organisationen
- Es wird geprüft, ob ein Token die Scopes
repoundworkflowbesitzt - Organisationsgeheimnisse für GitHub Actions werden durchlaufen
- Es wird geprüft, ob ein Token die Scopes
-
AWS
- Über Umgebungsvariablen, Profile in
~/.aws/credentials, IMDSv2169.254.169.254und ECS169.254.170.2wird versucht,sts:GetCallerIdentityaufzurufen - Alle Werte aus Secrets Manager und SSM-Parametern werden aufgelistet und abgerufen
- Über Umgebungsvariablen, Profile in
-
Azure
- Mit
DefaultAzureCredentialwerden Subscriptions aufgelistet und Geheimnisse in Key Vault gelesen
- Mit
-
GCP
- Die Authentifizierung erfolgt mit
GoogleAuth - Alle Geheimnisse im Secret Manager werden aufgelistet und abgerufen
- Der Zielbereich umfasst lokale Entwicklungsumgebungen, CI-Runner und alle drei großen Cloud-Anbieter
- Alle Maschinen, die das bösartige Paket im betroffenen Zeitraum importiert haben, sollten als vollständig kompromittiert gelten
- Die Authentifizierung erfolgt mit
Persistenz über Entwickler-Tools
- Nachdem die Malware in ein Repository gelangt ist, zielt sie auf weit verbreitete Entwickler-Tools wie Claude Code und VS Code, um Persistenz-Hooks zu verankern
-
Claude Code
- Die Malware schreibt in
.claude/settings.json, die Konfigurationsdatei von Claude Code im Repository, einenSessionStart-Hook mitmatcher: "*" - Der Hook verweist auf
node .vscode/setup.mjs - Er wird jedes Mal ausgeführt, wenn ein Entwickler Claude Code in einem infizierten Repository öffnet; weder die Nutzung weiterer Tools noch weitere Benutzeraktionen sind dafür nötig
- Die Malware schreibt in
-
VS Code
- Für VS-Code-Nutzer wird in
.vscode/tasks.jsonein Task mitrunOn: folderOpeneingetragen - Dadurch wird bei jedem Öffnen des Projektordners
node .claude/setup.mjsausgeführt
- Für VS-Code-Nutzer wird in
-
Dropper
setup.mjs- Beide Hooks rufen
setup.mjsauf, einen in sich geschlossenen Bootstrapper für die Bun-Runtime - Wenn Bun nicht installiert ist, wird
bun-v1.3.13unauffällig aus den GitHub-Releases heruntergeladen - Unterstützt werden Linux x64, Linux arm64, Linux musl, macOS x64, macOS arm64, Windows x64 und Windows arm64
- Anschließend wird die vollständige 14,8-MB-Payload
.claude/router_runtime.jsausgeführt und in/tmpwieder aufgeräumt
- Beide Hooks rufen
-
Bösartiger GitHub-Actions-Workflow
- Verfügt die Malware über ein GitHub-Token mit Schreibrechten, pusht sie einen Workflow namens
Formatterin das Repository des Opfers - Bei jedem Push werden über
${{ toJSON(secrets) }}sämtliche Repository-Geheimnisse ausgegeben - Die Ergebnisse werden als herunterladbares Actions-Artefakt mit dem Namen
format-resultshochgeladen - Die Actions sind auf eine bestimmte Commit-SHA gepinnt, damit sie legitim wirken
- Repositories, die in CI das infizierte Paket
lightningbezogen haben und über ein Token mit Schreibrechten verfügen, sollten diese Dateien prüfen
- Verfügt die Malware über ein GitHub-Token mit Schreibrechten, pusht sie einen Workflow namens
Kompromittierungsindikatoren
-
Suchbare Indikatoren
- Commit-Nachrichten mit dem Präfix
EveryBoiWeBuildIsAWormyBoidienen als Träger für Dead-Drop-Token und können über die GitHub-Commit-Suche gefunden werden - GitHub-Repositories mit der Beschreibung
"A Mini Shai-Hulud has Appeared"sind Angreifer-Repositories für den Datenabfluss und direkt durchsuchbar
- Commit-Nachrichten mit dem Präfix
-
Pakete
lightning@2.6.2lightning@2.6.3
-
Dateien und Systemartefakte
_runtime/start.py: Python-Loader, der die Payload beim Import initialisiert_runtime/router_runtime.js: verschleierte JavaScript-Payload und 14,8-MB-Bun-Runtime_runtime/: Verzeichnis, das den bösartigen Paketversionen hinzugefügt wurde.claude/router_runtime.js: in Opfer-Repositories injizierte Kopie der Malware.claude/settings.json: in Opfer-Repositories injizierte Hook-Konfiguration für Claude Code.claude/setup.mjs: in Opfer-Repositories injizierter Dropper.vscode/tasks.json: in Opfer-Repositories injizierter automatisch ausgeführter VS-Code-Task.vscode/setup.mjs: in Opfer-Repositories injizierter Dropper
Noch keine Kommentare.