TanStack npm Supply Chain Attack CVE-2026-45321 — Chain Analysis and Defense

Table of Contents

The assumption that “the npm ecosystem is safe enough and popular packages are thoroughly vetted” is widespread. That premise is wrong. Between 19:20 and 19:26 UTC on May 11, 2026, a total of 84 malicious versions were published across 42 @tanstack/* packages — all within just 6 minutes. Registered as CVE-2026-45321, this vulnerability scores 9.6/10 (Critical) on CVSS v3.1. Without a proper npm supply chain attack response strategy, production server credentials could be fully exfiltrated. This article dissects the technical structure of the attack chain, examines why existing defense strategies failed, and proposes a practical multi-layered defense framework.

Technical Structure of the TanStack npm Supply Chain Attack

This attack wasn’t a single vulnerability but a sophisticated 3-stage chain. The attacker combined pull_request_target workflow misconfiguration, GitHub Actions cache poisoning, and OIDC token extraction from runner process memory in sequence. Each stage posed limited risk on its own, but chained together they escalated all the way to npm package publishing privileges.

pull_request_target Workflow Misconfiguration

The pull_request_target event is a GitHub Actions trigger that runs external PR code in the base branch context. Unlike the standard pull_request event, this trigger indirectly grants the PR author access to the repository’s secrets. The TanStack repository was using this configuration without sufficient constraints, and the attacker leveraged it as the entry point.

GitHub Actions Cache Poisoning

In the second stage, the attacker poisoned the GitHub Actions cache mechanism. Injecting malicious code into the cache that the CI/CD pipeline depends on causes all subsequent workflow runs to consume the tainted cache. This technique works through cache key collision or by manipulating the cache restoration order.

OIDC Token Extraction and Package Publishing

In the final stage, the attacker extracted the OIDC token from the runner process memory. After authenticating to the npm registry with this token, they successfully published 2 malicious versions each across 42 packages. According to the TanStack Router security advisory, the entire attack window was just 6 minutes — indicating that automated scripts handled the mass publishing.

First known bypass of SLSA provenance
This attack is known as the first real-world case where SLSA provenance-based verification was bypassed. Because the official build pipeline itself was compromised, provenance signatures appeared legitimate. Detection through signature-based verification alone was structurally impossible. The SLSA official documentation (slsa.dev) does not yet specify concrete countermeasures for this bypass scenario.

Malicious Payload Analysis: How router_init.js Works

The malicious versions contained router_init.js, an obfuscated script approximately 2.3MB in size, designed to execute automatically at install time. Understanding this payload’s behavior is the starting point for responding to the TanStack npm supply chain attack.

Credential Collection Scope

The payload’s credential collection scope is extensive: AWS IMDS (Instance Metadata Service) and Secrets Manager, GCP metadata server, Kubernetes service account tokens, HashiCorp Vault tokens, npm authentication tokens stored in ~/.npmrc, GitHub tokens, and SSH private keys.

Exfiltrated data was sent through the Session/Oxen messenger’s E2E encrypted network, making it difficult to identify stolen content through network monitoring. Using an encrypted messenger instead of a conventional HTTP-based C2 server appears to be a deliberate choice to increase forensic difficulty.

Dead-Man’s-Switch Mechanism

The dead-man’s-switch functionality is particularly dangerous. When the payload detects that a stolen token has been revoked, it executes rm -rf ~/ to delete the entire home directory. The standard response procedure of credential rotation can itself trigger additional damage. On affected hosts, the malicious process must be terminated first, followed by system isolation, before proceeding with credential rotation.

Malicious package identification is possible through the optionalDependencies field in package.json:

"optionalDependencies": {
  "@tanstack/setup": "github:tanstack/router#79ac49eedf774dd4b0cfa308722bc463cfe5885c"
}

If this pattern exists, the package is a malicious version. Direct local inspection using the following commands is recommended:

npm pack @tanstack/<package>@<version>
tar -xzf *.tgz
cat package/package.json | grep -A3 optionalDependencies
ls -la package/router_init.js

If router_init.js exists or the optionalDependencies contains the above GitHub commit hash, the package should be removed immediately. Detailed community analysis of the malicious payload is available at TanStack Router issue #7383.

Scope of affected packages
84 malicious versions were published — 2 per each of the 42 `@tanstack/*` packages. The scope extends beyond router to include query, table, form, and more across the entire TanStack ecosystem. The full `@tanstack/` scope should be treated as the inspection target.

Where Existing Defense Strategies Failed

Analyzing why this attack penetrated existing security measures reveals structural limitations in conventional npm security recommendations.

Limitations of Lockfile Pinning

Lockfile pinning is the most basic defense for fixing dependency versions. However, running npm install or npm update refreshes the lockfile, potentially pulling in malicious versions. Projects using semver ranges (^, ~) are especially vulnerable when a malicious version falls within the specified range at the time of lockfile refresh.

The Time Gap Problem with npm audit

npm audit relies on known vulnerability databases, and a time gap exists between CVE registration and database updates. During the window between malicious version publication and CVE registration, audit likely produced zero warnings. The detection capability of audit against zero-day supply chain attacks is inherently limited.

Blind Spots in Signature-Based Verification

SLSA provenance and npm signatures verify whether a package was “built from the official build pipeline.” But this attack compromised the official pipeline itself, so signatures appeared legitimate. When the build infrastructure’s integrity is broken, signature verification becomes ineffective.

Defense MeasureEffectiveness in This AttackLimitation
Lockfile pinningBypassed via npm installMalicious version introduced during refresh
npm auditUnable to detect before CVE registrationZero-day time gap
SLSA provenanceDisplayed as valid signatureMeaningless when build infra is compromised
2FAProtects package publisherOIDC token path bypasses 2FA

Immediate Response Procedures for the TanStack npm Supply Chain Attack

The immediate actions for affected projects are clear. These must be executed sequentially by priority — changing the order can trigger additional damage from the dead-man’s-switch.

Step 1: Isolate the Malicious Process

Terminate node processes on affected hosts first. The critical point: because the dead-man’s-switch executes rm -rf ~/ upon detecting token revocation, process termination must precede credential rotation.

Step 2: Pin Dependency Versions and Clean Reinstall

Pin all @tanstack/* dependencies to versions published before 2026-05-11 19:00 UTC. Then delete node_modules and the lockfile and perform a clean reinstall. The --ignore-scripts flag is essential here to prevent malicious scripts from re-executing during reinstallation:

npm config set ignore-scripts true
Credential rotation order matters
The sequence must be: terminate malicious process → isolate system → rotate credentials. Reversing this order can trigger the dead-man’s-switch and delete the home directory. In cloud environments, capturing an instance snapshot first is the safer approach.

Step 3: Credential Rotation

Immediately rotate all credentials that the install process could have accessed. The scope includes AWS IAM keys, GCP service account keys, Kubernetes service account tokens, npm tokens, GitHub PATs, and SSH keys in their entirety. Rather than rotating only “suspected” keys, all secrets accessible from the affected host should be targeted.

Step 4: Review Cloud Audit Logs

Review cloud audit logs from affected hosts for abnormal API calls. AWS CloudTrail and GCP Cloud Audit Logs should be examined intensively for anomalous activity around the attack window (2026-05-11 19:20–19:26 UTC).

npm ci --ignore-scripts

This command installs only the exact versions recorded in the lockfile and blocks execution of arbitrary scripts such as postinstall. Using npm ci instead of npm install is a fundamental principle when responding to npm supply chain attacks.

Building a Multi-Layered Defense: Preventive Security Configuration

After immediate response, a multi-layered defense framework capable of proactively blocking similar attacks needs to be established. The Node.js security best practices guide recommends 5 core countermeasures.

Always-On npm ci and ignore-scripts

Using npm ci instead of npm install in CI/CD pipelines causes the installation to fail when the lockfile and package.json are inconsistent. Combined with --ignore-scripts, this blocks malicious code execution through postinstall hooks entirely:

npm ci --ignore-scripts
npm config set ignore-scripts true

However, setting ignore-scripts globally can break node-gyp-based native modules such as bcrypt, sharp, and others. In those cases, either run explicit builds only for excepted packages or use alternative packages that provide prebuilt binaries. Separating settings per-project via .npmrc files tends to be more manageable.

Applying dependency review action

The dependency review action recommended in the GitHub supply chain security guide automatically scans for vulnerabilities in newly added or changed dependencies at the PR stage. PRs containing vulnerable versions can be blocked from merging, making it effective at preventing malicious version introduction during lockfile updates.

SBOM-Based Dependency Inventory

Generating an SBOM (Software Bill of Materials) catalogs all direct and transitive dependencies of a project. This becomes essential documentation for rapidly determining the impact scope when incidents occur. GitHub allows enabling automatic SBOM generation in repository settings.

Enabling Dependabot and Secret Scanning

Dependabot automatic updates create PRs automatically when security patches are released. Secret scanning automatically detects API keys, tokens, and similar credentials included in commits. Both features can be activated in GitHub repository settings and help reduce post-attack damage from supply chain compromises.

CI pipeline security checklist
Always-on `npm ci –ignore-scripts`, dependency review action merge blocking, automatic SBOM generation, Dependabot security updates, and secret scanning — applying these 5 items as defaults in CI/CD pipelines blocks most supply chain attack entry paths.

Hardening GitHub Actions Workflow Security

Given that the entry point of this attack was a pull_request_target workflow misconfiguration, GitHub Actions security configuration is one of the critical defense layers.

Restricting pull_request_target Usage

The pull_request_target trigger is a dangerous configuration that runs external PR code with base branch secret access privileges. If it must be used, restrict the checkout target via actions/checkout to the base branch rather than the PR HEAD, and design the workflow to never directly execute PR code.

The safest approach is to use the pull_request event instead of pull_request_target. Isolating secret-requiring tasks into a separate manual approval workflow blocks secret exposure from external PRs.

Actions Cache Integrity Verification

To prevent GitHub Actions cache poisoning, include the lockfile hash in the cache key and add a dependency integrity re-verification step after cache restoration. Disabling caching entirely is also an option, but the trade-off of increased build times requires project-scale-dependent judgment.

Minimizing OIDC Token Scope

The permission scope of OIDC tokens used for npm package publishing should be minimized. Separating the publishing workflow and granting id-token: write permission only to that workflow ensures that even if a token is stolen from another workflow, publishing privileges cannot be obtained.

SettingRecommended ValueEffect
pull_request_targetProhibit or restrict to base branch code onlyBlocks external PR secret access
Cache keyInclude lockfile hashIncreases cache poisoning difficulty
id-token permissionGrant only to publishing workflowReduces OIDC token theft impact scope

Runtime Detection and Monitoring Strategy

Prevention alone cannot block every supply chain attack, so a monitoring layer that detects anomalous behavior at runtime must also be established.

Install-Time Anomaly Detection

Monitoring for unexpected network requests during npm install or npm ci execution is the first line of defense. Key indicators include: HTTP requests to the IMDS endpoint (169.254.169.254), outbound connections to unknown external domains, and anomalous file read attempts targeting ~/.npmrc or ~/.ssh/ directories.

Configuring monitoring rules based on the target list accessed by this attack’s payload — AWS IMDS, GCP metadata, Kubernetes service accounts, Vault, .npmrc, GitHub tokens, SSH keys — enables early detection of attacks following similar patterns.

Restricting IMDS Access in Cloud Environments

On AWS, enforcing IMDSv2 and setting the hop limit to 1 blocks IMDS access from within containers. GCP similarly allows restricting metadata server access through workload identity configuration. When CI/CD runners execute on cloud instances, these settings significantly reduce the credential theft scope of supply chain attacks.

Package Size Anomaly Monitoring

The malicious payload router_init.js was approximately 2.3MB in size. A single file exceeding 2MB in a typical frontend utility package is rare. Building automation in the CI pipeline that inspects installed package file sizes and triggers alerts on sudden size changes compared to previous versions can help catch obfuscated malicious code early.

Leveraging third-party tools like Socket
Beyond npm audit, tools like Socket analyze package behavioral patterns — network requests, filesystem access, environment variable reads — to detect suspicious dependencies. The Node.js security guide also recommends CI integration of such tools. Note that detailed configuration guides from npm official documentation (docs.npmjs.com) are not directly citable at this time; refer to each tool’s official repository instead.

Limitations and Open Problems in the Defense Framework

The defense framework outlined here does not cover every supply chain attack scenario. Several structurally unresolved problems remain.

First, ignore-scripts blocks native module builds, making blanket application across all projects impractical. Packages like bcrypt, sharp, and sqlite3 require postinstall scripts, introducing exception management overhead. The trade-off between security and compatibility varies by project.

Second, this case — where SLSA provenance was bypassed — raises a more fundamental problem: guaranteeing the integrity of build infrastructure itself. As long as signature verification depends on the premise that “the build pipeline is secure,” it remains ineffective against pipeline compromise attacks. The SLSA official documentation (slsa.dev) does not yet specify concrete countermeasures for this scenario.

Third, the security-by-default configuration introduced in pnpm v11 (blocking scripts by default) is a promising approach, but it’s not yet the default in the npm and yarn ecosystems. While detailed configuration from pnpm official documentation (pnpm.io) cannot be directly cited, strengthening security defaults at the package manager level remains an ecosystem-wide challenge.

Fourth, the official TanStack postmortem (tanstack.com) has been published but is not directly citable at present. The complete picture of the attack timeline and response process requires referencing that document.

Ultimately, npm supply chain security cannot be solved by any single tool or configuration. The core principle of npm supply chain attack response is layered combination — lockfile pinning, script blocking, dependency review, SBOM, runtime monitoring, and workflow permission minimization — where each layer catches what the previous one misses. Named “Mini Shai-Hulud,” this attack demonstrated GitHub Actions cache poisoning and OIDC token theft as novel attack vectors. CI/CD pipeline security audits and npm postinstall security policy reviews are the next order of business.

Scroll to Top