DEV Community

Eldor Zufarov
Eldor Zufarov

Posted on

Mini Shai-Hulud: the tj-actions memory-dump script, reused fourteen months later

In May 2026, TanStack Router — one of the most-used routing libraries in the React ecosystem, roughly 12 million downloads a week — got compromised through a four-hop chain. Nothing in it was individually a zero-day. Together, it produced 84 malicious package versions across 42 packages, published with fully valid cryptographic provenance.

Hop 1 — pull_request_target

An attacker forked the repo and merged a malicious commit. A workflow triggered on pull_request_target then checked out and ran code straight from that fork — a well-known dangerous pattern when the checkout ref isn't restricted.

Hop 2 — Cache poisoning

That code poisoned the GitHub Actions cache with a malicious package store, then waited.

Hop 3 — OIDC extraction from runner memory

Hours later, a routine workflow restored the poisoned cache. A binary then extracted OIDC tokens directly from the runner's memory — using the exact same script, with the same code comment, as the tj-actions/changed-files compromise from March 2025. Different repository, different year, same tool reused by (likely) different actors.

Hop 4 — Publish with valid provenance

Those tokens published 84 malicious versions — with valid, cryptographically verified SLSA provenance attached. No npm token was ever stolen; the credentials were real, just in the wrong hands.

The response — and the trap

An independent researcher caught it in 20–26 minutes; the packages were deprecated within the hour. Buried in the payload was a persistence daemon that polled for its own token's revocation status — and was set to wipe the machine the moment that token got rotated. Fast detection is likely why that trigger was defused before standard incident-response steps (rotate the leaked credential) could set it off.

The takeaway

A finding is one fact: a leaked token, a mutable cache, a transitive dependency. A chain is what happens when three or four unremarkable facts line up in the right order — and increasingly, attackers are reusing each other's tooling across incidents more than a year apart, not just the same techniques.

Episode 5 of They Read The Manual walks through the full chain, including the exact GitHub Actions configuration involved and a 60-second check you can run against your own workflows.

🎥 Watch: https://youtu.be/DWk08WslyfE

Top comments (0)