Security Digest · Vulnerability record · Known exploited
CVE-2026-45321: TanStack Unspecified Vulnerability
Exploited in the wild (CISA KEV). 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.
CISA KEV · added 2026-05-27 CVSS 9.6 Critical EPSS 1.1% · p64 Check exposure
Should you act?
Exploited: patch now if you run it
CISA has confirmed exploitation in the wild. This signal is computed from CISA KEV, EPSS and CVSS data; it is not an editorial verdict.
- Yes, if you run TanStack TanStack. CISA added this CVE to its Known Exploited Vulnerabilities catalog on 2026-05-27, which means there is reliable evidence of exploitation in the wild. US federal agencies must remediate by 2026-06-10; treat that as the outer limit, not the target. CISA also lists it as known to be used in ransomware campaigns.
- EPSS 1.1%, percentile 64: FIRST’s model estimates a 1.1% chance of exploitation activity in the next 30 days, higher than 64% of all scored CVEs (moderate). EPSS is a probability, not a verdict.
- Needs a user to click or open something. Phishing makes that realistic, but it is not wormable.
- Only applies if your dependency tree includes
@tanstack/arktype-adapter(npm) = 1.166.12, fixed in 1.166.16;@tanstack/eslint-plugin-router(npm) = 1.161.9, fixed in 1.161.13;@tanstack/eslint-plugin-start(npm) = 0.0.4, fixed in 0.0.8;@tanstack/history(npm) = 1.161.9, fixed in 1.161.13. Check your lockfile, including transitive dependencies. - Editorial verdict: Check exposure. Mini Shai-Hulud: TanStack npm Worm With Valid Provenance — If a lockfile picked up one of the bad TanStack Router/Start, Mistral or OpenSearch versions in mid-May 2026, treat that host as fully compromised and disable the dead-man's switch before rotating anything; everyone else can confirm and move on.
What it is
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 pullrequesttarget "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.
From the GitHub advisory
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 pullrequesttarget "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 routerinit.js) at install time that:
CISA’s summary
TanStack contains an unspecified vulnerability that allowed malicious versions of the product to be published to the npm registry to publish credential-stealing malware under a trusted identity.
Weakness type: CWE-506.
Product: TanStack TanStack · Assigned by: GitHub_M · Published: 2026-05-12
Affected and fixed versions
| Ecosystem | Package | Vulnerable | First fixed |
|---|---|---|---|
| npm | @tanstack/arktype-adapter | = 1.166.12 | 1.166.16 |
| npm | @tanstack/eslint-plugin-router | = 1.161.9 | 1.161.13 |
| npm | @tanstack/eslint-plugin-start | = 0.0.4 | 0.0.8 |
| npm | @tanstack/history | = 1.161.9 | 1.161.13 |
| npm | @tanstack/nitro-v2-vite-plugin | = 1.154.12 | 1.154.16 |
| npm | @tanstack/react-router | = 1.169.5 | 1.169.9 |
| npm | @tanstack/react-router-devtools | = 1.166.16 | 1.166.20 |
| npm | @tanstack/react-router-ssr-query | = 1.166.15 | 1.166.19 |
| npm | @tanstack/react-start | = 1.167.68 | 1.167.72 |
| npm | @tanstack/react-start-client | = 1.166.51 | 1.166.55 |
| npm | @tanstack/react-start-rsc | = 0.0.47 | 0.0.51 |
| npm | @tanstack/react-start-server | = 1.166.55 | 1.166.59 |
| npm | @tanstack/router-cli | = 1.166.46 | 1.166.50 |
| npm | @tanstack/router-core | = 1.169.5 | 1.169.9 |
| npm | @tanstack/router-devtools | = 1.166.16 | 1.166.20 |
| npm | @tanstack/router-devtools-core | = 1.167.6 | 1.167.10 |
| npm | @tanstack/router-generator | = 1.166.45 | 1.166.49 |
| npm | @tanstack/router-plugin | = 1.167.38 | 1.167.42 |
| npm | @tanstack/router-ssr-query-core | = 1.168.3 | 1.168.7 |
| npm | @tanstack/router-utils | = 1.161.11 | 1.161.15 |
| npm | @tanstack/router-vite-plugin | = 1.166.53 | 1.166.57 |
| npm | @tanstack/solid-router | = 1.169.5 | 1.169.9 |
| npm | @tanstack/solid-router-devtools | = 1.166.16 | 1.166.20 |
| npm | @tanstack/solid-router-ssr-query | = 1.166.15 | 1.166.19 |
| npm | @tanstack/solid-start | = 1.167.65 | 1.167.69 |
| npm | @tanstack/solid-start-client | = 1.166.50 | 1.166.54 |
| npm | @tanstack/solid-start-server | = 1.166.54 | 1.166.58 |
| npm | @tanstack/start-client-core | = 1.168.5 | 1.168.9 |
| npm | @tanstack/start-fn-stubs | = 1.161.9 | 1.161.13 |
| npm | @tanstack/start-plugin-core | = 1.169.23 | 1.169.27 |
| npm | @tanstack/start-server-core | = 1.167.33 | 1.167.37 |
| npm | @tanstack/start-static-server-functions | = 1.166.44 | 1.166.48 |
| npm | @tanstack/start-storage-context | = 1.166.38 | 1.166.42 |
| npm | @tanstack/valibot-adapter | = 1.166.12 | 1.166.16 |
| npm | @tanstack/virtual-file-routes | = 1.161.10 | 1.161.14 |
| npm | @tanstack/vue-router | = 1.169.5 | 1.169.9 |
| npm | @tanstack/vue-router-devtools | = 1.166.16 | 1.166.20 |
| npm | @tanstack/vue-router-ssr-query | = 1.166.15 | 1.166.19 |
| npm | @tanstack/vue-start | = 1.167.61 | 1.167.65 |
| npm | @tanstack/vue-start-client | = 1.166.46 | 1.166.50 |
| npm | @tanstack/vue-start-server | = 1.166.50 | 1.166.54 |
| npm | @tanstack/zod-adapter | = 1.166.12 | 1.166.16 |
| npm | @tanstack/arktype-adapter | = 1.166.15 | 1.166.16 |
| npm | @tanstack/eslint-plugin-router | = 1.161.12 | 1.161.13 |
| npm | @tanstack/eslint-plugin-start | = 0.0.7 | 0.0.8 |
| npm | @tanstack/history | = 1.161.12 | 1.161.13 |
| npm | @tanstack/nitro-v2-vite-plugin | = 1.154.15 | 1.154.16 |
| npm | @tanstack/react-router | = 1.169.8 | 1.169.9 |
| npm | @tanstack/react-router-devtools | = 1.166.19 | 1.166.20 |
| npm | @tanstack/react-router-ssr-query | = 1.166.18 | 1.166.19 |
| npm | @tanstack/react-start | = 1.167.71 | 1.167.72 |
| npm | @tanstack/react-start-client | = 1.166.54 | 1.166.55 |
| npm | @tanstack/react-start-rsc | = 0.0.50 | 0.0.51 |
| npm | @tanstack/react-start-server | = 1.166.58 | 1.166.59 |
| npm | @tanstack/router-cli | = 1.166.49 | 1.166.50 |
| npm | @tanstack/router-core | = 1.169.8 | 1.169.9 |
| npm | @tanstack/router-devtools | = 1.166.19 | 1.166.20 |
| npm | @tanstack/router-devtools-core | = 1.167.9 | 1.167.10 |
| npm | @tanstack/router-generator | = 1.166.48 | 1.166.49 |
| npm | @tanstack/router-plugin | = 1.167.41 | 1.167.42 |
| npm | @tanstack/router-ssr-query-core | = 1.168.6 | 1.168.7 |
| npm | @tanstack/router-utils | = 1.161.14 | 1.161.15 |
| npm | @tanstack/router-vite-plugin | = 1.166.56 | 1.166.57 |
| npm | @tanstack/solid-router | = 1.169.8 | 1.169.9 |
| npm | @tanstack/solid-router-devtools | = 1.166.19 | 1.166.20 |
| npm | @tanstack/solid-router-ssr-query | = 1.166.18 | 1.166.19 |
| npm | @tanstack/solid-start | = 1.167.68 | 1.167.69 |
| npm | @tanstack/solid-start-client | = 1.166.53 | 1.166.54 |
| npm | @tanstack/solid-start-server | = 1.166.57 | 1.166.58 |
| npm | @tanstack/start-client-core | = 1.168.8 | 1.168.9 |
| npm | @tanstack/start-fn-stubs | = 1.161.12 | 1.161.13 |
| npm | @tanstack/start-plugin-core | = 1.169.26 | 1.169.27 |
| npm | @tanstack/start-server-core | = 1.167.36 | 1.167.37 |
| npm | @tanstack/start-static-server-functions | = 1.166.47 | 1.166.48 |
| npm | @tanstack/start-storage-context | = 1.166.41 | 1.166.42 |
| npm | @tanstack/valibot-adapter | = 1.166.15 | 1.166.16 |
| npm | @tanstack/virtual-file-routes | = 1.161.13 | 1.161.14 |
| npm | @tanstack/vue-router | = 1.169.8 | 1.169.9 |
| npm | @tanstack/vue-router-devtools | = 1.166.19 | 1.166.20 |
| npm | @tanstack/vue-router-ssr-query | = 1.166.18 | 1.166.19 |
| npm | @tanstack/vue-start | = 1.167.64 | 1.167.65 |
| npm | @tanstack/vue-start-client | = 1.166.49 | 1.166.50 |
| npm | @tanstack/vue-start-server | = 1.166.53 | 1.166.54 |
| npm | @tanstack/zod-adapter | = 1.166.15 | 1.166.16 |
| Vendor | Product | Affected versions (per CVE record) |
|---|---|---|
| @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 |
Severity scores
| Scored by | CVSS | Score | Vector |
|---|---|---|---|
| GitHub_M | 3.1 | 9.6 Critical | CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:H/I:H/A:H |
| GitHub | 3.1 | 9.6 | CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:H/I:H/A:H |
- Attack vector: network (remotely reachable)
- Attack complexity: low
- Privileges required: none (no login)
- User interaction: required (a user must click/open something)
- Scope: changed (can affect other components)
CVSS measures how bad a flaw is if exploited, not how likely exploitation is. Read it next to the exploitation data below.
Exploitation and urgency
- CISA KEV: added 2026-05-27; federal due date 2026-06-10. Known ransomware use: Known.
- CISA required action: Apply mitigations per vendor instructions, follow applicable BOD 22-01 guidance for cloud services, or discontinue use of the product if mitigations are unavailable.
- CISA SSVC assessment: exploitation active, automatable no, technical impact total.
- FIRST EPSS (model of 2026-10-21): 1.05% probability of exploitation activity in the next 30 days; percentile 64.
Timeline
- — erroneo.us brief: Mini Shai-Hulud: TanStack npm Worm With Valid Provenance
- — CVE record published by GitHub_M
- — GitHub-reviewed advisory GHSA-g7cv-rxg3-hmpx published (critical)
- — Added to CISA’s Known Exploited Vulnerabilities catalog
- — CISA remediation deadline for US federal agencies
- — CVE record last updated
Sources and references
Original sources first. Version and fix details should always be confirmed against the vendor or project advisory.
Vendor and project advisories, patches
- Listed in CISA KEV notes (github.com) github.com
Vulnerability records
- GitHub Advisory GHSA-g7cv-rxg3-hmpx github.com
- CVE.org record CVE-2026-45321 cve.org
- NVD entry CVE-2026-45321 nvd.nist.gov
Government
Other references from the CVE record and advisory
- github.com github.com
- tanstack.com tanstack.com
- stepsecurity.io stepsecurity.io
- socket.dev socket.dev
All exploited TanStack vulnerabilities · Critical npm advisories · Today’s Security Digest