Zum Inhalt springen
CVE-2026-45321CriticalCVSS: 9.6

Supply-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>/mem zur 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.org zur 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-credentials sowie 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 install oder yarn install auf einem System ausgeführt wurde
  • Prüfen Sie die package-lock.json / pnpm-lock.yaml auf betroffene Versionen
  • Optional: npm pack @tanstack/<name>@<version> und Prüfung auf router_init.js im Tarball sowie den optionalDependencies-Eintrag "@tanstack/setup": "github:tanstack/router#79ac49..."

Bei Kompromittierung

  1. System als kompromittiert betrachten — die Malware hatte vollen Zugriff auf alle während der Installation verfügbaren Anmeldeinformationen
  2. 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
  3. Cloud-Audit-Logs prüfen auf unautorisierte Aktivitäten ab dem 11. Mai 2026 ab 19:20 UTC
  4. 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_modules löschen und vollständig neu installieren
  • npm config set ignore-scripts true als temporäre Defense-in-Depth-Maßnahme
  • CI-Pipelines prüfen, die innerhalb des Angriffszeitfensters liefen
  • pull_request_target-Workflows auditieren und mit repository_owner-Guards sowie SHA-pinned Action-Referenzen härten
  • GitHub Actions-Caches nach sensiblen Workflows regelmäßig löschen

Quellen