Compromised @tanstack/* Packages Exfiltrate Credentials via GitHub Actions Exploit
On 2026-05-11, multiple malicious versions of `@tanstack/*` packages were published to the npm registry due to a chained attack exploiting vulnerabilities in GitHub Actions; the attacker used a compromised GitHub Actions OIDC trusted-publisher binding to publish credential-stealing malware that harvests credentials, exfiltrates data, and propagates the compromise by republishing other packages with the same injection, requiring users who installed affected versions to consider their environment compromised and rotate all credentials.
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. This supply chain attack highlights the risks of compromised CI/CD pipelines and the potential for widespread credential theft.
Attack Chain
- The attacker exploited a
pull_request_target“Pwn Request” misconfiguration in theTanStack/routerrepository. - The attacker performed GitHub Actions cache poisoning across the fork↔base trust boundary, injecting malicious code into the cache.
- The attacker extracted the OIDC token from the Actions runner process memory.
- Using the compromised OIDC token, the attacker published malicious versions of
@tanstack/*packages to the npm registry via the legitimate GitHub Actions OIDC trusted-publisher binding. - Upon installation of a malicious package version, the
router_init.jspayload (~2.3 MB obfuscated) executes. - The payload harvests credentials from AWS, GCP, Kubernetes, HashiCorp Vault, npm, GitHub, and SSH keys.
- The harvested data is exfiltrated over the Session/Oxen messenger network to
filev2.getsession.org,seed{1,2,3}.getsession.org. - The attacker enumerates packages maintained by the victim and republishes them with the same injection, propagating the compromise.
Impact
Any developer or CI environment that ran npm install, pnpm install, or yarn install against an affected version on 2026-05-11 should be considered compromised. All credentials accessible to the install process, including AWS, GCP, Kubernetes, Vault, npm, GitHub, and SSH keys, should be rotated immediately. Cloud audit logs should be reviewed for activity originating from the affected hosts during and after the install window. The malicious packages also attempt to propagate the compromise to other packages maintained by the victim.
Recommendation
- Inspect the manifest of any pinned
@tanstack/*version for the maliciousoptionalDependenciesentry as described in the Detection section. - Block connections to the exfiltration domains
filev2.getsession.org,seed1.getsession.org,seed2.getsession.org, andseed3.getsession.orgat the network level. - Deploy the Sigma rules to detect the presence of the malicious
router_init.jsfile. - Pin every
@tanstack/*dependency to a known-good version published before 2026-05-11 19:00 UTC, as described in the Workarounds section.
Detection coverage 2
Detect router_init.js creation during npm install
highDetects the creation of router_init.js, a malicious payload dropped by compromised @tanstack/* packages, during npm install or similar package installation processes.
Detect Outbound Connections to Oxen Network Domains
mediumDetects outbound network connections to domains associated with the Session/Oxen messenger network, used for exfiltration by compromised @tanstack/* packages.
Detection queries are available on the platform. Get full rules →
Indicators of compromise
4
domain
2
url
| Type | Value |
|---|---|
| domain | filev2.getsession.org |
| domain | seed1.getsession.org |
| domain | seed2.getsession.org |
| domain | seed3.getsession.org |
| url | https://litter.catbox.moe/h8nc9u.js |
| url | https://litter.catbox.moe/7rrc6l.mjs |