CVE-2026-45321 kev+ ransomware in the critical feed json
Malware in 42 @tanstack/* packages exfiltrates cloud credentials, GitHub tokens, and SSH keys
published 2026-05-12 5 mo ago modified 2026-10-26 13 d ago also GHSA-g7cv-rxg3-hmpx , EUVD-2026-29352
- cvss
- 9.6
- version 3.1, CNA
- cisa kev
- Exploited
- added 2026-05-27, used in ransomware
- epss
- 3.3%
- EPSS 3.3% chance of exploitation in 30 days, percentile 88%
- public exploits
- 0
- none known
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.
Patch / fix
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.
- npm @tanstack/arktype-adapter 1.166.16
- npm @tanstack/eslint-plugin-router 1.161.13
- npm @tanstack/eslint-plugin-start 0.0.8
- npm @tanstack/history 1.161.13
- npm @tanstack/nitro-v2-vite-plugin 1.154.16
- npm @tanstack/react-router 1.169.9
- npm @tanstack/react-router-devtools 1.166.20
- npm @tanstack/react-router-ssr-query 1.166.19
- npm @tanstack/react-start 1.167.72
- npm @tanstack/react-start-client 1.166.55
- npm @tanstack/react-start-rsc 0.0.51
- npm @tanstack/react-start-server 1.166.59
- npm @tanstack/router-cli 1.166.50
- npm @tanstack/router-core 1.169.9
- npm @tanstack/router-devtools 1.166.20
- npm @tanstack/router-devtools-core 1.167.10
- npm @tanstack/router-generator 1.166.49
- npm @tanstack/router-plugin 1.167.42
- npm @tanstack/router-ssr-query-core 1.168.7
- npm @tanstack/router-utils 1.161.15
- npm @tanstack/router-vite-plugin 1.166.57
- npm @tanstack/solid-router 1.169.9
- npm @tanstack/solid-router-devtools 1.166.20
- npm @tanstack/solid-router-ssr-query 1.166.19
- npm @tanstack/solid-start 1.167.69
- npm @tanstack/solid-start-client 1.166.54
- npm @tanstack/solid-start-server 1.166.58
- npm @tanstack/start-client-core 1.168.9
- npm @tanstack/start-fn-stubs 1.161.13
- npm @tanstack/start-plugin-core 1.169.27
Timeline
- Published
- CISA SSVC: exploitation active
- Added to CISA KEV
- CISA patch deadline
Known exploited
- Added
- 5 mo ago
- Patch by
- 2026-06-10 (5 mo ago)
- Ransomware
- Known to be used in ransomware campaigns
- 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.
- Vendor, product
- TanStack, TanStack
- CISA name
- TanStack Unspecified Vulnerability
CISA SSVC
- Exploitation
- Active, exploited in the wild
- Automatable
- no
- Technical impact
- total
- Assessed
- 5 mo ago
Exploit prediction
3.28% chance of exploitation in the next 30 days, higher than 88% of all scored CVEs (FIRST EPSS, 2026-11-08).
Exploits and checks
- tanstack.com https://tanstack.com/blog/npm-supply-chain-compromise-postmortem referenced PoC, tagged "exploit" by a source, unverified
- stepsecurity.io https://www.stepsecurity.io/blog/mini-shai-hulud-is-back-a-self-spreading-supply-chain-attack-hits-the-npm-ecosystem referenced PoC, tagged "exploit" by a source, unverified
CVSS scores
| assigned by | version | score | vector |
|---|---|---|---|
| CNA | 3.1 | 9.6 | 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 |
Affected packages
| ecosystem | package | affected | fixed in |
|---|---|---|---|
| npm | @tanstack/arktype-adapter | >=1.166.12, <1.166.16 >=1.166.15, <1.166.16 |
1.166.16 |
| npm | @tanstack/eslint-plugin-router | >=1.161.9, <1.161.13 >=1.161.12, <1.161.13 |
1.161.13 |
| npm | @tanstack/eslint-plugin-start | >=0.0.4, <0.0.8 >=0.0.7, <0.0.8 |
0.0.8 |
| npm | @tanstack/history | >=1.161.9, <1.161.13 >=1.161.12, <1.161.13 |
1.161.13 |
| npm | @tanstack/nitro-v2-vite-plugin | >=1.154.12, <1.154.16 >=1.154.15, <1.154.16 |
1.154.16 |
| npm | @tanstack/react-router | >=1.169.5, <1.169.9 >=1.169.8, <1.169.9 |
1.169.9 |
| npm | @tanstack/react-router-devtools | >=1.166.16, <1.166.20 >=1.166.19, <1.166.20 |
1.166.20 |
| npm | @tanstack/react-router-ssr-query | >=1.166.15, <1.166.19 >=1.166.18, <1.166.19 |
1.166.19 |
| npm | @tanstack/react-start | >=1.167.68, <1.167.72 >=1.167.71, <1.167.72 |
1.167.72 |
| npm | @tanstack/react-start-client | >=1.166.51, <1.166.55 >=1.166.54, <1.166.55 |
1.166.55 |
| npm | @tanstack/react-start-rsc | >=0.0.47, <0.0.51 >=0.0.50, <0.0.51 |
0.0.51 |
| npm | @tanstack/react-start-server | >=1.166.55, <1.166.59 >=1.166.58, <1.166.59 |
1.166.59 |
| npm | @tanstack/router-cli | >=1.166.46, <1.166.50 >=1.166.49, <1.166.50 |
1.166.50 |
| npm | @tanstack/router-core | >=1.169.5, <1.169.9 >=1.169.8, <1.169.9 |
1.169.9 |
| npm | @tanstack/router-devtools | >=1.166.16, <1.166.20 >=1.166.19, <1.166.20 |
1.166.20 |
| npm | @tanstack/router-devtools-core | >=1.167.6, <1.167.10 >=1.167.9, <1.167.10 |
1.167.10 |
| npm | @tanstack/router-generator | >=1.166.45, <1.166.49 >=1.166.48, <1.166.49 |
1.166.49 |
| npm | @tanstack/router-plugin | >=1.167.38, <1.167.42 >=1.167.41, <1.167.42 |
1.167.42 |
| npm | @tanstack/router-ssr-query-core | >=1.168.3, <1.168.7 >=1.168.6, <1.168.7 |
1.168.7 |
| npm | @tanstack/router-utils | >=1.161.11, <1.161.15 >=1.161.14, <1.161.15 |
1.161.15 |
| npm | @tanstack/router-vite-plugin | >=1.166.53, <1.166.57 >=1.166.56, <1.166.57 |
1.166.57 |
| npm | @tanstack/solid-router | >=1.169.5, <1.169.9 >=1.169.8, <1.169.9 |
1.169.9 |
| npm | @tanstack/solid-router-devtools | >=1.166.16, <1.166.20 >=1.166.19, <1.166.20 |
1.166.20 |
| npm | @tanstack/solid-router-ssr-query | >=1.166.15, <1.166.19 >=1.166.18, <1.166.19 |
1.166.19 |
| npm | @tanstack/solid-start | >=1.167.65, <1.167.69 >=1.167.68, <1.167.69 |
1.167.69 |
| npm | @tanstack/solid-start-client | >=1.166.50, <1.166.54 >=1.166.53, <1.166.54 |
1.166.54 |
| npm | @tanstack/solid-start-server | >=1.166.54, <1.166.58 >=1.166.57, <1.166.58 |
1.166.58 |
| npm | @tanstack/start-client-core | >=1.168.5, <1.168.9 >=1.168.8, <1.168.9 |
1.168.9 |
| npm | @tanstack/start-fn-stubs | >=1.161.9, <1.161.13 >=1.161.12, <1.161.13 |
1.161.13 |
| npm | @tanstack/start-plugin-core | >=1.169.23, <1.169.27 >=1.169.26, <1.169.27 |
1.169.27 |
| npm | @tanstack/start-server-core | >=1.167.33, <1.167.37 >=1.167.36, <1.167.37 |
1.167.37 |
| npm | @tanstack/start-static-server-functions | >=1.166.44, <1.166.48 >=1.166.47, <1.166.48 |
1.166.48 |
| npm | @tanstack/start-storage-context | >=1.166.38, <1.166.42 >=1.166.41, <1.166.42 |
1.166.42 |
| npm | @tanstack/valibot-adapter | >=1.166.12, <1.166.16 >=1.166.15, <1.166.16 |
1.166.16 |
| npm | @tanstack/virtual-file-routes | >=1.161.10, <1.161.14 >=1.161.13, <1.161.14 |
1.161.14 |
| npm | @tanstack/vue-router | >=1.169.5, <1.169.9 >=1.169.8, <1.169.9 |
1.169.9 |
| npm | @tanstack/vue-router-devtools | >=1.166.16, <1.166.20 >=1.166.19, <1.166.20 |
1.166.20 |
| npm | @tanstack/vue-router-ssr-query | >=1.166.15, <1.166.19 >=1.166.18, <1.166.19 |
1.166.19 |
| npm | @tanstack/vue-start | >=1.167.61, <1.167.65 >=1.167.64, <1.167.65 |
1.167.65 |
| npm | @tanstack/vue-start-client | >=1.166.46, <1.166.50 >=1.166.49, <1.166.50 |
1.166.50 |
| npm | @tanstack/vue-start-server | >=1.166.50, <1.166.54 >=1.166.53, <1.166.54 |
1.166.54 |
| npm | @tanstack/zod-adapter | >=1.166.12, <1.166.16 >=1.166.15, <1.166.16 |
1.166.16 |
Affected products
- @tanstack arktype-adapter
- @tanstack eslint-plugin-router
- @tanstack eslint-plugin-start
- @tanstack history
- @tanstack nitro-v2-vite-plugin
- @tanstack react-router
- @tanstack react-router-devtools
- @tanstack react-router-ssr-query
- @tanstack react-start
- @tanstack react-start-client
- @tanstack react-start-rsc
- @tanstack react-start-server
- @tanstack router-cli
- @tanstack router-core
- @tanstack router-devtools
- @tanstack router-devtools-core
- @tanstack router-generator
- @tanstack router-plugin
- @tanstack router-ssr-query-core
- @tanstack router-utils
- @tanstack outer-vite-plugin
- @tanstack solid-router
- @tanstack solid-router-devtools
- @tanstack solid-router-ssr-query
- @tanstack solid-start
- @tanstack solid-start-client
- @tanstack solid-start-server
- @tanstack start-client-core
- @tanstack start-fn-stubs
- @tanstack start-plugin-core
- @tanstack start-server-core
- @tanstack start-static-server-functions
- @tanstack start-storage-context
- @tanstack valibot-adapter
- @tanstack virtual-file-routes
- @tanstack vue-router
- @tanstack vue-router-devtools
- @tanstack vue-router-ssr-query
- @tanstack vue-start
- @tanstack vue-start-client
- @tanstack vue-start-server
- @tanstack zod-adapter
Classification
- Weakness
-
- CWE-506 Embedded Malicious Code
References
-
tanstack.com
/blog/npm-supply-chain-compromise-postmortem
web, exploit, vendor-advisory
-
stepsecurity.io
/blog/mini-shai-hulud-is-back-a-self-spreading-supply-chain-attack-hits-the-npm-ecosystem
web, exploit, third-party-advisory
-
github.com
/TanStack/router/security/advisories/GHSA-g7cv-rxg3-hmpx
web, mitigation, vendor-advisory
-
github.com
/TanStack/router/issues/7383
web, issue-tracking
-
cisa.gov
/known-exploited-vulnerabilities-catalog?field_cve=CVE-2026-45321
government-resource, web, us-government-resource
-
nvd.nist.gov
/vuln/detail/CVE-2026-45321
advisory
-
github.com
/TanStack/router
package
-
socket.dev
/blog/tanstack-npm-packages-compromised-mini-shai-hulud-supply-chain-attack
web
Sources
- CVE List CVE-2026-45321
- GitHub Advisory GHSA-g7cv-rxg3-hmpx
- NVD CVE-2026-45321
Fencer Vulns keeps one entry per vulnerability: the CVE id wins, then GHSA, and records that alias each other are merged, except that two CVEs always keep separate entries. The same data is available as JSON.