- Im gesamten npm-Ökosystem breitet sich eine destruktive Malware-Variante aus, die vom Sicherheitsteam von GitLab erkannt wurde
- Die Malware ist eine weiterentwickelte Form von Shai-Hulud mit einer wurmartigen Verbreitungsstruktur, die automatisch auch andere Pakete infizierter Entwickler kompromittiert
- Nach dem Diebstahl von Zugangsdaten bei GitHub, AWS, GCP, Azure und weiteren Diensten werden Daten in ein von den Angreifern kontrolliertes GitHub-Repository exfiltriert
- Enthält einen „Dead Man’s Switch“, der Benutzerdaten sofort löscht, wenn der Zugriff auf GitHub und npm gleichzeitig blockiert wird
- GitLab hat bestätigt, dass die eigenen Systeme nicht infiziert wurden, und stellt Erkennungs- und Reaktionsmaßnahmen über Dependency Scanning und GitLab Duo Chat bereit
Überblick über den Angriff
- Das Vulnerability Research Team von GitLab hat einen groß angelegten Lieferkettenangriff im npm-Ökosystem erkannt
- Interne Monitoring-Systeme entdeckten mehrere infizierte Pakete
- Die Malware wurde als Variante von Shai-Hulud identifiziert
- Die Malware infiziert über eine wurmartige Ausbreitung automatisch auch andere Pakete betroffener Entwickler
- GitLab hat bestätigt, dass im eigenen Haus keine bösartigen Pakete verwendet wurden, und die Informationen mit der Security-Community geteilt
Interne Struktur des Angriffs
- Die von internen Monitoring-Systemen erkannten bösartigen npm-Pakete führen folgende Funktionen aus
- Sammlung von Zugangsdaten für GitHub, npm, AWS, GCP und Azure
- Übertragung der gestohlenen Daten an ein von den Angreifern kontrolliertes GitHub-Repository
- Automatische Infektion weiterer Pakete des Opfers
- Ausführung einer destruktiven Payload, wenn der Zugriff auf die Infrastruktur blockiert wird
- Mehrere infizierte Pakete wurden bestätigt, die Untersuchung läuft weiter
Technische Analyse: Ablauf des Angriffs
Vektor der Erstinfektion
- Die Malware dringt über einen mehrstufigen Ladevorgang in das System ein
- Dem
package.json eines infizierten Pakets wird das Skript setup_bun.js hinzugefügt
- Nach außen tarnt es sich als Installation der Bun JavaScript Runtime
- Tatsächlich führt es
bun_environment.js aus, eine 10 MB große, verschleierte Payload
- Die Kombination aus kleiner Loader-Datei und großer verschleierter Payload dient der Umgehung von Erkennungssystemen
Sammlung von Zugangsdaten
- Unmittelbar nach der Ausführung sammelt die Malware Token und Geheimnisse aus verschiedenen Quellen
- GitHub-Token (
ghp_, gho_)
- AWS-, GCP- und Azure-Zugangsdaten
- npm-Token (
.npmrc und Umgebungsvariablen)
- Mit dem Tool Trufflehog wird das gesamte Home-Verzeichnis gescannt, um API-Schlüssel, Passwörter, Git-Historien und weitere Daten zu finden
Netzwerk zur Datenexfiltration
- Mit gestohlenen GitHub-Token wird ein öffentliches Repository mit der Beschreibung „Sha1-Hulud: The Second Coming.” erstellt
- Dieses Repository dient als Dropbox für die gestohlenen Daten
- Zur Sicherung der Persistenz werden GitHub Actions Runner installiert
- Falls die Berechtigungen nicht ausreichen, sucht die Malware nach anderen Repositories mit demselben Marker und verwendet Token anderer Systeme weiter
- So entsteht ein verteiltes Netzwerk zum Teilen von Token
Ausbreitung in der Lieferkette
- Mit gestohlenen npm-Token werden alle Pakete des Opfers infiziert
- Herunterladen des Originalpakets
- Einfügen von
setup_bun.js als preinstall-Skript
- Hinzufügen der Payload
bun_environment.js
- Erhöhung der Versionsnummer
- Erneute Veröffentlichung des infizierten Pakets auf npm
Dead Man’s Switch
- Die Malware überwacht fortlaufend den Zugriff auf GitHub (Exfiltration) und npm (Verbreitung)
- Wenn beide Kanäle blockiert sind, wird sofort eine Datenzerstörung ausgelöst
- Windows: Löschen von Benutzerdateien und Überschreiben von Festplattensektoren
- Unix-artige Systeme: Überschreiben von Dateien mit dem Befehl
shred und anschließendes Löschen
- Bei einer massenhaften Löschung von GitHub-Repositories oder einer großflächigen Sperrung von npm-Token besteht das Risiko, dass infizierte Systeme gleichzeitig Daten löschen
Kompromittierungsindikatoren (IoC)
- Wichtige Erkennungsindikatoren
- Datei:
bun_environment.js (bösartiges Post-Install-Skript)
- Verzeichnisse:
.truffler-cache/, .truffler-cache/extract/
- Prozesse:
del /F /Q /S "%USERPROFILE%*", shred -uvz -n 1, cipher /W:%USERPROFILE%
- Befehle:
curl -fsSL https://bun.sh/install | bash, powershell -c "irm bun.sh/install.ps1|iex"
Unterstützung von GitLab bei Erkennung und Reaktion
- GitLab-Ultimate-Nutzer können mit integrierten Sicherheitsfunktionen sofort prüfen, ob sie betroffen sind
- Wenn Dependency Scanning aktiviert ist, werden infizierte Pakete in
package-lock.json oder yarn.lock automatisch erkannt
- Wenn eine Merge Request infizierte Pakete enthält, wird eine Warnung angezeigt
- In Verbindung mit GitLab Duo Chat ist eine schnelle abfragebasierte Erkennung möglich
- Beispiel: „Gibt es Abhängigkeiten, die von der Shai-Hulud-v2-Kampagne betroffen sind?“
- Der Security Analyst Agent greift auf die Schwachstellendaten des Projekts zu und liefert sofort eine Antwort
- Teams, die mehrere Repositories verwalten, wird empfohlen, automatisierte Erkennung auf CI/CD-Basis mit schneller agentengestützter Reaktion zu kombinieren
Ausblick
- Dieser Angriff wird als neue Form eines Lieferkettenangriffs bewertet, bei dem die Zerstörung von Opferdaten zum Schutz der Angreifer-Infrastruktur eingesetzt wird
- GitLab entwickelt gemeinsam mit der Community sichere Wiederherstellungsstrategien und überwacht Varianten weiterhin mit automatisierten Erkennungssystemen
- Ziel ist es, durch frühzeitiges Teilen von Informationen Sekundärschäden durch den Dead Man’s Switch zu verhindern
1 Kommentare
Hacker-News-Kommentare
Vor etwa einem Monat musste ich eine lästige Aufgabe erledigen und suchte dafür ein NPM-Paket.
Als ich
brew install npmausführte, ergoss sich ein Wasserfall von Abhängigkeiten über mich. Ich hielt kurz inne, dachte über Risiko und Nutzen nach und machte das Ganze am Ende mitbrew uninstall npmwieder rückgängig.Stattdessen habe ich es mit einer alten Unix-Utility-Pipeline und awk gelöst, und rückblickend war das die beste Entscheidung.
NPM ist ein Werkzeug, das gebaut wurde, um Browser-Kompatibilitätsprobleme zu lösen, und in Umgebungen ohne Browser erzeugt es nur unnötige Komplexität.
Wenn man Code aus Ökosystemen mit vielen Abhängigkeiten wie Node oder Python direkt auf dem Hauptsystem ausführt, ist das Risiko hoch, Supply-Chain-Angriffen ausgesetzt zu sein.
Deshalb installiere ich Python- oder JS-Interpreter gar nicht erst auf meinem Basissystem.
Irgendwann habe ich aufgegeben, aber jetzt scheint es, als hätte ich damals recht gehabt.
Es hieß einmal: „Wenn GitHub bösartige Repositories massenhaft löscht, könnten Tausende Systeme gleichzeitig Benutzerdaten zerstören.“
Das wirkt wie eine Geiselnahme — daher kam der Witz „Dann erschießt die Geisel“.
Ich bin ebenfalls Opfer dieses npm-Angriffs.
Ich war schockiert, als ich erfuhr, dass die GitHub-CLI OAuth-Tokens im Klartext im HOME-Verzeichnis speichert.
Mit Zugriff darauf hätte ein Angreifer unter meinem Konto fast alles tun können.
Unter macOS werden sie sicher im Keychain des Betriebssystems gespeichert — zugehörige Diskussion
Chrome nutzt den Schutz des Betriebssystems, Firefox bislang nicht.
Letztlich ist sandbox-basierte Zugriffskontrolle die grundlegende Lösung.
Aber es gibt keine plattformübergreifend konsistente Lösung, und selbst unter macOS gibt es keinen perfekten Weg.
Es wurde ein Verzeichnis
~/.dev-envangelegt, und mein Laptop verwandelte sich in einen GitHub-Runner.Dank des schreibgeschützten Dateisystems von Bluefin Linux könnte der Schaden geringer ausgefallen sein.
Alle geben npm die Schuld, aber auch GitHub trägt Verantwortung.
Bösartige Repositories wurden nicht schnell genug erkannt, und das Problem mit Malware-Repositories ist schon länger gravierend.
Wäre es heimlich an einen externen Server exfiltriert worden, wäre es noch viel schlimmer gewesen.
Es braucht Werkzeuge und Praktiken auf Community-Ebene.
Wenn daraus kommerzielle Regulierung oder Einschränkungen in Build-Workflows entstehen, könnte das zu großen Problemen führen.
Ich habe mich gefragt, warum immer NPM angegriffen wird.
Python oder Java sind ebenfalls sehr populär, aber in letzter Zeit war es dort still.
und dank der Kultur von Versionsbereichs-Abhängigkeiten verbreitet sich eine Infektion sehr schnell.
In Java werden Versionen typischerweise fest fixiert, daher ist so etwas dort seltener.
Deshalb zieht ein einziges Paket oft Dutzende transitive Abhängigkeiten nach.
und es gibt viele unerfahrene Entwickler, wodurch die Sicherheit schwächer ist.
In anderen Sprachökosystemen wird nach Prüfung aktualisiert, in JS wird sofort upgegradet.
Bei der Installation konnten Skripte frei ausgeführt werden; bei der JVM oder Python ist das nicht so.
Wenn man in
.npmrchinzufügt, kann man den Angriffsvektor verkleinern.
zugehöriger Artikel
und besteht beim Deaktivieren nicht die Gefahr, dass Abhängigkeiten kaputtgehen?
Das Beunruhigendste an diesem Angriff ist der Diebstahl von Zugangsdaten.
Wenn man ein infiziertes Paket installiert hat, könnten Umgebungsvariablen oder Tokens aus
.npmrcabgeflossen sein.Man sollte Tokens und API-Keys sofort rotieren.
Regelmäßige Rotation ist keine Reaktion nach einer Kompromittierung, sondern eine vorbeugende Maßnahme.
Zugangsdaten sollten nicht in Umgebungsvariablen oder Dateien gespeichert werden; besser sind Security Keys oder verschlüsselte Dateien.
Es ist, als würde man bösartige Transaktionen in ein verteiltes Ledger einschleusen.
Das Problem ist, dass viele Dienste noch immer standardmäßig Klartextspeicherung verwenden.
Da sich solche Angriffe wiederholen, frage ich mich, warum KI-basierte Erkennungssysteme nicht funktionieren.
Microsoft betont KI so stark, aber offenbar wird sie gerade nicht für GitHub-Sicherheit eingesetzt.
So wie damals, als jeder von einer Firewall blockierte Versuch gleich als Angriff klassifiziert wurde.
Intern wird das durch den SonaType IQ Server unterstützt.
Tatsächlich gab es beim curl-Projekt bereits Fälle von Spam mit KI-generierten Security-Reports.
Ich frage mich, ob es überhaupt noch einen Grund gibt, postinstall-Skripte weiter zu erlauben.
Wäre es nicht besser, den Benutzer zu fragen, ob sie ausgeführt werden sollen?
und auf CI-Servern braucht man nicht-interaktive Installationen, daher ist das praktisch wohl schwer umsetzbar.
Der Artikel war sehr aufschlussreich, aber schade, dass er am Ende mit Werbung für GitLab-Sicherheitsfunktionen endete.