Evidence dossier

CVE-2026-45321

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

Exploited in the wild (CISA KEV since May 27, 2026). GitHub_M reports CVSS 3.1 9.6. EPSS estimates 2.3% exploit likelihood as of Aug 27, 2026.

81.782.1Priority evidence range
Evidence current through Aug 27, 2026, 6:09 PM UTC

As of Aug 27, 2026

Normalized restatement

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.

State
PUBLISHED
Published
May 12, 2026
Updated
Aug 4, 2026
Evidence coverage
98%

Evidence chronology

What was known when

Download this view's receipt →
  1. Source dateFirst observed by CASCA
    CISA KEV

    Exploitation cataloged: TanStack Unspecified Vulnerability

    Inspect raw assertion
    Field
    observed_exploitation
    Value
    TanStack Unspecified Vulnerability
    Original evidence ↗
  2. Source dateSource date omittedFirst observed by CASCA
    CISA-ADP

    Record text: CISA ADP Vulnrichment

    Inspect raw assertion
    Field
    container
    Value
    CISA ADP Vulnrichment
    Original evidence ↗
  3. Source dateSource date omittedFirst observed by CASCA
    GitHub_M

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

    Inspect raw assertion
    Field
    container
    Value
    Malware in 42 @tanstack/* packages exfiltrates cloud credentials, GitHub tokens, and SSH keys
    Original evidence ↗
  4. Source dateFirst observed by CASCA
    FIRST EPSS

    EPSS score: 2.34% probability · 82.39th percentile

    Inspect raw assertion
    Field
    model_probability
    Value
    Probability 0.023420000000; percentile 0.823860000000
    Original evidence ↗
ExploitationCatalog member

CISA KEV · catalog date May 27, 2026 · first observed Jul 19, 2026

Exploit likelihood2.34%

FIRST EPSS · score date Aug 27, 2026 · 82.4th percentile · first observed Aug 27, 2026

SeverityCVSS 9.6

GitHub_M · CVSS 3.1 · first observed Aug 4, 2026 · same-version scores align in this snapshot

Evidence detail

Source limits and decisions

Why each evidence state has this value

Outside this view’s verified evidence

Reason detail begins outside this selected snapshot; the state remains source-bound.

Source comparison

Who said what

CISA KEVOriginal assertion
Exploitation cataloged

TanStack Unspecified Vulnerability

Inspect raw assertion
Field
observed_exploitation
Value
TanStack Unspecified Vulnerability
Source dateFirst observed by CASCAOriginal evidence ↗
CISA-ADPIndependent enrichment
Record text

CISA ADP Vulnrichment

Inspect raw assertion
Field
container
Value
CISA ADP Vulnrichment
Source dateSource date omittedFirst observed by CASCAOriginal evidence ↗
GitHub_MOriginal assertion
Record text

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

Inspect raw assertion
Field
container
Value
Malware in 42 @tanstack/* packages exfiltrates cloud credentials, GitHub tokens, and SSH keys
Source dateSource date omittedFirst observed by CASCAOriginal evidence ↗
FIRST EPSSOriginal assertion
EPSS score

2.34% probability · 82.39th percentile

Inspect raw assertion
Field
model_probability
Value
Probability 0.023420000000; percentile 0.823860000000
Source dateFirst observed by CASCAOriginal evidence ↗

Applicability

Cited product scope

Trace impact →
343Underlying assertions
171Canonical products
343Target assertions
0Constraint assertions

Grouped from 53 configuration nodes in this exact snapshot. Visual grouping is navigational; asset exposure and root cause require cited evidence.

Identity source boundaries
  • Cpe dictionary1,775,266 records · observed through 2026-07-21T06:45:29.809Z27d65b0f-b718-4b4f-bb79-c47c68d09dfa
  • Cpe match643,502 records · observed through 2026-07-21T08:13:17.697Z955dae73-7302-438b-aee1-058d7cc5d48e

213 scope groups

GitHub_M · source asserted@tanstackarktype-adapterDirect source scope
Affected: 1.166.12Affected: 1.166.15
Source-reported scope

Canonical linkage remains open; the cited source assertion is retained below.

Inspect raw assertion[{"status": "affected", "version": "1.166.12"}, {"status": "affected", "version": "1.166.15"}]
GitHub_M · source asserted@tanstackeslint-plugin-routerDirect source scope
Affected: 1.161.9Affected: 1.161.12
Source-reported scope

Canonical linkage remains open; the cited source assertion is retained below.

Inspect raw assertion[{"status": "affected", "version": "1.161.9"}, {"status": "affected", "version": "1.161.12"}]
GitHub_M · source asserted@tanstackeslint-plugin-startDirect source scope
Affected: 0.0.4Affected: 0.0.7
Source-reported scope

Canonical linkage remains open; the cited source assertion is retained below.

Inspect raw assertion[{"status": "affected", "version": "0.0.4"}, {"status": "affected", "version": "0.0.7"}]
GitHub_M · source asserted@tanstackhistoryDirect source scope
Affected: 1.161.9Affected: 1.161.12
Source-reported scope

Canonical linkage remains open; the cited source assertion is retained below.

Inspect raw assertion[{"status": "affected", "version": "1.161.9"}, {"status": "affected", "version": "1.161.12"}]
GitHub_M · source asserted@tanstacknitro-v2-vite-pluginDirect source scope
Affected: 1.154.12Affected: 1.154.15
Source-reported scope

Canonical linkage remains open; the cited source assertion is retained below.

Inspect raw assertion[{"status": "affected", "version": "1.154.12"}, {"status": "affected", "version": "1.154.15"}]
GitHub_M · source asserted@tanstackouter-vite-pluginDirect source scope
Affected: 1.166.53Affected: 1.166.56
Source-reported scope

Canonical linkage remains open; the cited source assertion is retained below.

Inspect raw assertion[{"status": "affected", "version": "1.166.53"}, {"status": "affected", "version": "1.166.56"}]
GitHub_M · source asserted@tanstackreact-routerDirect source scope
Affected: 1.169.5Affected: 1.169.8
Source-reported scope

Canonical linkage remains open; the cited source assertion is retained below.

Inspect raw assertion[{"status": "affected", "version": "1.169.5"}, {"status": "affected", "version": "1.169.8"}]
GitHub_M · source asserted@tanstackreact-router-devtoolsDirect source scope
Affected: 1.166.16Affected: 1.166.19
Source-reported scope

Canonical linkage remains open; the cited source assertion is retained below.

Inspect raw assertion[{"status": "affected", "version": "1.166.16"}, {"status": "affected", "version": "1.166.19"}]
GitHub_M · source asserted@tanstackreact-router-ssr-queryDirect source scope
Affected: 1.166.15Affected: 1.166.18
Source-reported scope

Canonical linkage remains open; the cited source assertion is retained below.

Inspect raw assertion[{"status": "affected", "version": "1.166.15"}, {"status": "affected", "version": "1.166.18"}]
GitHub_M · source asserted@tanstackreact-startDirect source scope
Affected: 1.167.68Affected: 1.167.71
Source-reported scope

Canonical linkage remains open; the cited source assertion is retained below.

Inspect raw assertion[{"status": "affected", "version": "1.167.68"}, {"status": "affected", "version": "1.167.71"}]
GitHub_M · source asserted@tanstackreact-start-clientDirect source scope
Affected: 1.166.51Affected: 1.166.54
Source-reported scope

Canonical linkage remains open; the cited source assertion is retained below.

Inspect raw assertion[{"status": "affected", "version": "1.166.51"}, {"status": "affected", "version": "1.166.54"}]
GitHub_M · source asserted@tanstackreact-start-rscDirect source scope
Affected: 0.0.47Affected: 0.0.50
Source-reported scope

Canonical linkage remains open; the cited source assertion is retained below.

Inspect raw assertion[{"status": "affected", "version": "0.0.47"}, {"status": "affected", "version": "0.0.50"}]
GitHub_M · source asserted@tanstackreact-start-serverDirect source scope
Affected: 1.166.55Affected: 1.166.58
Source-reported scope

Canonical linkage remains open; the cited source assertion is retained below.

Inspect raw assertion[{"status": "affected", "version": "1.166.55"}, {"status": "affected", "version": "1.166.58"}]
GitHub_M · source asserted@tanstackrouter-cliDirect source scope
Affected: 1.166.46Affected: 1.166.49
Source-reported scope

Canonical linkage remains open; the cited source assertion is retained below.

Inspect raw assertion[{"status": "affected", "version": "1.166.46"}, {"status": "affected", "version": "1.166.49"}]
GitHub_M · source asserted@tanstackrouter-coreDirect source scope
Affected: 1.169.5Affected: 1.169.8
Source-reported scope

Canonical linkage remains open; the cited source assertion is retained below.

Inspect raw assertion[{"status": "affected", "version": "1.169.5"}, {"status": "affected", "version": "1.169.8"}]
GitHub_M · source asserted@tanstackrouter-devtoolsDirect source scope
Affected: 1.166.16Affected: 1.166.19
Source-reported scope

Canonical linkage remains open; the cited source assertion is retained below.

Inspect raw assertion[{"status": "affected", "version": "1.166.16"}, {"status": "affected", "version": "1.166.19"}]
GitHub_M · source asserted@tanstackrouter-devtools-coreDirect source scope
Affected: 1.167.6Affected: 1.167.9
Source-reported scope

Canonical linkage remains open; the cited source assertion is retained below.

Inspect raw assertion[{"status": "affected", "version": "1.167.6"}, {"status": "affected", "version": "1.167.9"}]
GitHub_M · source asserted@tanstackrouter-generatorDirect source scope
Affected: 1.166.45Affected: 1.166.48
Source-reported scope

Canonical linkage remains open; the cited source assertion is retained below.

Inspect raw assertion[{"status": "affected", "version": "1.166.45"}, {"status": "affected", "version": "1.166.48"}]
GitHub_M · source asserted@tanstackrouter-pluginDirect source scope
Affected: 1.167.38Affected: 1.167.41
Source-reported scope

Canonical linkage remains open; the cited source assertion is retained below.

Inspect raw assertion[{"status": "affected", "version": "1.167.38"}, {"status": "affected", "version": "1.167.41"}]
GitHub_M · source asserted@tanstackrouter-ssr-query-coreDirect source scope
Affected: 1.168.3Affected: 1.168.6
Source-reported scope

Canonical linkage remains open; the cited source assertion is retained below.

Inspect raw assertion[{"status": "affected", "version": "1.168.3"}, {"status": "affected", "version": "1.168.6"}]
GitHub_M · source asserted@tanstackrouter-utilsDirect source scope
Affected: 1.161.11Affected: 1.161.14
Source-reported scope

Canonical linkage remains open; the cited source assertion is retained below.

Inspect raw assertion[{"status": "affected", "version": "1.161.11"}, {"status": "affected", "version": "1.161.14"}]
GitHub_M · source asserted@tanstacksolid-routerDirect source scope
Affected: 1.169.5Affected: 1.169.8
Source-reported scope

Canonical linkage remains open; the cited source assertion is retained below.

Inspect raw assertion[{"status": "affected", "version": "1.169.5"}, {"status": "affected", "version": "1.169.8"}]
GitHub_M · source asserted@tanstacksolid-router-devtoolsDirect source scope
Affected: 1.166.16Affected: 1.166.19
Source-reported scope

Canonical linkage remains open; the cited source assertion is retained below.

Inspect raw assertion[{"status": "affected", "version": "1.166.16"}, {"status": "affected", "version": "1.166.19"}]
GitHub_M · source asserted@tanstacksolid-router-ssr-queryDirect source scope
Affected: 1.166.15Affected: 1.166.18
Source-reported scope

Canonical linkage remains open; the cited source assertion is retained below.

Inspect raw assertion[{"status": "affected", "version": "1.166.15"}, {"status": "affected", "version": "1.166.18"}]
GitHub_M · source asserted@tanstacksolid-startDirect source scope
Affected: 1.167.65Affected: 1.167.68
Source-reported scope

Canonical linkage remains open; the cited source assertion is retained below.

Inspect raw assertion[{"status": "affected", "version": "1.167.65"}, {"status": "affected", "version": "1.167.68"}]

Affected-product evidence

Accepted scope and product mapping

0 canonical links · 0 source-reported links

Applicability remains source-scoped; safety and exposure remain unassessed.

Assessments

CVSS by origin

9.6
security-advisories@github.comCVSS 3.1 · role Secondary · priority eligiblevalid_matchCVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:H/I:H/A:H
9.6
GitHub_MCVSS 3.1 · role unknown · display onlyDirect record assessment retained outside normalized eligibilityCVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:H/I:H/A:H

Evidence boundaries

  • KEV membership is authoritative for the catalog, not proof of exposure in any environment.
  • EPSS is a dated model probability and not an individual-environment prediction.
  • Affected or fixed status applies only to the exact cited product and version scope; remaining scope stays source-scoped.
  • NVD-carried upstream facts remain derivative; independent corroboration requires a separately authored source.
  • Only NVD metrics validated under the generation-bound calculator are Public Priority eligible; direct CVE record metrics remain display-only.
  • NVD CVSS source eligibility is closed: NVD-authored, exact record-source, or registered same-CVE container origin; unmapped sources remain display-only.
  • Affected-product evidence remains source-scoped; canonical linkage is required before applicability scoring.
  • Core replay supports the active and immediately prior generation; retrospective valid-at replay is deferred.
  • OSV aggregation and OSV-converted NVD material are not independent corroboration.
  • Red Hat facts are vendor assertions for the exact supplied products.
  • Nonmembership and not-yet-observed states are not proof of safety.