Loading...
Skip to main content

CVE-2026-45321 — Malware in @tanstack/react-router-devtools — CVE...

CRITICAL
Actively Exploited

Malware in @tanstack/* packages exfiltrates cloud credentials, GitHub tokens, and SSH keys

Published May 12, 2026Updated September 10, 2026Source: osv

What Should I Do?

Patch Immediately

This vulnerability is confirmed under active exploitation (CISA KEV). Patch within 24-48 hours if possible.

Summary

## Summary On 2026-05-11, between approximately 19:20 and 19:26 UTC, 84 malicious versions across 42 `@tanstack/*` packages were published to the npm registry. The publishes were authenticated via the legitimate GitHub Actions OIDC trusted-publisher binding for `TanStack/router`, but the publish workflow itself was not modified. The attacker chained three known vulnerability classes — a `pull_request_target` "Pwn Request" misconfiguration, GitHub Actions cache poisoning across the fork↔base trust boundary, and runtime memory extraction of the OIDC token from the Actions runner process — to publish credential-stealing malware under a trusted identity. Each affected package received exactly two malicious versions, published a few minutes apart. ## Impact A user installing any affected version executes a payload (~2.3 MB obfuscated `router_init.js`) at install time that: - Harvests credentials from common locations: - AWS instance metadata (IMDS) and Secrets Manager - GCP metadata service - Kubernetes service-account tokens - HashiCorp Vault tokens - `~/.npmrc` (npm tokens) - GitHub tokens (env vars, `gh` CLI config, `.git-credentials`) - SSH private keys (`~/.ssh/`) - Exfiltrates harvested data over the Session/Oxen messenger file-upload network (`filev2.getsession.org`, `seed{1,2,3}.getsession.org`). This is end-to-end encrypted with no attacker-controlled C2, so blocking by IP or domain is the only network mitigation. - Enumerates packages that the victim maintains via `registry.npmjs.org/-/v1/search?text=maintainer:<user>` and republishes them with the same injection, propagating the compromise across npm. Any developer or CI environment that ran `npm install`, `pnpm install`, or `yarn install` against an affected version on 2026-05-11 should be considered compromised. All credentials accessible to the install process should be rotated immediately. Cloud audit logs should be reviewed for activity originating from the affected hosts during and after the install window. ## Detection Inspect the published manifest of any pinned `@tanstack/*` version. Malicious manifests contain this exact `optionalDependencies` entry: ```json "optionalDependencies": { "@tanstack/setup": "github:tanstack/router#79ac49eedf774dd4b0cfa308722bc463cfe5885c" } ``` To check a version without running install scripts: ```bash npm pack @tanstack/<name>@<version> # downloads tarball; does NOT execute lifecycle scripts tar -xzf *.tgz grep -A3 optionalDependencies package/package.json ls -la package/router_init.js # malicious payload, ~2.3 MB, present at package root ``` The payload file `router_init.js` is approximately 2.3 MB of obfuscated JavaScript. It is placed at the tarball root and is intentionally not declared in the package's `"files"` array, so it does not appear in the package's documented contents. ## Mechanism `@tanstack/setup` is not a real package on the npm registry. The `github:tanstack/router#79ac49ee...` specifier resolves to an orphan commit pushed to a fork in the `tanstack/router` GitHub fork network. GitHub serves commits across the entire fork network for git-URL dependencies, so the attacker did not require write access to `TanStack/router` itself — only the ability to fork and push to their own fork. When npm processes the optional dependency, it: 1. Fetches the orphan commit from the fork network. 2. Installs the commit's declared dependencies (which include a real `bun` binary). 3. Runs the commit's `prepare` lifecycle script: `bun run tanstack_runner.js && exit 1`. The trailing `exit 1` causes the optional install to fail, after which npm silently discards it — leaving no `node_modules` trace. 4. The `tanstack_runner.js` script in turn executes `router_init.js` from the host package's tarball. ## Patches Affected versions are being deprecated on npm with a `SECURITY:` notice. Where npm policy allows (no existing third-party dependents), affected versions are also being unpublished. The npm security team has been engaged to pull tarballs server-side for versions that cannot be unpublished. Clean follow-up releases are being prepared. Update to the patched version listed in the affected-products table for each package, then reinstall from a clean lockfile. ## Workarounds Until clean follow-up releases are available: - Pin every `@tanstack/*` dependency to a known-good version published before 2026-05-11 19:00 UTC. The last known-good version for most affected packages was published on 2026-03-15. - Delete `node_modules` and the lockfile, then reinstall to ensure no transitive dependency resolves to a malicious version. - Configure npm to skip lifecycle scripts on install (`npm config set ignore-scripts true`) as a temporary defense-in-depth measure. - For CI, audit any pipeline that ran `install` against `@tanstack/*` between 19:20 and 19:30 UTC on 2026-05-11. Treat the runner as compromised and rotate any secrets it had access to. ## Indicators of compromise | Indicator | Value | |---|---| | Malicious git ref | `github:tanstack/router#79ac49eedf774dd4b0cfa308722bc463cfe5885c` | | Fictitious package name | `@tanstack/setup` | | Payload filename | `router_init.js` (~2.3 MB, package root, undeclared in `files`) | | Helper filename in orphan commit | `tanstack_runner.js` | | Exfiltration network | `filev2.getsession.org`, `seed1.getsession.org`, `seed2.getsession.org`, `seed3.getsession.org` | | Second-stage payload URLs | `https://litter.catbox.moe/h8nc9u.js`, `https://litter.catbox.moe/7rrc6l.mjs` | | Poisoned cache key | `Linux-pnpm-store-6f9233a50def742c09fde54f56553d6b449a535adf87d4083690539f49ae4da11` | | Publish window (UTC) | 2026-05-11 19:20 — 19:26 | | Publish mechanism | GitHub Actions OIDC trusted publisher (`oidc:db7d6f54-05d5-412b-8a10-e7a8398b303e`) | | Workflow runs | https://github.com/TanStack/router/actions/runs/25613093674 (attempt 4), https://github.com/TanStack/router/actions/runs/25691781302 | | Attacker GitHub accounts | `zblgg` (id 127806521), `voicproducoes` (id 269549300) | | Attacker fork (renamed to evade detection) | https://github.com/zblgg/configuration | ## Credits - The security researcher who initially disclosed the vulnerability publicly with detailed analysis at https://github.com/TanStack/router/issues/7383 ## References - Public incident tracking issue: https://github.com/TanStack/router/issues/7383 - Related research: - Adnan Khan, "The Monsters in Your Build Cache: GitHub Actions Cache Poisoning" (May 2024) - GitHub Security Lab, "Keeping your GitHub Actions and workflows secure: Preventing Pwn Requests" - StepSecurity, "tj-actions/changed-files action is compromised" (March 2025) — the malicious payload reuses this incident's runner-memory extraction technique verbatim

Advisory Timeline

  • First published May 12, 2026 (153 days ago).
  • Last revised September 10, 2026 — 121 days after initial publication.
  • Added to CISA's Known Exploited Vulnerabilities catalog 15 days after publication.

Remediation

Upgrade to the fixed version using your package manager.

npm
Update @tanstack/react-router-devtools to 1.166.20 or later
npm install @tanstack/react-router-devtools@1.166.20
npm
Update @tanstack/solid-router-devtools to 1.166.20 or later
npm install @tanstack/solid-router-devtools@1.166.20
npm
Update @tanstack/react-router-devtools to 1.166.20 or later
npm install @tanstack/react-router-devtools@1.166.20
npm
Update @tanstack/valibot-adapter to 1.166.16 or later
npm install @tanstack/valibot-adapter@1.166.16
npm
Update @tanstack/react-start-rsc to 0.0.51 or later
npm install @tanstack/react-start-rsc@0.0.51
npm
Update @tanstack/solid-router to 1.169.9 or later
npm install @tanstack/solid-router@1.169.9
npm
Update @tanstack/router-generator to 1.166.49 or later
npm install @tanstack/router-generator@1.166.49
npm
Update @tanstack/router-devtools to 1.166.20 or later
npm install @tanstack/router-devtools@1.166.20
npm
Update @tanstack/vue-start-client to 1.166.50 or later
npm install @tanstack/vue-start-client@1.166.50
npm
Update @tanstack/eslint-plugin-start to 0.0.8 or later
npm install @tanstack/eslint-plugin-start@0.0.8
npm
Update @tanstack/vue-router to 1.169.9 or later
npm install @tanstack/vue-router@1.169.9
npm
Update @tanstack/react-start to 1.167.72 or later
npm install @tanstack/react-start@1.167.72
npm
Update @tanstack/start-client-core to 1.168.9 or later
npm install @tanstack/start-client-core@1.168.9
npm
Update @tanstack/start-server-core to 1.167.37 or later
npm install @tanstack/start-server-core@1.167.37
npm
Update @tanstack/solid-start-client to 1.166.54 or later
npm install @tanstack/solid-start-client@1.166.54
npm
Update @tanstack/start-client-core to 1.168.9 or later
npm install @tanstack/start-client-core@1.168.9
npm
Update @tanstack/start-fn-stubs to 1.161.13 or later
npm install @tanstack/start-fn-stubs@1.161.13
npm
Update @tanstack/router-ssr-query-core to 1.168.7 or later
npm install @tanstack/router-ssr-query-core@1.168.7
npm
Update @tanstack/react-start-client to 1.166.55 or later
npm install @tanstack/react-start-client@1.166.55
npm
Update @tanstack/solid-router-ssr-query to 1.166.19 or later
npm install @tanstack/solid-router-ssr-query@1.166.19
npm
Update @tanstack/eslint-plugin-router to 1.161.13 or later
npm install @tanstack/eslint-plugin-router@1.161.13
npm
Update @tanstack/router-devtools-core to 1.167.10 or later
npm install @tanstack/router-devtools-core@1.167.10
npm
Update @tanstack/router-devtools-core to 1.167.10 or later
npm install @tanstack/router-devtools-core@1.167.10
npm
Update @tanstack/router-core to 1.169.9 or later
npm install @tanstack/router-core@1.169.9
npm
Update @tanstack/vue-start to 1.167.65 or later
npm install @tanstack/vue-start@1.167.65
npm
Update @tanstack/router-vite-plugin to 1.166.57 or later
npm install @tanstack/router-vite-plugin@1.166.57
npm
Update @tanstack/start-static-server-functions to 1.166.48 or later
npm install @tanstack/start-static-server-functions@1.166.48
npm
Update @tanstack/start-storage-context to 1.166.42 or later
npm install @tanstack/start-storage-context@1.166.42
npm
Update @tanstack/react-start-server to 1.166.59 or later
npm install @tanstack/react-start-server@1.166.59
npm
Update @tanstack/vue-router-ssr-query to 1.166.19 or later
npm install @tanstack/vue-router-ssr-query@1.166.19
npm
Update @tanstack/history to 1.161.13 or later
npm install @tanstack/history@1.161.13
npm
Update @tanstack/virtual-file-routes to 1.161.14 or later
npm install @tanstack/virtual-file-routes@1.161.14
npm
Update @tanstack/router-cli to 1.166.50 or later
npm install @tanstack/router-cli@1.166.50
npm
Update @tanstack/solid-router to 1.169.9 or later
npm install @tanstack/solid-router@1.169.9
npm
Update @tanstack/react-router-ssr-query to 1.166.19 or later
npm install @tanstack/react-router-ssr-query@1.166.19
npm
Update @tanstack/nitro-v2-vite-plugin to 1.154.16 or later
npm install @tanstack/nitro-v2-vite-plugin@1.154.16
npm
Update @tanstack/router-plugin to 1.167.42 or later
npm install @tanstack/router-plugin@1.167.42
npm
Update @tanstack/vue-start-client to 1.166.50 or later
npm install @tanstack/vue-start-client@1.166.50
npm
Update @tanstack/solid-router-ssr-query to 1.166.19 or later
npm install @tanstack/solid-router-ssr-query@1.166.19
npm
Update @tanstack/vue-router-devtools to 1.166.20 or later
npm install @tanstack/vue-router-devtools@1.166.20
npm
Update @tanstack/solid-start-server to 1.166.58 or later
npm install @tanstack/solid-start-server@1.166.58
npm
Update @tanstack/react-start-server to 1.166.59 or later
npm install @tanstack/react-start-server@1.166.59
npm
Update @tanstack/router-plugin to 1.167.42 or later
npm install @tanstack/router-plugin@1.167.42
npm
Update @tanstack/router-utils to 1.161.15 or later
npm install @tanstack/router-utils@1.161.15
npm
Update @tanstack/react-router to 1.169.9 or later
npm install @tanstack/react-router@1.169.9
npm
Update @tanstack/vue-start to 1.167.65 or later
npm install @tanstack/vue-start@1.167.65
npm
Update @tanstack/router-generator to 1.166.49 or later
npm install @tanstack/router-generator@1.166.49
npm
Update @tanstack/react-start-client to 1.166.55 or later
npm install @tanstack/react-start-client@1.166.55
npm
Update @tanstack/vue-start-server to 1.166.54 or later
npm install @tanstack/vue-start-server@1.166.54
npm
Update @tanstack/vue-router-devtools to 1.166.20 or later
npm install @tanstack/vue-router-devtools@1.166.20
npm
Update @tanstack/zod-adapter to 1.166.16 or later
npm install @tanstack/zod-adapter@1.166.16
npm
Update @tanstack/start-plugin-core to 1.169.27 or later
npm install @tanstack/start-plugin-core@1.169.27
npm
Update @tanstack/arktype-adapter to 1.166.16 or later
npm install @tanstack/arktype-adapter@1.166.16
npm
Update @tanstack/start-server-core to 1.167.37 or later
npm install @tanstack/start-server-core@1.167.37
npm
Update @tanstack/router-vite-plugin to 1.166.57 or later
npm install @tanstack/router-vite-plugin@1.166.57
npm
Update @tanstack/router-utils to 1.161.15 or later
npm install @tanstack/router-utils@1.161.15
npm
Update @tanstack/nitro-v2-vite-plugin to 1.154.16 or later
npm install @tanstack/nitro-v2-vite-plugin@1.154.16
npm
Update @tanstack/vue-router-ssr-query to 1.166.19 or later
npm install @tanstack/vue-router-ssr-query@1.166.19
npm
Update @tanstack/virtual-file-routes to 1.161.14 or later
npm install @tanstack/virtual-file-routes@1.161.14
npm
Update @tanstack/react-start-rsc to 0.0.51 or later
npm install @tanstack/react-start-rsc@0.0.51
npm
Update @tanstack/router-devtools to 1.166.20 or later
npm install @tanstack/router-devtools@1.166.20
npm
Update @tanstack/history to 1.161.13 or later
npm install @tanstack/history@1.161.13
npm
Update @tanstack/solid-router-devtools to 1.166.20 or later
npm install @tanstack/solid-router-devtools@1.166.20
npm
Update @tanstack/react-router to 1.169.9 or later
npm install @tanstack/react-router@1.169.9
npm
Update @tanstack/vue-router to 1.169.9 or later
npm install @tanstack/vue-router@1.169.9
npm
Update @tanstack/solid-start to 1.167.69 or later
npm install @tanstack/solid-start@1.167.69
npm
Update @tanstack/router-cli to 1.166.50 or later
npm install @tanstack/router-cli@1.166.50
npm
Update @tanstack/eslint-plugin-router to 1.161.13 or later
npm install @tanstack/eslint-plugin-router@1.161.13
npm
Update @tanstack/eslint-plugin-start to 0.0.8 or later
npm install @tanstack/eslint-plugin-start@0.0.8
npm
Update @tanstack/solid-start-server to 1.166.58 or later
npm install @tanstack/solid-start-server@1.166.58
npm
Update @tanstack/solid-start to 1.167.69 or later
npm install @tanstack/solid-start@1.167.69
npm
Update @tanstack/solid-start-client to 1.166.54 or later
npm install @tanstack/solid-start-client@1.166.54
npm
Update @tanstack/start-plugin-core to 1.169.27 or later
npm install @tanstack/start-plugin-core@1.169.27
npm
Update @tanstack/start-storage-context to 1.166.42 or later
npm install @tanstack/start-storage-context@1.166.42
npm
Update @tanstack/router-core to 1.169.9 or later
npm install @tanstack/router-core@1.169.9
npm
Update @tanstack/react-router-ssr-query to 1.166.19 or later
npm install @tanstack/react-router-ssr-query@1.166.19
npm
Update @tanstack/arktype-adapter to 1.166.16 or later
npm install @tanstack/arktype-adapter@1.166.16
npm
Update @tanstack/valibot-adapter to 1.166.16 or later
npm install @tanstack/valibot-adapter@1.166.16
npm
Update @tanstack/zod-adapter to 1.166.16 or later
npm install @tanstack/zod-adapter@1.166.16
npm
Update @tanstack/router-ssr-query-core to 1.168.7 or later
npm install @tanstack/router-ssr-query-core@1.168.7
npm
Update @tanstack/start-fn-stubs to 1.161.13 or later
npm install @tanstack/start-fn-stubs@1.161.13
npm
Update @tanstack/react-start to 1.167.72 or later
npm install @tanstack/react-start@1.167.72
npm
Update @tanstack/vue-start-server to 1.166.54 or later
npm install @tanstack/vue-start-server@1.166.54
npm
Update @tanstack/start-static-server-functions to 1.166.48 or later
npm install @tanstack/start-static-server-functions@1.166.48

After upgrading, run your dependency scanner again to confirm the vulnerability is resolved.

Affected Packages (84)

Affects 1 ecosystem: npm (42).

PackageEcosystemAffectedFixed In
@tanstack/react-router-devtools
npm
1.166.191.166.20
@tanstack/solid-router-devtools
npm
1.166.191.166.20
@tanstack/react-router-devtools
npm
1.166.161.166.20
@tanstack/valibot-adapter
npm
1.166.151.166.16
@tanstack/react-start-rsc
npm
0.0.500.0.51
@tanstack/solid-router
npm
1.169.81.169.9
@tanstack/router-generator
npm
1.166.481.166.49
@tanstack/router-devtools
npm
1.166.161.166.20
@tanstack/vue-start-client
npm
1.166.461.166.50
@tanstack/eslint-plugin-start
npm
0.0.70.0.8
@tanstack/vue-router
npm
1.169.81.169.9
@tanstack/react-start
npm
1.167.681.167.72
@tanstack/start-client-core
npm
1.168.81.168.9
@tanstack/start-server-core
npm
1.167.361.167.37
@tanstack/solid-start-client
npm
1.166.531.166.54
@tanstack/start-client-core
npm
1.168.51.168.9
@tanstack/start-fn-stubs
npm
1.161.121.161.13
@tanstack/router-ssr-query-core
npm
1.168.31.168.7
@tanstack/react-start-client
npm
1.166.511.166.55
@tanstack/solid-router-ssr-query
npm
1.166.181.166.19
@tanstack/eslint-plugin-router
npm
1.161.91.161.13
@tanstack/router-devtools-core
npm
1.167.61.167.10
@tanstack/router-devtools-core
npm
1.167.91.167.10
@tanstack/router-core
npm
1.169.51.169.9
@tanstack/vue-start
npm
1.167.641.167.65
@tanstack/router-vite-plugin
npm
1.166.531.166.57
@tanstack/start-static-server-functions
npm
1.166.441.166.48
@tanstack/start-storage-context
npm
1.166.381.166.42
@tanstack/react-start-server
npm
1.166.581.166.59
@tanstack/vue-router-ssr-query
npm
1.166.151.166.19
@tanstack/history
npm
1.161.91.161.13
@tanstack/virtual-file-routes
npm
1.161.131.161.14
@tanstack/router-cli
npm
1.166.491.166.50
@tanstack/solid-router
npm
1.169.51.169.9
@tanstack/react-router-ssr-query
npm
1.166.181.166.19
@tanstack/nitro-v2-vite-plugin
npm
1.154.151.154.16
@tanstack/router-plugin
npm
1.167.411.167.42
@tanstack/vue-start-client
npm
1.166.491.166.50
@tanstack/solid-router-ssr-query
npm
1.166.151.166.19
@tanstack/vue-router-devtools
npm
1.166.161.166.20
@tanstack/solid-start-server
npm
1.166.571.166.58
@tanstack/react-start-server
npm
1.166.551.166.59
@tanstack/router-plugin
npm
1.167.381.167.42
@tanstack/router-utils
npm
1.161.141.161.15
@tanstack/react-router
npm
1.169.51.169.9
@tanstack/vue-start
npm
1.167.611.167.65
@tanstack/router-generator
npm
1.166.451.166.49
@tanstack/react-start-client
npm
1.166.541.166.55
@tanstack/vue-start-server
npm
1.166.531.166.54
@tanstack/vue-router-devtools
npm
1.166.191.166.20
@tanstack/zod-adapter
npm
1.166.121.166.16
@tanstack/start-plugin-core
npm
1.169.231.169.27
@tanstack/arktype-adapter
npm
1.166.151.166.16
@tanstack/start-server-core
npm
1.167.331.167.37
@tanstack/router-vite-plugin
npm
1.166.561.166.57
@tanstack/router-utils
npm
1.161.111.161.15
@tanstack/nitro-v2-vite-plugin
npm
1.154.121.154.16
@tanstack/vue-router-ssr-query
npm
1.166.181.166.19
@tanstack/virtual-file-routes
npm
1.161.101.161.14
@tanstack/react-start-rsc
npm
0.0.470.0.51
@tanstack/router-devtools
npm
1.166.191.166.20
@tanstack/history
npm
1.161.121.161.13
@tanstack/solid-router-devtools
npm
1.166.161.166.20
@tanstack/react-router
npm
1.169.81.169.9
@tanstack/vue-router
npm
1.169.51.169.9
@tanstack/solid-start
npm
1.167.651.167.69
@tanstack/router-cli
npm
1.166.461.166.50
@tanstack/eslint-plugin-router
npm
1.161.121.161.13
@tanstack/eslint-plugin-start
npm
0.0.40.0.8
@tanstack/solid-start-server
npm
1.166.541.166.58
@tanstack/solid-start
npm
1.167.681.167.69
@tanstack/solid-start-client
npm
1.166.501.166.54
@tanstack/start-plugin-core
npm
1.169.261.169.27
@tanstack/start-storage-context
npm
1.166.411.166.42
@tanstack/router-core
npm
1.169.81.169.9
@tanstack/react-router-ssr-query
npm
1.166.151.166.19
@tanstack/arktype-adapter
npm
1.166.121.166.16
@tanstack/valibot-adapter
npm
1.166.121.166.16
@tanstack/zod-adapter
npm
1.166.151.166.16
@tanstack/router-ssr-query-core
npm
1.168.61.168.7
@tanstack/start-fn-stubs
npm
1.161.91.161.13
@tanstack/react-start
npm
1.167.711.167.72
@tanstack/vue-start-server
npm
1.166.501.166.54
@tanstack/start-static-server-functions
npm
1.166.471.166.48

Vulnerability Classification

Common Weakness Enumeration (CWE) identifiers for this vulnerability type.

CVSS Score Breakdown

What the CVSS (Common Vulnerability Scoring System) 9.6 score means for each attack dimension.

Attack Vector
Network
Attack Complexity
Low
Privileges Required
None
User Interaction
Required
Scope
Changed
Confidentiality
High
Integrity
High
Availability
High

CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:H/I:H/A:H

Frequently Asked Questions

What is CVE-2026-45321?
Malware in @tanstack/* packages exfiltrates cloud credentials, GitHub tokens, and SSH keys This vulnerability has been assigned a severity rating of CRITICAL (CVSS score: 9.6/10).
How do I check if my project is affected by CVE-2026-45321?
CVE-2026-45321 affects @tanstack/react-router-devtools, @tanstack/solid-router-devtools and @tanstack/valibot-adapter (and 39 more). This vulnerability is listed in CISA's Known Exploited Vulnerabilities (KEV) catalog, meaning it is being actively exploited in the wild. Use GeekWala's free vulnerability scanner to check your dependencies against CVE-2026-45321 and 200,000+ other known vulnerabilities.

Severity & Exploitability

CVSS Score
9.6

Exploitation is straightforward and causes maximum impact. Patch immediately.

Known Exploited Vulnerability

This vulnerability is in CISA's Known Exploited Vulnerabilities (KEV) catalog, indicating active exploitation in the wild.

Added to KEV catalog: May 27, 2026

Remediation deadline: June 10, 2026

Also Known As

GHSA-g7cv-rxg3-hmpx

Related CVEs

  • CVE-2026-107722
    CRITICAL

    fast-jwt: Incomplete patch of CVE-2026-34950: Non-whitespace key-prefix re-enables RSA→HS256 algorithm confusion

  • CVE-2026-108261
    CRITICAL

    TinaCMS admin preview iframe loads an attacker-controlled origin from the URL fragment

Check if you're affected

Scan your dependencies to see if this vulnerability affects your projects.

Scan Your Dependencies