CVE-2026-45321CriticalCVSS: 9.6Supply-Chain-Angriff auf TanStack: 84 manipulierte npm-Pakete veröffentlicht
Am 11. Mai 2026 veröffentlichte ein Angreifer 84 manipulierte Versionen von 42 @tanstack/*-Paketen auf dem npm-Registry. Die Malware exfiltriert Cloud-Anmeldeinformationen, SSH-Schlüssel und GitHub-Tokens und verbreitet sich selbstständig auf weitere Pakete. Betroffen sind alle Systeme, die während des 6-minütigen Veröffentlichungsfensters eine der kompromittierten Versionen installiert haben.
METADATEN
- Entdeckt:
- 12.05.2026
- Patch verfügbar:
- Ja
BETROFFENE SYSTEME
- •@tanstack/arktype-adapter 1.166.12
- •1.166.15
- •@tanstack/eslint-plugin-router 1.161.9
- •1.161.12
- •@tanstack/eslint-plugin-start 0.0.4
- •0.0.7
- •@tanstack/history 1.161.9
- •1.161.12
- •@tanstack/nitro-v2-vite-plugin 1.154.12
- •1.154.15
- •@tanstack/router-vite-plugin 1.166.53
- •1.166.56
- •@tanstack/react-router 1.169.5
- •1.169.8
- •@tanstack/react-router-devtools 1.166.16
- •1.166.19
- •@tanstack/react-router-ssr-query 1.166.15
- •1.166.18
- •@tanstack/react-start 1.167.68
- •1.167.71
- •@tanstack/react-start-client 1.166.51
- •1.166.54
- •@tanstack/react-start-rsc 0.0.47
- •0.0.50
- •@tanstack/react-start-server 1.166.55
- •1.166.58
- •@tanstack/router-cli 1.166.46
- •1.166.49
- •@tanstack/router-core 1.169.5
- •1.169.8
- •@tanstack/router-devtools 1.166.16
- •1.166.19
- •@tanstack/router-devtools-core 1.167.6
- •1.167.9
- •@tanstack/router-generator 1.166.45
- •1.166.48
- •@tanstack/router-plugin 1.167.38
- •1.167.41
- •@tanstack/router-ssr-query-core 1.168.3
- •1.168.6
- •@tanstack/router-utils 1.161.11
- •1.161.14
- •@tanstack/solid-router 1.169.5
- •1.169.8
- •@tanstack/solid-router-devtools 1.166.16
- •1.166.19
- •@tanstack/solid-router-ssr-query 1.166.15
- •1.166.18
- •@tanstack/solid-start 1.167.65
- •1.167.68
- •@tanstack/solid-start-client 1.166.50
- •1.166.53
- •@tanstack/solid-start-server 1.166.54
- •1.166.57
- •@tanstack/start-client-core 1.168.5
- •1.168.8
- •@tanstack/start-fn-stubs 1.161.9
- •1.161.12
- •@tanstack/start-plugin-core 1.169.23
- •1.169.26
- •@tanstack/start-server-core 1.167.33
- •1.167.36
- •@tanstack/start-static-server-functions 1.166.44
- •1.166.47
- •@tanstack/start-storage-context 1.166.38
- •1.166.41
- •@tanstack/valibot-adapter 1.166.12
- •1.166.15
- •@tanstack/virtual-file-routes 1.161.10
- •1.161.13
- •@tanstack/vue-router 1.169.5
- •1.169.8
- •@tanstack/vue-router-devtools 1.166.16
- •1.166.19
- •@tanstack/vue-router-ssr-query 1.166.15
- •1.166.18
- •@tanstack/vue-start 1.167.61
- •1.167.64
- •@tanstack/vue-start-client 1.166.46
- •1.166.49
- •@tanstack/vue-start-server 1.166.50
- •1.166.53
- •@tanstack/zod-adapter 1.166.12
- •1.166.15
Zusammenfassung
Am 11. Mai 2026 zwischen 19:20 und 19:26 UTC gelang es einem Angreifer, 84 schadhafte Versionen von 42 @tanstack/*-Paketen über den vertrauenswürdigen OIDC-Publisher des TanStack/router GitHub-Repositorys zu veröffentlichen. Der Angriff verknüpfte drei bekannte Schwachstellenklassen: eine pull_request_target-Fehlkonfiguration (“Pwn Request”), Cache-Poisoning in GitHub Actions über die Fork↔Base-Vertrauensgrenze hinweg sowie die Extraktion von OIDC-Tokens aus dem Arbeitsspeicher des Actions-Runners. Die Malware (router_init.js, ca. 2,3 MB) wird bereits bei der Installation ausgeführt und exfiltriert Anmeldeinformationen aus AWS, GCP, Kubernetes, HashiCorp Vault, GitHub und SSH sowie npm-Tokens. Zudem enumeriert sie vom Opfer verwaltete Pakete und verbreitet die Kompromittierung auf diese weiter.
Die schadhaften Versionen wurden innerhalb von 20–26 Minuten durch einen externen Sicherheitsforscher entdeckt. Alle betroffenen Versionen wurden zwischen 20:19 und 21:03 UTC deponiert und zwischen 22:13 und 23:55 UTC von npm-seitig aus dem Registry entfernt. Bereinigte Folgeversionen stehen für jedes Paket bereit.
Technische Details
Der Angriff erfolgte in zwei Phasen:
1. Cache-Poisoning (11. Mai, 10:49–11:31 UTC):
Der Angreifer forkte das TanStack/router-Repository unter dem Tarnnamen zblgg/configuration und erstellte einen Pull-Request (#7378) mit einem manipulierten Commit. Der PR löste die Workflows bundle-size.yml und labeler.yml aus, die beide pull_request_target verwenden und dadurch mit den Berechtigungen des Basis-Repositorys laufen. Die darin ausgeführte Build-Pipeline installierte Abhängigkeiten inklusive einer schadhaften Datei vite_setup.mjs, die gezielt Daten in den pnpm-Cache-Ordner schrieb. Der anschließende Cache-Speichervorgang (actions/cache@v5) hinterlegte diesen manipulierten Cache unter einem Schlüssel, den der Produktions-Workflow release.yml später verwenden würde.
2. Detonation (11. Mai, 19:15–19:26 UTC):
Durch zwei erneute Ausführungen des release.yml-Workflows (ausgelöst durch Merges und manuelle Wiederholungen) wurde der vergiftete Cache auf den GitHub-Runner geladen. Die darin enthaltenen schadhaften Binärdateien führten während der Build-Phase folgende Schritte aus:
- Lokalisierung des
Runner.Worker-Prozesses über/proc/*/cmdline - Auslesen von
/proc/<pid>/memzur Extraktion des OIDC-JWT-Tokens aus dem Arbeitsspeicher (gleiche Technik wie beim tj-actions/changed-files-Vorfall vom März 2025) - Direktes POSTen des OIDC-Tokens an
registry.npmjs.orgzur Authentifizierung — unter Umgehung des eigentlichen Publish-Schritts im Workflow
Jedes Paket erhielt zwei schadhafte Versionen (ca. 6 Minuten auseinander). Die optionale Abhängigkeit @tanstack/setup (kein reales Paket) mit dem git-URL-Ziel github:tanstack/router#79ac49ee... lud einen verwaisten Commit aus dem Fork-Netzwerk, der ein prepare-Script (bun run tanstack_runner.js && exit 1) ausführte und so router_init.js aus dem Hauptpaket startete.
Die Malware:
- Sammelt Anmeldeinformationen aus AWS IMDS/Secrets Manager, GCP Metadata, Kubernetes Service-Account-Tokens, Vault,
~/.npmrc, GitHub-Umgebungsvariablen,gh-CLI,.git-credentialssowie SSH-Private-Keys aus~/.ssh/ - Überträgt die gesammelten Daten verschlüsselt über das Session/Oxen-Messenger-Netzwerk (
filev2.getsession.org,seed{1,2,3}.getsession.org) - Sucht über die npm-Suche nach weiteren vom Opfer verwalteten Paketen und veröffentlicht diese mit der gleichen Malware-Injektion (Selbstverbreitung)
Indikatoren einer Kompromittierung (IoCs)
| Indikator | Wert |
|---|---|
| Schadhafter git-Ref | github:tanstack/router#79ac49eedf774dd4b0cfa308722bc463cfe5885c |
| Fiktives Paket | @tanstack/setup |
| Payload-Datei | router_init.js (~2,3 MB, im Tarball-Stammverzeichnis, nicht in files deklariert) |
| Exfiltrationsnetzwerk | filev2.getsession.org, seed{1,2,3}.getsession.org |
| Cache-Key (vergiftet) | Linux-pnpm-store-6f9233a50def742c09fde54f56553d6b449a535adf87d4083690539f49ae4da11 |
| Angreifer-Accounts | zblgg (id 127806521), voicproducoes (id 269549300) |
| Angreifer-Fork | github.com/zblgg/configuration |
Betroffene Systeme
Alle 42 @tanstack/*-Pakete mit je zwei schadhaften Versionen:
| Paket | Schadhafte Versionen | Bereinigte Version |
|---|---|---|
@tanstack/arktype-adapter |
1.166.12, 1.166.15 | 1.166.16 |
@tanstack/eslint-plugin-router |
1.161.9, 1.161.12 | 1.161.13 |
@tanstack/eslint-plugin-start |
0.0.4, 0.0.7 | 0.0.8 |
@tanstack/history |
1.161.9, 1.161.12 | 1.161.13 |
@tanstack/nitro-v2-vite-plugin |
1.154.12, 1.154.15 | 1.154.16 |
@tanstack/router-vite-plugin |
1.166.53, 1.166.56 | 1.166.57 |
@tanstack/react-router |
1.169.5, 1.169.8 | 1.169.9 |
@tanstack/react-router-devtools |
1.166.16, 1.166.19 | 1.166.20 |
@tanstack/react-router-ssr-query |
1.166.15, 1.166.18 | 1.166.19 |
@tanstack/react-start |
1.167.68, 1.167.71 | 1.167.72 |
@tanstack/react-start-client |
1.166.51, 1.166.54 | 1.166.55 |
@tanstack/react-start-rsc |
0.0.47, 0.0.50 | 0.0.51 |
@tanstack/react-start-server |
1.166.55, 1.166.58 | 1.166.59 |
@tanstack/router-cli |
1.166.46, 1.166.49 | 1.166.50 |
@tanstack/router-core |
1.169.5, 1.169.8 | 1.169.9 |
@tanstack/router-devtools |
1.166.16, 1.166.19 | 1.166.20 |
@tanstack/router-devtools-core |
1.167.6, 1.167.9 | 1.167.10 |
@tanstack/router-generator |
1.166.45, 1.166.48 | 1.166.49 |
@tanstack/router-plugin |
1.167.38, 1.167.41 | 1.167.42 |
@tanstack/router-ssr-query-core |
1.168.3, 1.168.6 | 1.168.7 |
@tanstack/router-utils |
1.161.11, 1.161.14 | 1.161.15 |
@tanstack/solid-router |
1.169.5, 1.169.8 | 1.169.9 |
@tanstack/solid-router-devtools |
1.166.16, 1.166.19 | 1.166.20 |
@tanstack/solid-router-ssr-query |
1.166.15, 1.166.18 | 1.166.19 |
@tanstack/solid-start |
1.167.65, 1.167.68 | 1.167.69 |
@tanstack/solid-start-client |
1.166.50, 1.166.53 | 1.166.54 |
@tanstack/solid-start-server |
1.166.54, 1.166.57 | 1.166.58 |
@tanstack/start-client-core |
1.168.5, 1.168.8 | 1.168.9 |
@tanstack/start-fn-stubs |
1.161.9, 1.161.12 | 1.161.13 |
@tanstack/start-plugin-core |
1.169.23, 1.169.26 | 1.169.27 |
@tanstack/start-server-core |
1.167.33, 1.167.36 | 1.167.37 |
@tanstack/start-static-server-functions |
1.166.44, 1.166.47 | 1.166.48 |
@tanstack/start-storage-context |
1.166.38, 1.166.41 | 1.166.42 |
@tanstack/valibot-adapter |
1.166.12, 1.166.15 | 1.166.16 |
@tanstack/virtual-file-routes |
1.161.10, 1.161.13 | 1.161.14 |
@tanstack/vue-router |
1.169.5, 1.169.8 | 1.169.9 |
@tanstack/vue-router-devtools |
1.166.16, 1.166.19 | 1.166.20 |
@tanstack/vue-router-ssr-query |
1.166.15, 1.166.18 | 1.166.19 |
@tanstack/vue-start |
1.167.61, 1.167.64 | 1.167.65 |
@tanstack/vue-start-client |
1.166.46, 1.166.49 | 1.166.50 |
@tanstack/vue-start-server |
1.166.50, 1.166.53 | 1.166.54 |
@tanstack/zod-adapter |
1.166.12, 1.166.15 | 1.166.16 |
Empfehlungen und Maßnahmen
Kompromittierte Systeme identifizieren
- Überprüfen Sie, ob zwischen dem 11. Mai 2026, 19:20 und 19:30 UTC ein
npm install,pnpm installoderyarn installauf einem System ausgeführt wurde - Prüfen Sie die
package-lock.json/pnpm-lock.yamlauf betroffene Versionen - Optional:
npm pack @tanstack/<name>@<version>und Prüfung aufrouter_init.jsim Tarball sowie denoptionalDependencies-Eintrag"@tanstack/setup": "github:tanstack/router#79ac49..."
Bei Kompromittierung
- System als kompromittiert betrachten — die Malware hatte vollen Zugriff auf alle während der Installation verfügbaren Anmeldeinformationen
- Alle Zugangsdaten sofort rotieren:
- Cloud-Anbieter (AWS IAM/Rollen, GCP Service-Accounts, Kubernetes Service-Accounts)
- HashiCorp Vault-Tokens
- GitHub-Tokens (Umgebungsvariablen,
gh-CLI,.git-credentials) - npm-Tokens (
~/.npmrc) - SSH-Private-Keys
- Cloud-Audit-Logs prüfen auf unautorisierte Aktivitäten ab dem 11. Mai 2026 ab 19:20 UTC
- npm-Paket-Übersicht prüfen — die Malware veröffentlicht selbstständig manipulierte Versionen von Paketen, die das Opfer verwaltet
Prävention
- TanStack-Pakete aktualisieren: Alle auf die in der Tabelle genannten bereinigten Versionen aktualisieren
- Lockfile und
node_moduleslöschen und vollständig neu installieren npm config set ignore-scripts trueals temporäre Defense-in-Depth-Maßnahme- CI-Pipelines prüfen, die innerhalb des Angriffszeitfensters liefen
pull_request_target-Workflows auditieren und mitrepository_owner-Guards sowie SHA-pinned Action-Referenzen härten- GitHub Actions-Caches nach sensiblen Workflows regelmäßig löschen
Quellen
- GitHub Security Advisory GHSA-g7cv-rxg3-hmpx
- Öffentliches Incident-Tracking Issue #7383
- TanStack Postmortem: npm supply-chain compromise
- StepSecurity: Mini-Shai-Hulud Supply-Chain-Angriff
- Adnan Khan: The Monsters in Your Build Cache — GitHub Actions Cache Poisoning (Mai 2024)
- GitHub Security Lab: Keeping your GitHub Actions and workflows secure — Preventing Pwn Requests
- CVE-2026-45321
REFERENZEN
- https://github.com/TanStack/router/security/advisories/GHSA-g7cv-rxg3-hmpx
- https://github.com/TanStack/router/issues/7383
- https://tanstack.com/blog/npm-supply-chain-compromise-postmortem
- https://www.stepsecurity.io/blog/mini-shai-hulud-is-back-a-self-spreading-supply-chain-attack-hits-the-npm-ecosystem