- Die Versionen 2.6.2 und 2.6.3 des Deep-Learning-Frameworks
lightningwurden für einen Supply-Chain-Angriff missbraucht — schonpip install lightningführt dazu, dass ein verschleierter JavaScript-Payload im versteckten Verzeichnis_runtimeautomatisch ausgeführt wird - Da das Framework breit für den Bau von Bildklassifikatoren, LLM-Finetuning, Diffusionsmodelle und Zeitreihenprognosen genutzt wird, ist es wahrscheinlich bereits im Dependency-Tree vieler AI/ML-Teams enthalten
- Sobald die Malware ausgeführt wird, scannt sie im lokalen Dateisystem mehr als 80 Pfade und stiehlt GitHub-Tokens (
ghp_,gho_), npm-Tokens (npm_), Umgebungsvariablen und Cloud-Secrets, wobei pro Datei bis zu 5 MB verarbeitet werden - Über alle drei großen Cloud-Anbieter hinweg werden Secrets aufgelistet und abgerufen: AWS (Credential-Dateien, IMDSv2, ECS, Secrets Manager, SSM), Azure (Key Vault) und GCP (Secret Manager)
- In GitHub-Actions-Umgebungen dumpt die eingebaute Python-Umgebung den Prozessspeicher von
Runner.Workerund extrahiert alle mit"isSecret":truemarkierten Secrets sowie Repository- und Workflow-Informationen - Der Einstiegspunkt ist PyPI (Python), aber die Wurmverbreitung erfolgt über npm (JavaScript) — mit gestohlenen npm-Tokens werden in alle veröffentlichbaren Pakete ein Dropper (
setup.mjs) und die Malware (router_runtime.js) injiziert, die Patch-Version erhöht und erneut veröffentlicht, wodurch auch die Rechner nachgelagerter Entwickler infiziert werden, die diese Pakete installieren - Die Datenexfiltration nutzt gleichzeitig vier parallele Kanäle, damit sie nicht durch das Blockieren eines einzelnen Pfads gestoppt werden kann: ① Versand an den C2-Server per HTTPS POST, ② Dead Drop über die GitHub-Commit-Search-API (doppelt Base64-kodierte Tokens in Commit-Messages), ③ Commit als
results-<timestamp>.jsonin ein öffentliches GitHub-Repository mit Namen aus dem Dune-Universum, ④ direkter Push in das Repository des Opfers - Nach der Kompromittierung eines Repositorys werden Persistenz-Hooks in Entwicklertools eingebaut, um eine Reinfektion sicherzustellen — in Claude Code wird in
.claude/settings.jsoneinSessionStart-Hook eingetragen, der beim Sitzungsstart automatisch ausgeführt wird, und in VS Code wird in.vscode/tasks.jsonein Task mitrunOn: folderOpenhinterlegt, der bei jedem Öffnen des Ordners läuft- Beide Hooks rufen den in sich geschlossenen Dropper
setup.mjsauf; falls die Bun-Runtime fehlt, wird sie unauffällig von GitHub heruntergeladen und der 14,8-MB-Payloadrouter_runtime.jsausgeführt
- Beide Hooks rufen den in sich geschlossenen Dropper
- Wenn ein GitHub-Token mit Schreibrechten erlangt wird, pusht der Angreifer einen als
Formattergetarnten Workflow in das Repository des Opfers — bei jedem Push werden die Repository-Secrets mit${{ toJSON(secrets) }}gedumpt und als Actions-Artefakt hochgeladen - Alle Maschinen, auf denen in dem betroffenen Zeitraum diese Versionen installiert wurden, sollten als vollständig kompromittiert gelten; GitHub-Tokens, Cloud-Credentials und API-Keys müssen sofort ersetzt werden, außerdem sollten die Verzeichnisse
.claude/und.vscode/auf unerwartete Dateien geprüft werden - Kompromittierungsindikatoren: der Präfix
EveryBoiWeBuildIsAWormyBoiin Commit-Messages,"A Mini Shai-Hulud has Appeared"in der Repository-Beschreibung oder das Vorhandensein eines_runtime/-Verzeichnisses im Repository — all das lässt sich direkt über die GitHub-Suche überprüfen
2 Kommentare
Dann sollte man jetzt wohl besser nicht updaten ...
Hacker-News-Kommentare
Vielleicht ist es einfach nur Häufigkeitstäuschung, aber in letzter Zeit sieht man bei wichtigen Paketen ziemlich viele bekannte Supply-Chain-Angriffe
Schon auf den ersten paar HN-Seiten stehen gerade mehrere Beiträge zu unterschiedlichen Fällen
Wenn ich an
left-padvor 10 Jahren zurückdenke, frage ich mich, ob erfolgreiche Angriffe heute häufiger sind als damals, und wahrscheinlich ist das soDer Wert erfolgreicher Angriffe ist sicher auch gestiegen, aber ich frage mich, ob sich unsere Fähigkeit als Community tatsächlich verbessert, solche Dinge vor einem Paket-Release zu erkennen
Kommerzielle Softwarefirmen müssen das besser machen, aber es scheint immer noch an universellen, einfachen Tools für Fälle zu fehlen, in denen etwas als Hobby-/Amateurcode beginnt und dann zur Abhängigkeit vieler Projekte wird
Ich habe denselben Kommentar auch im aktuellen SAP-Supply-Chain-Angriff-Thread gepostet: https://news.ycombinator.com/item?id=47964003
Früher wurde
npm installhäufiger manuell ausgeführt, wahrscheinlich nur wenn Builds kaputtgingen oder sehr gelegentlichSupply-Chain-Angriffe beruhen darauf, dass Menschen, genauer gesagt Pipelines, Pakete gedankenlos automatisch aktualisieren, sobald ein neues Release erscheint
Ob das ein gutes Geschäftsmodell ist, weiß ich nicht, vermutlich eher nicht
left-padwar kein Angriff, sondern ein Bug in NPMEs hätte nicht möglich sein dürfen, Paketversionen zu löschen, von denen bereits veröffentlichte andere Pakete abhängen, und umgekehrt hätte man bestimmte Paketversionen löschen können sollen, wenn sie neu sind und niemand von ihnen abhängt
Als der
left-pad-Autor versuchte, alle seine Daten zu löschen, weil er den Dienst verlassen wollte, hätte NPM einen Fehlercode zurückgeben müssenLaut Wikipedia stellte NPM-Autor Schlueter, nachdem Koçulu von einer Entscheidung von npm, Inc. enttäuscht war und nicht länger Teil der Plattform sein wollte, einen Befehl bereit, um die 273 von ihm registrierten Module zu löschen
Merkwürdig ist, dass vier Sicherheitsprobleme gemeldet wurden und alle automatisch vom Bot
pl-ghostkommentiert und geschlossen wurden [1][2][3][4]Am Ende wurde nur [4] korrekt bearbeitet, und die Bot-Kommentare wurden alle gelöscht
Im anderen Bericht [5] kann man die Bot-Kommentare sehen, und sie enthalten sogar mehr Informationen als das Original
[1] https://github.com/Lightning-AI/pytorch-lightning/issues/216...
[2] https://github.com/Lightning-AI/pytorch-lightning/issues/216...
[3] https://github.com/Lightning-AI/pytorch-lightning/issues/216...
[4] https://github.com/Lightning-AI/pytorch-lightning/issues/216...
[5] https://socket.dev/blog/lightning-pypi-package-compromised
Der Angreifer erstellte mit diesem Konto einen neuen Actions-Workflow und extrahierte im ausgeführten Workflow die PyPI-Secrets
Nach dem Release des Pakets kommentierte er dann noch mit diesem Konto und verspottete uns ein wenig
Ich wünschte, der Tag ohne Abhängigkeiten würde endlich kommen
Als extremes Beispiel lasse ich Opus inzwischen, wenn ich interaktive Lern-Apps für meine Tochter baue, nur noch reines JavaScript und HTML verwenden
Vom Doppelpendel bis zur Flüssigkeitssimulation läuft damit alles auf einmal gut, und früher waren dafür Hunderte von Abhängigkeiten nötig
Bei MIT-lizenziertem Code kann ich Opus sagen, es soll nur genau die Teile extrahieren, die ich brauche, sie für meinen Zweck anpassen und einbinden
Für Hobbyprojekte hat das bisher gut funktioniert, und ich hoffe, dass in Zukunft auch Produktionssoftware ohne Abhängigkeiten auskommt
Wenn Chrome irgendeine API-Form ändert, musst du das selbst finden und reparieren, und wenn Marokko den Beginn der Sommerzeit verschiebt, musst du auch deinen Datums-/Zeitcode selbst aktualisieren
Das sind Dinge, die Bibliotheken für uns erledigen und die wir deshalb als selbstverständlich ansehen
Für einen Doppelpendel-Simulator, an dem deine Tochter nächste Woche das Interesse verliert, ist das kein großes Problem, aber für eine Firma, die etwas baut, das auf unbestimmte Zeit funktionieren muss, schon
Vielleicht sollte ich mal etwas MIT-lizenzieren Remote-Access-Code veröffentlichen, damit er in den Opus-Trainingsdaten landet
Als ich den Fast.AI-Deep-Learning-Kurs gemacht habe, war ich überrascht, wie viele Python-Abhängigkeiten ein Machine-Learning-Projekt mit sich schleppt
Bei Web-Frontend-Projekten ging ich immer von vielen Third-Party-Abhängigkeiten aus, aber für mich wirkt das ML-Ökosystem noch viel stärker verstrickt
Außerdem gilt Webentwicklung als sicherheitssensibel, sodass sich dort über lange Zeit viel Sicherheitswissen und viele Praktiken angesammelt haben, während ML-Entwicklung viel improvisierter wirkt und selbst allgemeine Software-Engineering-Praktiken oft kaum angewandt werden
Eine der Methoden zur Bereitstellung von ML-Modellen damals war zum Beispiel Python pickle, also im Grunde ein ausführbares Objekt ohne eingebaute Beschränkungen
Modelle in diesem Format konnten auf dem importierenden Rechner alles tun, und ein solches frühes Wildwest-Ökosystem macht Sicherheitsverletzungen und Supply-Chain-Angriffe leichter
Manche haben unterwegs ein bisschen Programmieren gelernt, manche sind Mathematiker, und manche sind so etwas wie von AI berauschte Entwickler
Es gibt auch die Haltung: „Code ist jetzt nicht mehr wichtig, Hauptsache es läuft“
Für viele ist ordentliches Dependency Management nur lästige Arbeit, mit der sie sich nicht befassen wollen
In vielen ML-Projekten kommen diese Faktoren zusammen, obwohl gerade ML-Projekte eigentlich zu den Bereichen gehören, die sich am stärksten auf Reproduzierbarkeit konzentrieren müssten
Bei einer Repository-Suche sehe ich, dass unter den in den letzten 24 Stunden erstellten Repositories 2.200 den Text
"A Mini Shai-Hulud has Appeared"enthalten: https://github.com/search?q=A%20Mini%20Shai-Hulud%20has%20Ap...Das wirkt wie ein Hinweis darauf, dass Konten, vermutlich GitHub-Auth-/Actions-Tokens, kompromittiert und dann zum Erstellen von Repositories verwendet wurden
So etwas ist doch schon einmal passiert, man sollte meinen, sie hätten daraus gelernt
Diese Malware hat sich nicht einmal viel Mühe gegeben, und Microsoft anscheinend auch nicht
Zur Einordnung: Ich habe pytorch nie benutzt und kenne mich mit Praktiken der Softwaresicherheit nicht besonders gut aus
Aber mir fällt kaum ein Szenario ein, in dem pytorch Netzwerkzugriff brauchen sollte
Es scheint falsch zu sein, dass man irgendwo im Code beliebige Module importieren und diese API dann nutzen kann
Es bräuchte wohl zusätzliche Import-Beschränkungen oder statische Analyse
Die Sprache scheint nicht die richtigen Abstraktionen zu haben, um mit solchen Problemen umzugehen
Zum Vergleich mag ich an Rust, dass man schon anhand der Funktionssignatur Mutabilität und Lifetimes erkennen kann, ohne den internen Code zu verstehen
So etwas Ähnliches bräuchte man auch für Abhängigkeiten
Entwickler sollten alle Abhängigkeiten leicht auditieren können, ohne in untergeordneten Code einzutauchen, und sofort sehen: „Aha, diese Abhängigkeit benutzt
eval()“ oder „diese greift aufs Netzwerk zu“Mobile Apps erzwingen Berechtigungen, also sollten Entwickler doch auch nur bestimmte Fähigkeiten auf eine Allowlist setzen können, statt komplette Funktionspakete pauschal zu übernehmen
Ich möchte ungern verallgemeinern, aber besonders die AI-Entwickler-Community scheint Bequemlichkeit über fast alles andere zu stellen
Es ist zum Beispiel quasi Standard, dass ein Projekt beim ersten Start automatisch große Modelle herunterlädt
Meist kann man das zwar deaktivieren, aber wegen tief verschachtelter Klassenebenen über mehrere Bibliotheken hinweg ist es wirklich schmerzhaft, die richtigen Parameter dafür zu finden
Es ist schön, dass man mit komplexen Dingen, oft eher Spielzeug, so leicht loslegen kann, aber diese permissive Kultur fühlt sich ziemlich unangenehm an
Der erste Problemlösungsschritt scheint immer „
pip install …“ zu sein, und manche Umgebungen, etwa MacOS, virtualisieren den GPU-Zugriff auch nicht besonders gutIch habe mich diese Woche gefragt, ob es eine gute Idee ist, für das Python-Versionsmanagement uv zu nutzen
Auf der Website [1] steht: „Da Python keine offiziellen Binärdateien für die Distribution bereitstellt, verwendet uv Distributionen aus dem Projekt Astral python-build-standalone“
Dabei wird auf dieses GitHub-Repository https://github.com/astral-sh/python-build-standalone verwiesen, und dort wiederum auf https://gregoryszorc.com/docs/python-build-standalone/main/r...
Wenn ich das richtig verstehe, wird der Source Code für Python-Builds also nicht direkt von python.org bezogen, und ich bin mir unsicher, wie sicher das ist
Bei asdf [2] habe ich ähnliche Bedenken, aber asdf nutzt pyenv [3], und das wirkt auf mich offizieller
Kann jemand erklären, welches Tool für Python-Installationen besser und sicherer ist, uv oder asdf?
[1] https://docs.astral.sh/uv/guides/install-python/
[2] https://github.com/asdf-community/asdf-python
[3] https://github.com/pyenv/pyenv/tree/master/plugins/python-bu...
Woher sonst sollte er ihn auch holen
[1]: https://github.com/astral-sh/python-build-standalone/blob/a2...
uvundcpythonmache ich mir nicht viele Sorgen. Der Prozess ist solide, die Reaktion schnell, und inzwischen ist auch viel Finanzierung daWas mir Sorgen macht, sind etwa Formatter wie
mdformat, die weit verbreitet sind, aber im Wesentlichen von einer Person in ihrer Freizeit gepflegt werden, oder sehr spezielle Abhängigkeiten, die seit Jahren nicht aktualisiert wurden und drei Ebenen tief im Dependency Tree hängenIch möchte in einer aktiv entwickelten App nicht jedes Update pinnen und manuell freigeben müssen, aber bei ernsthaften Anwendungen scheint das inzwischen fast Pflicht zu werden
Dann hole ich mir wohl besser wieder API-Keys aus unverschlüsselten
.env-DateienWenn so etwas bei einer großen Consumer-Webapp passiert, ist es peinlich, aber nachvollziehbar; wenn man aber wegen einer indirekten Abhängigkeit in einem Demo-Repo, das zufällig auf demselben Host und System liegt, Hunderte oder Tausende Dollar verliert, ist das schon brutal
Weiß jemand, ob OAI oder Anthropic bei auf diese Weise gestohlenen Schlüsseln Rückerstattungen geben, oder gilt das als Benutzerfehler?
Ich weiß nicht, wie groß der Risikounterschied wirklich ist, ob sie die Python-Binärdateien selbst bauen oder jemand anderes
In letzter Zeit entstehen die meisten meiner
pip install-Befehle dadurch, dass Claude Code sie vorschlägt und ich einfach Enter drückeDas Modell wurde mit Daten von vor einigen Monaten trainiert und kann unmöglich wissen, was diese Woche kompromittiert wurde
Damit habe ich mir wohl den denkbar schlechtesten Filter gebaut, um zu beurteilen, ob „dieses Paket gerade sicher ist“
Du hast gesagt, dass du Claude Code Software empfehlen lässt, die du aus dem Internet installieren sollst, und sie dann einfach installierst
Ich habe noch nie gehört, dass jemand vorschlägt, Claude Code oder irgendein LLM sei ein Filter, um zu beurteilen, ob „dieses Paket gerade sicher ist“, und aus genau dem von dir genannten Grund wäre das eine extrem schlechte Heuristik
setup.pyauf meinem Rechner ausführen wirdEs gibt ja nichts, was das Paket vor der Ausführung tatsächlich inspiziert
Was wir brauchen, ist ein Tool, das vor der Ausführung Metadaten abruft und zeigt, welche Hooks vorhanden sind
Claude Code wird fast täglich aktualisiert, manchmal sogar mehrmals pro Tag
Wenn Anthropic irgendwann kompromittiert wird, sind wir alle richtig dran
Aber heutzutage ist offenbar alles YOLO
Ich habe auf GitHub diese Nachricht vom 20. April gesehen und bin etwas verwirrt
"deependujha hi @thebaptiste, thanks for inquiring. Release of 2.6.2 is blocked due to some internal reasons. Will notify once release is made."Falls sie das Problem damals schon kannten und bis jetzt nicht gewarnt haben, fände ich das wirklich unerquicklich
Es wäre gut, wenn jemand mit mehr Wissen das klar erklären könnte
https://github.com/Lightning-AI/pytorch-lightning/issues/216...
Davor gab es keine betroffenen Distributionen, und wir wussten auch nichts von einem Leak
Das ursprüngliche Release auf GitHub war nicht betroffen, wurde aber zur Vermeidung weiterer Verwirrung heruntergenommen