Das npm-Paket, das Ihre Dateien löscht, wenn Sie versuchen, es zu stoppen
Crypto Scams

Das npm-Paket, das Ihre Dateien löscht, wenn Sie versuchen, es zu stoppen

Von germanlbn

Ein Angreifer hat 84 TanStack-npm-Versionen in 42 Paketen vergiftet, GitHub-OIDC-Tokens und Cloud-Schlüssel gestohlen und einen Totmannschalter eingebaut, der Ihr System zerstört.

Der Zeitpunkt des Angreifers war präzise. Ein Fork, ein versteckter Commit, ein Zero-Diff-Pull-Request und dann fast acht Stunden lang nichts Sichtbares.

Am 11. Mai zwischen 19:20 und 19:26 UTC trafen 84 schädliche Versionen, verteilt auf 42 offizielle @tanstack-npm-Pakete, die Registry. Laut @IntCyberDigest auf X hat allein @tanstack/react-router mehr als 12 Millionen wöchentliche Downloads. Das machte es zum perfekten Ziel.

Der Credential-Sweep, den niemand kommen sah

Die Nutzlast, eine etwa 2,3 MB große obfuskierte Datei namens router_init.js, wurde in dem Moment ausgeführt, in dem ein Entwickler oder eine CI-Pipeline npm install ausführte. AWS IMDS, GCP-Metadaten, Kubernetes-Service-Account-Tokens, Vault-Tokens, SSH-Private-Keys. Sie durchlief alle.

TanStack-Maintainer Tanner Linsley bestätigte, dass das gesamte Team 2FA aktiviert hatte. Laut dem auf tanstack.com veröffentlichten Postmortem spielte das keine Rolle. Die Angriffskette benötigte überhaupt keine npm-Anmeldeinformationen.

Die Exfiltration lief über das Session/Oxen-Messenger-Netzwerk, insbesondere filev2.getsession.org und seed1 bis seed3.getsession.org. Ende-zu-Ende-verschlüsselt. Kein angreifergesteuerter Command-and-Control-Server, der per IP blockiert werden könnte. Das Spielbuch des npm-Wurms, der Krypto-Schlüssel stiehlt, angepasst und verbessert.

Wie ein Zero-Diff-PR die gesamte Release-Pipeline vergiftete

Die Vorbereitung begann einen Tag zuvor. Ein Fork von TanStack/router, umbenannt in github.com/zblgg/configuration, um Fork-List-Suchen zu entgehen, erhielt am 10. Mai um 23:29 UTC einen schädlichen Commit. Gefälschte Identität: claude@users.noreply.github.com. Nicht das Anthropic-Produkt. Eine erfundene E-Mail.

PR #7378 wurde am nächsten Morgen geöffnet. Der pull_request_target-Workflow-Trigger, ein seit Langem dokumentiertes gefährliches Muster, führte Benchmark-Jobs mit dem Code des Forks aus. Das reichte.

Der vergiftete pnpm-Store-Cache wurde unter genau dem Schlüssel gespeichert, nach dem release.yml später suchen würde. Der Angreifer pushte den PR dann per Force-Push zurück zu einem Zero-File-No-Op und schloss ihn. Der Cache blieb bestehen. Forscher Adnan Khan dokumentierte diese Angriffsklasse im Jahr 2024. Der Angreifer übernahm die Technik fast wortwörtlich, inklusive des Quellenvermerks.

Als Maintainer Manuel später einen nicht verwandten PR zusammenführte, der einen CSS.supports-Fix in den Main brachte, wurde der Release-Workflow ausgelöst und stellte den vergifteten Cache wieder her. GitHub-Anmeldeinformationen wurden durch dieselbe GitHub-basierte Methode des Credential-Diebstahls erbeutet, die bereits in früheren Kampagnen gesehen wurde.

Der Totmannschalter

Forscher carlini, der auf GitHub Issue #7383 postete, wies auf etwas anderes in der Nutzlast hin. Ein Skript, das als systemd-Dienst unter Linux und als LaunchAgent unter macOS installiert wurde, fragt alle 60 Sekunden api.github.com mit dem gestohlenen Token ab. Wenn dieses Token widerrufen wird, führt das Skript rm -rf aus. Ihr Home-Verzeichnis, weg.

„Bitte seien Sie vorsichtig beim Widerrufen von Tokens“, schrieb carlini im Thread. Und beließ es dabei.

Sicherheitsforscher ahmadnassri merkte im Tracking-Issue an, dass socket.dev 84 einzelne @tanstack-PURLs sowie den Wurm verfolgte, der sich auf 200 oder mehr andere Pakete ausbreitete.

Der OIDC-Trick, der alles sauber aussehen ließ

Die vergifteten Versionen trugen eine gültige kryptografische Herkunftsbestätigung. Die Veröffentlichung erfolgte über die OIDC-Trusted-Publisher-Bindung von GitHub Actions für den Release-Workflow von TanStack/router. Für npm sahen die Pakete identisch aus mit allem, was Linsley selbst ausgeliefert hätte.

Dies ist der Teil, der Verteidiger verunsichert. Die Nutzlast benötigte niemandes npm-Token. Sie erstellte ein veröffentlichungsfähiges OIDC-Token, indem sie den Arbeitsspeicher des Runners direkt auslas, den GitHub-Actions-Runner.Worker-Prozess über /proc-Einträge lokalisierte und ihn auslas. Das gleiche Python-Skript, das auch beim Kompromittieren von tj-actions/changed-files im März 2025 verwendet wurde.

@IntCyberDigest beschrieb es auf X als den ersten dokumentierten npm-Wurm, der mit einem gültigen, signierten Authentizitätszertifikat ausgeliefert wird.

Die Erkennung kam von außen. Forscher ashishkurmi, der für StepSecurity arbeitet, meldete es innerhalb von 20 Minuten nach der schädlichen Veröffentlichung öffentlich. Carlini reichte direkt bei npm einen Bericht ein, kurz bevor das GitHub-Issue veröffentlicht wurde.

Als sauber bestätigte Pakete: @tanstack/query, @tanstack/table, @tanstack/form, @tanstack/virtual, @tanstack/store. Jeder, der am 11. Mai ein betroffenes Paket installiert hat, sollte sofort AWS-, GCP-, Kubernetes-, Vault-, GitHub-, npm- und SSH-Anmeldeinformationen rotieren.

Das Team hat seitdem alle 84 Versionen als veraltet markiert und die npm-Sicherheit beauftragt, die Tarballs aus der Registry zu entfernen.

germanlbn

Über den Autor

germanlbn

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert