CVE-2026-45321
Critical · 9.6 CISA KEV · ransomwareCVSS
9.6
EPSS
1.1%
Published
May 12, 2026
CISA due date
Jun 10, 2026
Cloudanix analysis
A trusted software package source was abused to distribute malicious updates that could steal company credentials from systems that installed them.
- Exploitation
- Supply Chain
- Attacker needs
- User Interaction
- Complexity
- Low
- Impact
- Full Compromise
- Component
- Application
- Class
- Malicious Package
- Remediation
- Upgrade
- Effort
- Medium
- Patch risk
- Low
What it actually does
This is a supply-chain compromise involving malicious npm releases of multiple @tanstack/* packages. The attacker abused a trusted publishing path by chaining a pull_request_target workflow misconfiguration, GitHub Actions cache poisoning across an untrusted fork-to-base boundary, and extraction of an OIDC token from a GitHub Actions runner process. The result was that malicious package versions were published to npm under a legitimate trusted-publisher identity, making them appear authentic. Downstream projects that installed or updated to the malicious versions could execute credential-stealing malware during dependency installation, build, test, server startup, or application runtime depending on how the package was consumed.
Why it matters to the business
Organizations using affected TanStack packages may have unknowingly pulled credential-stealing code from a trusted npm namespace, creating risk of leaked npm tokens, GitHub tokens, cloud credentials, CI/CD secrets, source-code access, production deployment credentials, and follow-on compromise. Because this issue is listed in CISA KEV, is marked as used in ransomware campaigns, and has a remediation due date of 2026-06-10, it should be treated as an urgent supply-chain incident rather than a routine package update. The operational impact can include emergency dependency review, credential rotation, CI/CD rebuilds, forensic investigation, and possible interruption of releases until affected builds are verified clean.
How an attack unfolds
An attacker first targets the upstream package publishing pipeline rather than a single downstream user. They exploit a pull_request_target GitHub Actions misconfiguration to influence workflow execution from an untrusted contribution context, poison Actions cache data that is later consumed by a privileged base-repository workflow, and then extract the GitHub Actions OIDC token from runner memory at runtime. With that token, they authenticate through the legitimate trusted-publisher relationship and publish malicious versions of @tanstack/* npm packages without visibly modifying the normal publish workflow. Downstream users are then compromised when package managers resolve to one of the malicious versions during install, update, CI, or deployment. Once installed, the malicious code can attempt to harvest credentials and secrets from developer workstations, build systems, CI environments, or runtime environments and exfiltrate them for further access, lateral movement, or ransomware operations.
How to fix it
Immediately identify all uses of affected @tanstack/* packages and determine whether any installed version was one of the two malicious versions published for each package between approximately 2026-05-11 19:20 and 19:26 UTC. No exact fixed versions were provided in the input, so do not assume a package is safe solely because it has a newer semver number; pin to maintainer-confirmed clean versions, versions published before the malicious window, or later versions explicitly confirmed by the TanStack maintainers as remediated. Regenerate lockfiles from trusted clean versions, remove node_modules and local package-manager caches after preserving evidence where needed, and rebuild artifacts from clean dependencies. Rotate any credentials that may have been accessible to affected developer machines, CI runners, build containers, or application environments, including GitHub tokens, npm tokens, cloud provider keys, SSH keys, deployment credentials, and service secrets. For maintainers and organizations operating similar publishing pipelines, harden GitHub Actions by avoiding privileged pull_request_target execution for untrusted code, isolating caches by trust level and event type, minimizing default GITHUB_TOKEN permissions, limiting OIDC permissions to specific release workflows, requiring environment approvals for publishing, and monitoring npm trusted-publisher events.
How to confirm the fix worked
Review package-lock.json, npm-shrinkwrap.json, yarn.lock, pnpm-lock.yaml, SBOMs, artifact manifests, container build logs, CI logs, and package-manager caches for affected @tanstack/* packages resolved to versions published between 2026-05-11 19:20 and 19:26 UTC. Use npm metadata, such as `npm view @tanstack/<package> time --json`, to compare installed versions against publish timestamps. Confirm that rebuilt applications resolve only to maintainer-confirmed clean versions. Validate that node_modules and package-manager caches no longer contain tarballs for malicious versions. Confirm that CI/CD systems have been rebuilt from clean dependencies and that potentially exposed credentials have been rotated. If any affected version was installed, treat the host or runner as potentially compromised and perform forensic review before returning it to service.
Typical attack path
- Compromise or influence the upstream GitHub Actions workflow using a pull_request_target trust-boundary weakness.
- Poison the GitHub Actions cache so untrusted content is later consumed by a privileged workflow context.
- Extract an OIDC token from the GitHub Actions runner process during workflow execution.
- Use the legitimate GitHub Actions OIDC trusted-publisher binding to authenticate to npm.
- Publish malicious versions of affected @tanstack/* packages under the trusted package identity.
- Wait for downstream developers, CI jobs, or deployment pipelines to install or update affected packages.
- Execute credential-stealing code during package installation, build, test, application startup, or runtime.
- Exfiltrate tokens, secrets, source-code credentials, npm credentials, GitHub credentials, or cloud credentials for follow-on compromise.
How to detect it
Investigate both dependency exposure and post-install compromise. For exposure, search source repositories, lockfiles, package-manager caches, CI logs, SBOMs, container image layers, and artifact manifests for affected @tanstack/* package names and compare resolved versions to npm publish times around 2026-05-11 19:20-19:26 UTC. Useful sources include package-lock.json, npm-shrinkwrap.json, yarn.lock, pnpm-lock.yaml, npm debug logs, CI job output, Docker build logs, artifact metadata, and dependency-scanning telemetry. For exploitation, review EDR, shell history, process execution, DNS, proxy, firewall, and cloud audit logs for suspicious activity shortly after npm install, yarn install, pnpm install, npm ci, build, test, or application startup events involving affected packages. Look for unexpected outbound network connections from CI runners or developer systems, unusual access to environment variables, token files, SSH keys, npm credentials, GitHub credentials, cloud metadata services, or secret stores, and anomalous use of credentials after the suspected installation time. If a malicious version was installed on a CI runner or developer endpoint, assume secrets accessible to that process may have been read and prioritize credential-use anomaly detection after the install time.
- @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/router-vite-plugin
- @tanstack/solid-router
- @tanstack/solid-router-devtools
- @tanstack/solid-router-ssr-query
- @tanstack/solid-start
- registry.npmjs.org/@tanstack/
- npm install @tanstack/
- npm ci
- yarn install
- pnpm install
- package-lock.json
- npm-shrinkwrap.json
- yarn.lock
- pnpm-lock.yaml
- node_modules/@tanstack/
- 2026-05-11T19:20
- 2026-05-11T19:21
- 2026-05-11T19:22
- 2026-05-11T19:23
- 2026-05-11T19:24
- 2026-05-11T19:25
- 2026-05-11T19:26
What your security team should do
- Treat this as an active supply-chain incident because it is KEV-listed, associated with ransomware activity, and actively exploited in the wild.
- Inventory all repositories, CI pipelines, containers, build artifacts, developer workstations, and production deployments for affected @tanstack/* packages.
- Identify whether any affected package version was installed from npm during or after the malicious publishing window on 2026-05-11 19:20-19:26 UTC.
- Pin or upgrade to maintainer-confirmed clean package versions and regenerate lockfiles from a trusted dependency graph.
- Rotate secrets exposed to affected developer, CI, build, and runtime environments, prioritizing GitHub, npm, cloud, SSH, deployment, and artifact-registry credentials.
- Search historical CI logs, package-manager logs, endpoint telemetry, proxy logs, and EDR data for evidence of package installation and suspicious outbound activity following installation.
- Rebuild release artifacts and containers from clean dependencies rather than reusing artifacts produced during the exposure window.
- Add dependency allowlisting or denylisting controls to block known malicious versions once exact versions are identified from npm metadata or maintainer advisories.
- Harden internal GitHub Actions workflows that use pull_request_target, caches, and OIDC trusted publishing to prevent similar trust-boundary abuse.
- Complete remediation no later than the CISA KEV due date of 2026-06-10 for systems subject to KEV-driven remediation requirements.
The record
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.
Affected packages
| Ecosystem | Package | Introduced | Fixed |
|---|---|---|---|
| npm | @tanstack/arktype-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-router | 1.161.9 | 1.161.13 |
| npm | @tanstack/eslint-plugin-start | 0.0.4 | 0.0.8 |
| npm | @tanstack/eslint-plugin-start | 0.0.7 | 0.0.8 |
| npm | @tanstack/history | 1.161.12 | 1.161.13 |
| npm | @tanstack/history | 1.161.9 | 1.161.13 |
| npm | @tanstack/nitro-v2-vite-plugin | 1.154.12 | 1.154.16 |
| npm | @tanstack/nitro-v2-vite-plugin | 1.154.15 | 1.154.16 |
| npm | @tanstack/react-router | 1.169.5 | 1.169.9 |
| npm | @tanstack/react-router | 1.169.8 | 1.169.9 |
| npm | @tanstack/react-router-devtools | 1.166.16 | 1.166.20 |
| npm | @tanstack/react-router-devtools | 1.166.19 | 1.166.20 |
| npm | @tanstack/react-router-ssr-query | 1.166.15 | 1.166.19 |
| npm | @tanstack/react-router-ssr-query | 1.166.18 | 1.166.19 |
| npm | @tanstack/react-start | 1.167.68 | 1.167.72 |
| npm | @tanstack/react-start | 1.167.71 | 1.167.72 |
| npm | @tanstack/react-start-client | 1.166.51 | 1.166.55 |
| npm | @tanstack/react-start-client | 1.166.54 | 1.166.55 |
| npm | @tanstack/react-start-rsc | 0.0.47 | 0.0.51 |
| npm | @tanstack/react-start-rsc | 0.0.50 | 0.0.51 |
| npm | @tanstack/react-start-server | 1.166.55 | 1.166.59 |
| npm | @tanstack/react-start-server | 1.166.58 | 1.166.59 |
| npm | @tanstack/router-cli | 1.166.46 | 1.166.50 |
| npm | @tanstack/router-cli | 1.166.49 | 1.166.50 |
| npm | @tanstack/router-core | 1.169.5 | 1.169.9 |
| npm | @tanstack/router-core | 1.169.8 | 1.169.9 |
| npm | @tanstack/router-devtools | 1.166.16 | 1.166.20 |
| npm | @tanstack/router-devtools | 1.166.19 | 1.166.20 |
| npm | @tanstack/router-devtools-core | 1.167.6 | 1.167.10 |
| npm | @tanstack/router-devtools-core | 1.167.9 | 1.167.10 |
| npm | @tanstack/router-generator | 1.166.45 | 1.166.49 |
| npm | @tanstack/router-generator | 1.166.48 | 1.166.49 |
| npm | @tanstack/router-plugin | 1.167.38 | 1.167.42 |
| npm | @tanstack/router-plugin | 1.167.41 | 1.167.42 |
| npm | @tanstack/router-ssr-query-core | 1.168.3 | 1.168.7 |
| npm | @tanstack/router-ssr-query-core | 1.168.6 | 1.168.7 |
| npm | @tanstack/router-utils | 1.161.11 | 1.161.15 |
| npm | @tanstack/router-utils | 1.161.14 | 1.161.15 |
| npm | @tanstack/router-vite-plugin | 1.166.53 | 1.166.57 |
| npm | @tanstack/router-vite-plugin | 1.166.56 | 1.166.57 |
| npm | @tanstack/solid-router | 1.169.5 | 1.169.9 |
| npm | @tanstack/solid-router | 1.169.8 | 1.169.9 |
| npm | @tanstack/solid-router-devtools | 1.166.16 | 1.166.20 |
| npm | @tanstack/solid-router-devtools | 1.166.19 | 1.166.20 |
| npm | @tanstack/solid-router-ssr-query | 1.166.15 | 1.166.19 |
| npm | @tanstack/solid-router-ssr-query | 1.166.18 | 1.166.19 |
| npm | @tanstack/solid-start | 1.167.65 | 1.167.69 |
| npm | @tanstack/solid-start | 1.167.68 | 1.167.69 |
| npm | @tanstack/solid-start-client | 1.166.50 | 1.166.54 |
| npm | @tanstack/solid-start-client | 1.166.53 | 1.166.54 |
| npm | @tanstack/solid-start-server | 1.166.54 | 1.166.58 |
| npm | @tanstack/solid-start-server | 1.166.57 | 1.166.58 |
| npm | @tanstack/start-client-core | 1.168.5 | 1.168.9 |
| 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-fn-stubs | 1.161.9 | 1.161.13 |
| npm | @tanstack/start-plugin-core | 1.169.23 | 1.169.27 |
| npm | @tanstack/start-plugin-core | 1.169.26 | 1.169.27 |
| npm | @tanstack/start-server-core | 1.167.33 | 1.167.37 |
| npm | @tanstack/start-server-core | 1.167.36 | 1.167.37 |
| npm | @tanstack/start-static-server-functions | 1.166.44 | 1.166.48 |
| npm | @tanstack/start-static-server-functions | 1.166.47 | 1.166.48 |
| npm | @tanstack/start-storage-context | 1.166.38 | 1.166.42 |
| npm | @tanstack/start-storage-context | 1.166.41 | 1.166.42 |
| npm | @tanstack/valibot-adapter | 1.166.12 | 1.166.16 |
| npm | @tanstack/valibot-adapter | 1.166.15 | 1.166.16 |
| npm | @tanstack/virtual-file-routes | 1.161.10 | 1.161.14 |
| npm | @tanstack/virtual-file-routes | 1.161.13 | 1.161.14 |
| npm | @tanstack/vue-router | 1.169.5 | 1.169.9 |
| npm | @tanstack/vue-router | 1.169.8 | 1.169.9 |
| npm | @tanstack/vue-router-devtools | 1.166.16 | 1.166.20 |
| npm | @tanstack/vue-router-devtools | 1.166.19 | 1.166.20 |
| npm | @tanstack/vue-router-ssr-query | 1.166.15 | 1.166.19 |
| npm | @tanstack/vue-router-ssr-query | 1.166.18 | 1.166.19 |
| npm | @tanstack/vue-start | 1.167.61 | 1.167.65 |
| npm | @tanstack/vue-start | 1.167.64 | 1.167.65 |
| npm | @tanstack/vue-start-client | 1.166.46 | 1.166.50 |
| npm | @tanstack/vue-start-client | 1.166.49 | 1.166.50 |
| npm | @tanstack/vue-start-server | 1.166.50 | 1.166.54 |
| npm | @tanstack/vue-start-server | 1.166.53 | 1.166.54 |
| npm | @tanstack/zod-adapter | 1.166.12 | 1.166.16 |
| npm | @tanstack/zod-adapter | 1.166.15 | 1.166.16 |
Related vulnerabilities
- GHSA-g7cv-rxg3-hmpx Malware in @tanstack/* packages exfiltrates cloud credentials, GitHub tokens, and SSH keys Same vulnerability
- GHSA-9m65-766c-r333 TanStack Start - Server Core: Inbound server-function request deserialization could… Also affects @tanstack/start-server-core
- CVE-2026-73532 Fluent Forms Pro 6.2.7 contains an embedded malicious code vulnerability introduced via a… CWE-506
- CVE-2026-73533 Ninja Tables Pro 5.2.11 contains an embedded malicious code vulnerability introduced via… CWE-506
- CVE-2026-48160 react-tracked provides state usage tracking with Proxies. CWE-506
- CVE-2026-48159 use-reducer-async is a React useReducer with async actions. CWE-506
- CVE-2026-48158 use-context-selector is a React useContextSelector hook in userland Between 2026-05-18… CWE-506
- CVE-2026-66747 Zbtlink router firmware ships an embedded remote-control implant, ENDLESSDOORS, present… CWE-506