The TanStack supply-chain compromise published 84 malicious versions across 42 packages yesterday. The attack chain is remarkable: pull_request_target abuse β GitHub Actions cache poisoning β runtime OIDC token extraction β direct npm publish.
No stolen npm tokens. The release workflow itself was never breached. The attacker just... became it.
This lands precisely on a point I made in last week's newsletter: "trusted publishing" and provenance attestation verify *who* published something, not *whether that person was in control of their own actions*.
The Axios compromise proved this with session hijacking. TanStack proves it again through CI subversion. Different vectors, same structural flaw.
There is one cheap, high-leverage defense that actually works: minimum release age.
Most malicious releases are detected and yanked within hours. A 24-hour install cooldown filters out the smash-and-grab attacks automatically.
All three major package managers now support this:
β’ npm (v11.10+): min-release-age=1
β’ pnpm (v10.16+): minimumReleaseAge: 1440
β’ Yarn (Berry 4.10+): npmMinimalAgeGate: 1440
Links in the comments.
No stolen npm tokens. The release workflow itself was never breached. The attacker just... became it.
This lands precisely on a point I made in last week's newsletter: "trusted publishing" and provenance attestation verify *who* published something, not *whether that person was in control of their own actions*.
The Axios compromise proved this with session hijacking. TanStack proves it again through CI subversion. Different vectors, same structural flaw.
There is one cheap, high-leverage defense that actually works: minimum release age.
Most malicious releases are detected and yanked within hours. A 24-hour install cooldown filters out the smash-and-grab attacks automatically.
All three major package managers now support this:
β’ npm (v11.10+): min-release-age=1
β’ pnpm (v10.16+): minimumReleaseAge: 1440
β’ Yarn (Berry 4.10+): npmMinimalAgeGate: 1440
Links in the comments.