Skip to content
OpenAdvisories
Critical · 9.6 Known exploited · Ransomware Public exploit CVE-2026-45321 EUVD-2026-29352GHSA-g7cv-rxg3-hmpx

Malware in 42 @tanstack/* packages exfiltrates cloud credentials, GitHub tokens, and SSH keys

Published May 12, 2026 · Updated Aug 4, 2026 · Assigned by GitHub_M

Vendor: TanStack Product: arktype-adapter Product: eslint-plugin-router Product: eslint-plugin-start Product: history Product: nitro-v2-vite-plugin Product: outer-vite-plugin Product: react-router Product: react-router-devtools Product: react-router-ssr-query Product: react-start Product: react-start-client Product: react-start-rsc Product: react-start-server Product: router-cli Product: router-core Product: router-devtools Product: router-devtools-core Product: router-generator Product: router-plugin Product: router-ssr-query-core Product: router-utils Product: solid-router Product: solid-router-devtools Product: solid-router-ssr-query Product: solid-start Product: solid-start-client Product: solid-start-server Product: start-client-core Product: start-fn-stubs Product: start-plugin-core Product: start-server-core Product: start-static-server-functions Product: start-storage-context Product: valibot-adapter Product: virtual-file-routes Product: vue-router Product: vue-router-devtools Product: vue-router-ssr-query Product: vue-start Product: vue-start-client Product: vue-start-server Product: zod-adapter Package: @tanstack/arktype-adapter Package: @tanstack/eslint-plugin-router Package: @tanstack/eslint-plugin-start Package: @tanstack/history Package: @tanstack/nitro-v2-vite-plugin Package: @tanstack/react-router Package: @tanstack/react-router-devtools Package: @tanstack/react-router-ssr-query Package: @tanstack/react-start Package: @tanstack/react-start-client Package: @tanstack/react-start-rsc Package: @tanstack/react-start-server Package: @tanstack/router-cli Package: @tanstack/router-core Package: @tanstack/router-devtools Package: @tanstack/router-devtools-core Package: @tanstack/router-generator Package: @tanstack/router-plugin Package: @tanstack/router-ssr-query-core Package: @tanstack/router-utils Package: @tanstack/router-vite-plugin Package: @tanstack/solid-router Package: @tanstack/solid-router-devtools Package: @tanstack/solid-router-ssr-query Package: @tanstack/solid-start Package: @tanstack/solid-start-client Package: @tanstack/solid-start-server Package: @tanstack/start-client-core Package: @tanstack/start-fn-stubs Package: @tanstack/start-plugin-core Package: @tanstack/start-server-core Package: @tanstack/start-static-server-functions Package: @tanstack/start-storage-context Package: @tanstack/valibot-adapter Package: @tanstack/virtual-file-routes Package: @tanstack/vue-router Package: @tanstack/vue-router-devtools Package: @tanstack/vue-router-ssr-query Package: @tanstack/vue-start Package: @tanstack/vue-start-client Package: @tanstack/vue-start-server Package: @tanstack/zod-adapter Ecosystem: npm

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.

Affected products

VendorProductAffectedFixed
@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 —

Public exploits

Exploit or proof-of-concept code for this vulnerability is publicly available, which lowers the bar for attackers. Treat it as a reason to patch sooner.

Third-party code, not reviewed by us. Public PoCs are sometimes fake or contain malware. Read the code first and run it only in an isolated lab, against systems you are authorised to test.

GitHub 12 repositories · most starred shown

  • Intrudify/mini-shai-hulud-scanner ★ 3 · May 13, 2026

    Scanner for the Mini Shai-Hulud npm/PyPI supply chain worm (NHS CC-4781 · CVE-2026-45321). Detects gh-token-monitor persistence, payload artefacts, and attacker commits. Python, Bash, PowerShell.

  • Shell script to detect TanStack npm supply chain attack indicators (CVE-2026-45321 / GHSA-g7cv-rxg3-hmpx)

  • nkopylov/tanscript-exploit-check ★ 1 · May 18, 2026

    IOC checker for the TanStack/Mini Shai-Hulud npm supply chain attack (CVE-2026-45321)

  • shayr1/shai-hulud-scan ★ 1 · May 12, 2026

    Claude Code skill to scan machines for Mini Shai-Hulud (CVE-2026-45321) supply chain worm IOCs

  • qi-scape/scan-shai-hulud ★ 1 · May 12, 2026

    Detect CVE-2026-45321 Mini Shai-Hulud supply chain compromise — scans for 170 npm + 2 PyPI poisoned packages across TanStack, Mistral AI, UiPath, OpenSearch, Guardrails AI

  • One-command scanner for the Mini Shai-Hulud npm supply-chain worm (CVE-2026-45321). Detect before rotating tokens.

  • digi4care/shai-scan ★ 0 · May 16, 2026

    Zero-dependency CLI scanner for npm/PyPI supply chain compromises. Detects compromised packages in lockfiles and system-level IOCs from attacks like Mini Shai-Hulud (CVE-2026-45321).

  • Caixa-git/tanstack-shield ★ 0 · May 12, 2026

    🛡️ One-command scanner for CVE-2026-45321 — TanStack npm supply-chain attack

  • Yomisana/are-you-get-tanstack-attack ★ 0 · May 12, 2026

    Are you get Tanstack Supply chain attack attack of 5/11? CVE-2026-45321 / GHSA-g7cv-rxg3-hmpx

  • ry-allan/tanstack-compromise-checker ★ 0 · May 12, 2026

    Detects CVE-2026-45321 (TanStack supply chain compromise) and Mini Shai-Hulud worm artifacts. Scans node_modules, lockfiles, persistence hooks (Claude Code, VS Code, systemd, LaunchAgent), GitHub wor…

Sources: PoC-in-GitHub, Metasploit Framework, Exploit-DB — updated daily. Only links are listed; no exploit code is hosted here.

Affected packages

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

References