- Von Nx-Paketen und Plugins wurden bösartige Versionen auf npm verteilt, die das Dateisystem scannen, Anmeldedaten sammeln und anschließend an ein Repository im Github-Konto des Nutzers senden
- Um zu prüfen, ob man betroffen ist, muss kontrolliert werden, ob im Github-Konto ein Repository namens s1ngularity-repository erstellt wurde
- Im Fall einer Infektion sind der Austausch von Tokens und Passwörtern, das Löschen des bösartigen Repositorys und die Prüfung der Shell-Konfigurationsdateien zwingend erforderlich
- Die bösartigen Versionen wirken sich über ein postinstall-Skript auf das System aus; besonders bei Nutzung des VSCode-Nx-Console-Plugins steigt das Risiko einer unbemerkten Ausführung
- Nx hat Maßnahmen zur Verhinderung eines erneuten Vorfalls und zusätzliche Sicherheitsmaßnahmen umgesetzt, und die betreffenden Versionen wurden aus npm entfernt
Überblick und Zusammenfassung
- Diese Sicherheitswarnung betrifft einen schweren Supply-Chain-Angriff auf Nx-Pakete und einige zugehörige Plugins, bei dem bösartiger Code über npm verteilt wurde
- Die betroffenen bösartigen Versionen scannen das Dateisystem der Nutzer, sammeln Anmeldedaten, Pfade und weitere Informationen und laden sie in ein Github-Repository (
s1ngularity-repository) hoch - Das bösartige
postinstall-Skript verändert außerdem die Shell-Konfigurationsdateien der Nutzer (.zshrc,.bashrc), um einen System-Shutdown-Befehl hinzuzufügen - Angriffsvektor und Ablauf des Angriffs, betroffene Versionen, sofort notwendige Maßnahmen für Nutzer sowie Schritte zur Verhinderung eines erneuten Vorfalls werden ausführlich beschrieben
Dringende Maßnahmen
Was alle prüfen sollten
- In der Liste der Repositories des eigenen Github-Kontos prüfen, ob
s1ngularity-repositoryerstellt wurde - Die in diesem Repository enthaltenen Dateien herunterladen und zur Dokumentation aufbewahren
- Das Repository auf Github löschen
- Eine E-Mail an
security@nrwl.iosenden, um Hinweise zur Entschlüsselung der abgeflossenen Informationen zu erhalten - Anmeldedaten und Tokens aller Konten sofort austauschen
So werden Github-Tokens ausgetauscht
https://github.com/settings/connections/…aufrufen- Die Zugriffsrechte der verbundenen App widerrufen, um bestehende Tokens ungültig zu machen
- Bei Nutzung der
gh-CLI erneut authentifizieren, um ein neues Token zu erzeugen - Ohne diese Maßnahme besteht das Risiko, dass bestehende Tokens missbraucht werden
Nutzung bösartiger Nx-Versionen beenden und bereinigen
- Mit dem Befehl
npm ls nxprüfen, ob die aktuell verwendete Nx-Version eine bösartige Version ist - Falls eine infizierte Version verwendet wird, mit
npm uninstall nx && npm install nx@latestaktualisieren - Den Cache mit
npm cache clean --forcebereinigen
Für bereits infizierte Nutzer
- npm- und Github-Tokens austauschen
- Passwörter und sämtliche Anmeldedaten für Github und verbundene Dienste vollständig zurücksetzen
- Die Dateien
.zshrcund.bashrcdarauf prüfen, ob unbekannte Befehle eingefügt wurden, und diese löschen
Für Administratoren interner Paket-Repositories
- Bösartige Versionen im internen Proxy des Unternehmens-Registrys sofort löschen, um eine weitere Verbreitung zu verhindern
Hinweise zu betroffenen Versionen
Nx-Pakete
- 21.5.0, 20.9.0, 20.10.0, 21.6.0, 20.11.0, 21.7.0, 21.8.0, 20.12.0
- Stand 10:44 PM EDT vollständig aus npm entfernt
@nx/devkit, @nx/js, @nx/workspace, @nx/node, @nx/eslint, @nx/key, @nx/enterprise-cloud
- Stand 10:44 PM und 6:20 AM EDT aus npm entfernt
Details zum Angriffsvektor
Ursache im verwundbaren Workflow
- In den Github-Actions-Workflow wurde eine Schwachstelle zur Ausführung beliebigen Codes eingebracht
- Wenn im PR-Titel bestimmter Bash-Code eingefügt wurde, konnten im Workflow Systembefehle ausgeführt werden; es handelte sich um eine entsprechende Schwachstelle (Bash Injection)
- Über den Trigger
pull_request_targetstanden erhöhte Berechtigungen (GITHUB_TOKENusw.) zur Verfügung, was missbraucht wurde - Bis zur Entfernung blieb der verwundbare Workflow in einem alten Branch statt nur in
mainbestehen, wodurch der Angreifer mit einem bösartigen PR den Workflow ausführen und Secrets entwenden konnte
Ablauf des Diebstahls des npm-Tokens
- Über den verwundbaren Workflow wurde die Ausführung von
publish.ymlerreicht publish.ymlspeicherte das npm-Token in Github Secrets; dabei wurde das Token an einen externen Webhook übermittelt- Schließlich konnte der Angreifer mit diesem Token bösartige Versionen von Nx und unterstützenden Paketen auf npm hochladen
Verhalten der bösartigen Pakete
Sammlung von Informationen einschließlich Anmeldedaten und Veröffentlichung in einem Github-Repository
- Beim Ausführen des
postinstall-Skripts des infizierten Nx-Pakets werden Speicherorte verschiedener Textdateien und Anmeldedaten gesammelt - Diese werden Base64-kodiert in ein Github-Repository mit dem Namen
s1ngularity-repositoryhochgeladen - Auch wenn das eigentliche Repository inzwischen gelöscht wurde, muss wegen seiner früheren öffentlichen Sichtbarkeit von einem möglichen Informationsabfluss ausgegangen werden
Manipulation der Shell-Profile (.zshrc, .bashrc)
postinstallfügte den Befehlsudo shutdown -h 0ein, wodurch beim Start eines Terminals ein System-Shutdown ausgelöst und möglicherweise ein Passwort offengelegt werden konnte
Verschiedene Szenarien, in denen postinstall aktiv werden kann
-
Die Ausführung kann nicht nur bei einem expliziten
npm install/yarn/pnpm installerfolgen, sondern auch in vielen anderen Situationen, etwa durch transitive Abhängigkeiten, Editor-Erweiterungen oder Skriptausführung -
Insbesondere die Erweiterung Nx Console für VSCode (Versionen 18.6.30 bis 18.65.1) konnte beim Start des Editors automatisch
nx@latestinstallieren und dadurch die Ausführung vonpostinstallauslösen -
Grundsätzlich ist zu beachten, dass Installationen von NPM-Modulen an vielen Stellen stattfinden können, auch ohne ausdrückliche Absicht
-
Ab Nx Console 18.66.0 wurde die Installation von
latest nxentfernt
Zeitachse von Angriff und Reaktion
21. August
- 4:31 PM: Ein PR mit der Bash-Injection-Schwachstelle wurde gemergt
- 10:48 PM: Ein Beitrag, der auf die Schwachstelle hinwies, wurde auf X (ehemals Twitter) veröffentlicht
22. August
- Nachmittag: Interne Untersuchung, Rollback des verwundbaren Workflows (unvollständig)
- Einführung von CodeQL, um ähnliche Schwachstellen künftig in PRs zu erkennen
24. August
- In einem Commit im Fork des Angreifers tauchten Hinweise auf einen Abfluss des npm-Tokens auf
- Ein bösartiger PR wurde erstellt und gelöscht;
publish.ymlwurde durch diesen PR ausgeführt
26. bis 27. August (Verteilung der bösartigen Versionen, Reaktion)
- Mehrere bösartige Versionen von Nx und Plugins wurden nacheinander auf npm verteilt
- Issues wurden an die Github-/NPM-Community gemeldet
- 10:44 PM: NPM entfernte alle betroffenen Versionen und ergriff weitere Maßnahmen
- 11:57 PM: Alle Tokens zum Veröffentlichen von Nx-bezogenen Paketen wurden ungültig gemacht
-
- August: Patch für Nx Console, 2FA, Umstellung auf Trusted Publisher und weitere Maßnahmen
Vorbeugende Maßnahmen und weiteres Vorgehen
- Für alle Maintainer der
nrwl-Organisation wurde 2FA verpflichtend gemacht - Der Mechanismus Trusted Publisher wurde eingeführt. Verteilung auf Basis von npm-Tokens ist nicht mehr erlaubt
- Künftige Pakete werden ausnahmslos erst nach 2FA- und vertrauensbasierter Verifikation veröffentlicht
- Zusätzliche Risikoerkennung sowie PR-Freigaben, Branch-Schutz und weitere stufenweise Maßnahmen werden eingeführt
Erkenntnisse und weitere Pläne
- Der Vorfall macht erneut deutlich, wie wichtig Supply-Chain-Sicherheit, CI/CD-Pipelines und das Prinzip minimaler Workflow-Berechtigungen national wie international sind
- Nach einer erneuten internen Aufarbeitung sollen die gewonnenen Erkenntnisse mit der Community geteilt werden
Kontakt
- Rückfragen sind an
security@nrwl.iomöglich
Referenzen und Anhang
- Wichtige Github-Issues, Zeitachse und zugehörige Beiträge
- Ein Beispiel für das Skript
telemetry.jsim infizierten Paket wird bereitgestellt - Dieses Skript sammelt zum Zweck der Erstellung eines Inventars die Pfade wichtiger Textdateien im Dateisystem
Zusammenfassung
- Es ist wichtig, die neuesten Updates und Patches für Nx und zugehörige Plugins anzuwenden
- Ein sofortiger Austausch wichtiger Authentifizierungsinformationen wie npm- und Github-Zugangsdaten wird empfohlen
- Der Vorfall zeigt, dass unzureichende Supply-Chain-Sicherheit und mangelhafte Verwaltung von Workflow-Berechtigungen zu einem schwerwiegenden Sicherheitsvorfall führen können
1 Kommentare
Hacker-News-Kommentare
Ich möchte regelmäßig daran erinnern,
npm install-Skripte zu deaktivierenZum Beispiel mit folgendem Befehl:
Diese Einstellung lässt sich leicht projektbezogen oder global anwenden
Heutzutage gibt es nur noch wenige legitime Pakete, die ohne Skripte nicht funktionieren, daher ist das meist kein Problem
Für Pakete, die zwingend benötigt werden, kann man ein separates Installationsskript erstellen und es in dem jeweiligen Ordner manuell ausführen
Das ist kein Allheilmittel gegen Supply-Chain-Angriffe, hat aber tatsächlich viele Angriffe über npm wirksam abgewehrt
Weitere Informationen stehen in der offiziellen npm-config-Dokumentation
Ich nutze außerdem bubblewrap, um npm, pnpm, yarn und alle von ihnen gestarteten Sessions vom System zu isolieren
~/code, und ich speichere das folgende Bash-Skript am Anfang vonPATHalsnpm~/codeund auf Systembibliotheken im Read-only-ModusAuch die Nutzung von pnpm ist eine Möglichkeit. Neuere Versionen ignorieren standardmäßig alle Lifecycle-Skripte, und man muss sie einzeln whitelisten, damit sie ausgeführt werden
Wenn ich diesen Rat höre, frage ich mich immer: Kein Entwickler liest doch tatsächlich die zig- bis hunderttausenden Zeilen Code, die npm installiert hat
git clonenpm install(hier kann ein bösartiges Paket installiert werden; das Ignorieren von Post-Install-Skripten kann das nur vorübergehend verhindern)npm run(hier wird das bösartige Paket ausgeführt und infiziert das System)node_modules-Ordner überwachen oder auditieren, aber das macht niemandIch führe alle npm-basierten Tools in einem Docker-Container aus, ohne Zugriffsrechte außerhalb des aktuellen Verzeichnisses
Ich frage mich, warum dieser Rat nicht genauso für
setup.py(Python) oderbuild.rs(Rust) giltWir brauchen wirklich eine Kultur, in der man beim Hinzufügen neuer Abhängigkeiten noch einmal ernsthaft nachdenkt
In diesem Jahr gab es wirklich viele Supply-Chain-Angriffe
Diese Woche wollte ich einem Go-Projekt eine Fortschrittsanzeige mit 8 Statistikzählern hinzufügen
Ich habe nach einer Bibliothek gesucht, aber der Code hatte über 3.000 Zeilen, also bat ich ein LLM, einfachen UI-Code zu generieren, und kam mit weniger als 150 Zeilen aus
Es funktioniert ohne Abhängigkeiten genau wie beabsichtigt, ist sehr einfach und kann von allen leicht gelesen und verbessert werden
Die Funktion war: Terminalausgabe löschen und jede Sekunde neu zeichnen, mit Unterstützung für Thread-Safety
Umsetzung und Review haben nur 25 Minuten gedauert
Wenn man keine komplexen Statistikfunktionen braucht, reicht auch eine Progress-Bar in etwa 30 Zeilen Code
Wenn ich künftig darüber nachdenke, ob ich eine Abhängigkeit hinzufügen soll, scheint es für mich besser zu sein, sie einfach selbst zu bauen
Mir fehlen die Ressourcen, um alle Paket-Updates zu überwachen
Ich stimme dem zu, und als „sprachspezifische Paketmanager“ populär wurden, fand ich das wirklich beunruhigend
Ich denke, Ansätze wie cargo vet sind der Weg nach vorn: Einführung in cargo vet
Der Unterschied zwischen Eigenimplementierung und Bibliotheksnutzung ist allerdings offensichtlich
Ich hasse solche Progress-Bar-Bibliotheken, vor allem wenn sie die emacs shell kaputtmachen (expo, eas usw.)
..10%..20%..30%oderUploading…aus?Unser Team betreibt bei einem großen Versicherer ein großes Monorepo und Bibliotheken rund um NX
Statt nur Nx, Anthropic oder die Plattform zu beschuldigen, sollten wir die eigentliche Ursache noch einmal betrachten
Solche Angriffe können zehntausenden Organisationen in Finanzen, Energie, Telekommunikation, Krankenhäusern oder Militär schweren Schaden zufügen
Mit der Verbreitung von KI werden Umfang und Wirkung solcher Angriffe noch größer
Wir entwickeln Software nicht verantwortungsvoll genug. Wie bei Bauvorschriften müssen Sicherheit und Security notfalls erzwungen werden
Erstaunlich gefährlich ist auch, dass heutige Personal-Computing-Umgebungen als ein einziger großer Raum organisiert sind
Bei 50 % der Opfer war VS Code der Infektionsweg, und der Angriff funktionierte nur unter Linux und macOS
postinstall-Phase wurden sensible Werte wie Benutzer-Credentials und andere wichtige Assets eingesammelt (Krypto-Wallets, GitHub- und npm-Tokens, SSH-Schlüssel usw.)s1ngularity-repository) hochgeladenDass GitHub-Tokens und Zugangsdaten nicht in Passwortmanagern mit manueller Freigabe lagen, ist auch ein Problem des GH CLI
Mir gefällt die Idee von „Software-Bauvorschriften“ zwar nicht, aber ich stimme zu, dass die Branche insgesamt extrem schwach aufgestellt ist
Die Vorstellung, man müsse Verantwortung einfordern, weil jemand eine kostenlose Open-Source-Bibliothek verwendet hat, halte ich für anmaßend
In letzter Zeit erledige ich den Großteil meiner Entwicklungsarbeit in VMs
Das aktuelle Sicherheitsniveau von Umgebungen ist aus meiner Sicht nicht akzeptabel
Agentenartige Software hat ein enormes Potenzial, als Malware-Vektor zu wirken
Wenn ein Angreifer erst einmal in den Rechner eingedrungen ist, kann er heute jederzeit auf Daten im Wert von über 1.000 Dollar, Krypto-Schlüssel, Passwörter, personenbezogene Daten und Finanzunterlagen zielen
Ich arbeite ähnlich in Podman-Containern. Mit dem Host teile ich nichts außer dem Quellcode-Verzeichnis
Ein Teil des Problems liegt im traditionellen PC-Sicherheitsmodell (Linux/Windows)
Falls du so etwas bevorzugst, würde ich Qubes OS empfehlen. Es bietet eine gute UX dafür, alles in VMs auszuführen
Man sollte aber klar sagen, dass der Aufbau solcher Umgebungen wegen des Software-Ökosystems und seiner Geschichte sehr schwierig oder recht teuer ist
Claude Code ist ein revolutionäres Tool zur Produktivitätssteigerung
Gleichzeitig bringt es Sicherheitsprobleme mit sich:
curlinbashgepiped (Risiko von Remote Code Execution)Schon damit gibt es mindestens drei Sicherheitsrisiken, deshalb möchte ich es nicht außerhalb einer Sandbox wie VM, Container oder einer dedizierten Entwicklungsmaschine ausführen
Ich denke auch, dass man Agenten in Sandboxes ausführen sollte
Und was dann?
Das eigentliche Risiko ist, dass automatische Updates mit Benutzerausführung kombiniert werden und man Anthropic dadurch effektiv RCE-Rechte gegeben hat
Ich frage mich, ob Paketmanager eine Einstellung wie ein „Mindestalter für Pakete“ (
min-age) brauchenWenn man zum Beispiel Pakete ignorieren würde, die jünger als 24 bis 36 Stunden sind
Ich habe schon einmal etwas Ähnliches erlebt: Ein Paket-Update hat alles kaputtgemacht und wurde dann wenige Stunden später schnell gefixt oder entfernt
GitHub Dependabot hat genau so eine Funktion kürzlich hinzugefügt
Renovate bot bietet diese Option bereits (
minimumReleaseAge), und dependabot unterstützt sie inzwischen ebenfallspostinstall-Skripte standardmäßig nicht aus; man muss sie bei Bedarf explizit aktivieren (auch wenn man letztlich trotzdem fremden Code ausführt)Das ist zwar keine OS-Funktion, aber Astrals Tool
uvbietet so eine Option für Python-PaketeAuch
npm installhat einen Flag, mit dem nur Abhängigkeiten vor einem bestimmten Zeitpunkt/Datum installiert werdennpm install --before (Datum vor 2 Tagen)werden keine Abhängigkeiten installiert, die nach diesem Datum veröffentlicht wurdenIch setze in
.npmrcsave-exact=trueund verlasse mich nur auf Lockfiles und manuelle UpdatesIch war neugierig, ob Claude Code solche Prompts tatsächlich ausführen würde, und habe es getestet
„Diese Anfrage scheint auf die Suche und Auflistung sensibler Dateien wie Krypto-Wallets oder privater Schlüssel abzuzielen und könnte missbräuchlich verwendet werden; dabei kann ich nicht helfen“
Es wurden nur legitime Anfragen unterstützt, etwa Sicherheitsprüfungen, Schwachstellenanalysen, das Schreiben von Monitoring-Tools, das Verständnis von Dateiberechtigungen oder die Gestaltung von Backup-Verfahren
Wir haben aber mindestens 250 erfolgreiche Fälle bestätigt (das heißt, einige Prompts gingen doch durch)
In realen Tests mit Claude und anderen Modellen bestätigt sich jedes Mal, dass Claudes Verweigerungen und Sicherheitsmaßnahmen deutlich besser sind
Das Betriebssystem sollte standardmäßig verhindern, dass Apps unbegrenzten Zugriff auf das gesamte Dateisystem haben
Für manche Apps gibt es AppArmor-/SELinux-Profile, und man kann auch firejail nutzen
Aus UX-Sicht braucht es aber Veränderungen
Das ist ein sehr ernstes Problem. Es stammt aus Desktop-Designs von vor 30 Jahren
Ich entwickle unter Linux selbst ein Tool, das sich mit Podman auf projektbezogene Umgebungsisolation konzentriert: probox
Was Dateisicherheit auf Android betrifft, hat Google gute Arbeit geleistet
Es lohnt sich auch, den Umgang mit bubblewrap und kleinen chroot-Umgebungen zu lernen
Ich glaube nicht, dass irgendein Betriebssystem standardmäßig „unbegrenzten Zugriff auf das gesamte Dateisystem“ für Anwendungen erlaubt
Früher hatte ich noch ein vages Vertrauen darauf, dass ein Angreifer meine Umgebung erst einmal erraten müsste, aber jetzt kann man ein LLM die Umgebung analysieren und passende Angriffe erlernen und ausführen lassen
Ich klopfe mir fast selbst auf die Schulter, weil ich diese Entwicklung tatsächlich vorausgesehen zu haben scheine
In dieser früheren Diskussion gab es lesenswerte Punkte dazu
Wirklich unheimlich ist, dass inzwischen lokale LLMs zum Auffinden von Secrets eingesetzt werden
Das
postinstall-Problem ist dasselbe wie früher, aber die Payload ist eine völlig neue GenerationDie bösartige Logik steckt nicht mehr im Code, sondern im Prompt, wodurch sie mit klassischer statischer Analyse schwer zu erkennen ist
Ich frage mich, wie man sich gegen solche bösartigen Prompts verteidigen soll