What is TanStack?
TanStack is an open-source collection of TypeScript/JavaScript libraries for building modern web applications, widely used in enterprise React, Vue, and Solid ecosystems. The Router and Start packages (part of TanStack's routing monorepo) are used by millions of developers worldwide through packages such as @tanstack/react-router, @tanstack/vue-router, and @tanstack/react-start. The libraries are maintained by Tanner Linsley and a network of open-source contributors.
Overview
CVE-2026-45321 is a supply-chain compromise in which attackers published 84 malicious versions of 42 TanStack npm packages on May 11, 2026, using a three-step attack chain that exploited GitHub Actions' pull_request_target workflow trust model to extract an OIDC token from CI runner process memory and publish directly to npm without human interaction. The malicious packages contained a credential-stealing worm that self-propagated to 170+ other npm and PyPI packages — the first documented case of a malicious npm package carrying valid SLSA Sigstore provenance. CISA added the CVE to the KEV catalog on May 27, 2026.
The threat actor group TeamPCP (aliases: DeadCatx3, PCPcat, ShellForce, CipherForce) executed the campaign, internally named "Mini Shai-Hulud", as part of a series of supply-chain attacks beginning March 2026.
Affected Versions
| Package | Malicious Versions | Safe Version |
|---|---|---|
@tanstack/react-router |
1.169.5, 1.169.8 | ≥ 1.169.9 |
@tanstack/vue-router |
Same pattern | ≥ equivalent clean release |
@tanstack/solid-router |
Same pattern | ≥ equivalent clean release |
@tanstack/react-start |
Same pattern | ≥ equivalent clean release |
@tanstack/router-cli |
Same pattern | ≥ equivalent clean release |
| 37 additional Router/Start packages | Same pattern | ≥ equivalent clean release |
Not affected: Query, Table, Form, Virtual, and Store TanStack libraries (separate monorepos).
All 84 malicious versions were deprecated within 59 minutes of publication; npm removed the tarballs server-side by 23:55 UTC on May 11.
Technical Details
The attack chained three techniques to achieve unauthenticated npm publish without any compromised human credentials:
1. Pwn Request (pull_request_target abuse)
The bundle-size.yml GitHub Actions workflow used the pull_request_target trigger, which allows fork-submitted code to execute in the base repository's privileged context without maintainer approval. An attacker-controlled fork submitted a pull request containing a malicious pnpm lock file.
2. GitHub Actions Cache Poisoning The workflow's post-job step persisted the pnpm module cache without integrity validation. The malicious fork commit wrote a ~2.3 MB obfuscated payload into the cache, crossing the fork/base trust boundary and persisting into subsequent workflow runs on the main repository.
3. OIDC Token Memory Extraction
When the legitimate release workflow ran and restored the poisoned cache, attacker-controlled binaries executed within the runner's process context. They extracted a live GitHub Actions Runner OIDC token from process memory via /proc/<pid>/mem. This token was used directly to publish 84 package versions to npm without any human interaction or compromised npm credentials.
Self-propagating worm behavior
After credential exfiltration, the malware queried npm's registry to enumerate other packages maintained by the same organization and republished them with identical injections, spreading to @mistralai/mistralai, @uipath/*, @opensearch-project/opensearch, guardrails-ai (PyPI), and 100+ additional packages across npm and PyPI (518M+ cumulative downloads affected). All malicious versions carried valid Sigstore signatures — the first documented case of SLSA-provenance-bearing malware.
Exfiltration used end-to-end encrypted Session/Oxen messenger. IOC domains: filev2.getsession.org, seed1-3.getsession.org. Attacker GitHub accounts: zblgg (id 127806521), voicproducoes (id 269549300).
Discovery
Security researcher ashishkurmi publicly disclosed IOCs via GitHub issue #7383 within 26 minutes of the malicious publishes. StepSecurity provided attribution analysis linking the campaign to TeamPCP, which had previously executed similar attacks against Aqua Security Trivy (March 2026) and the Bitwarden CLI npm package (April 2026).
Exploitation Context
Actively exploited. Credentials harvested from TanStack's CI environment were immediately weaponized: stolen developer GitHub tokens were used within seven days to compromise Nx Console (CVE-2026-48027), breach approximately 3,800 GitHub internal repositories, and compromise developer machines at OpenAI, Grafana Labs, and Mistral AI. The worm simultaneously hit 170+ packages across npm and PyPI.
Remediation
- Audit installed packages — check
npm ls @tanstack/react-router(and related packages) for versions 1.169.5 or 1.169.8; update to the latest clean release. - Rotate all secrets accessible from CI/CD environments that ran TanStack packages between May 11–12, 2026.
- Audit GitHub Actions workflows — remove
pull_request_targetfrom any workflow that checks out or runs code from untrusted forks. Add an explicit guard:if: github.event.pull_request.head.repo.full_name == github.repository. - Disable GitHub Actions cache restore from forks — add
save-always: falseto cache steps inpull_request_targetworkflows and validate cache keys cryptographically. - Block IOC domains at the network perimeter:
filev2.getsession.org,seed1-3.getsession.org, and related Session/Oxen infrastructure. - For federal agencies: apply mitigations per vendor instructions before June 10, 2026.
Key Details
| Property | Value |
|---|---|
| CVE ID | CVE-2026-45321 |
| Vendor / Product | TanStack — TanStack |
| NVD Published | 2026-05-12 |
| NVD Last Modified | 2026-05-27 |
| CVSS 3.1 Score | 9.6 |
| CVSS 3.1 Vector | CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:H/I:H/A:H |
| Severity | CRITICAL |
| CWE | CWE-506 find similar ↗ |
| CISA KEV Added | 2026-05-27 |
| CISA KEV Deadline | 2026-06-10 |
| Known Ransomware Use | ⚠️ Yes |
CVSS 3.1 Breakdown
Required Action
Timeline
| Date | Event |
|---|---|
| 2026-03-01 | TeamPCP compromises Aqua Security Trivy scanner (precursor campaign) |
| 2026-04-01 | TeamPCP compromises Bitwarden CLI npm package (precursor campaign) |
| 2026-05-10 | Malicious fork commit pushed to TanStack repository at 23:29 UTC |
| 2026-05-11 | pnpm cache poisoned via pull_request_target workflow at 11:11 UTC; 84 malicious npm versions published at 19:20–19:26 UTC |
| 2026-05-11 | Security researcher ashishkurmi discloses IOCs via GitHub issue #7383 at 19:46 UTC (26 min after publish); all 84 versions deprecated by 21:03 UTC; npm removes tarballs by 23:55 UTC |
| 2026-05-18 | Stolen credentials used to compromise Nx Console VS Code extension (CVE-2026-48027) |
| 2026-05-27 | Added to CISA Known Exploited Vulnerabilities catalog |
| 2026-06-10 | CISA BOD 22-01 remediation deadline |
References
| Resource | Type |
|---|---|
| NVD — CVE-2026-45321 | Vulnerability Database |
| CISA KEV Catalog Entry | US Government |
| GitHub Security Advisory GHSA-g7cv-rxg3-hmpx | Vendor Advisory |
| npm Supply Chain Compromise Postmortem — TanStack | Vendor Advisory |
| Mini Shai-Hulud Campaign Attribution — StepSecurity | Security Research |
| TanStack npm Packages Compromised — Snyk | Security Research |
| Mini Shai-Hulud Strikes Again: TanStack and More npm Packages Compromised — Wiz | Security Research |
| Mini Shai-Hulud Worm Compromises TanStack npm Packages — The Hacker News | News Article |
| CISA Adds Daemon Tools, TanStack, and Nx Console Flaws to KEV — Security Affairs | News Article |