Build1 publisher2 min readPublished
The provenance on @7nohe/openapi-react-query-codegen was accurate about every question it was built to answer, which is why the Docker Security Dispatch reaches instead for a five-day resolution cooldown that npm ci does not apply.
The Engineer · Build desk

Compiled by The EngineerSomething wrong?How this is made
A provenance attestation is a statement the builder makes about itself. It binds the artifact to a workflow identity and to the repository that workflow lives in, and both of those bindings were accurate here [4]. Nothing in it binds the source tree, so a job that checks out the head of a forked pull request emits an attestation that is honest about the builder and says nothing about the code [2]. That leaves the trigger as the only thing between an outsider and a signed release, and in this repository the trigger was a comment [2]. The access control on the publish credential was a comment box.
Put the defence on the same calendar. A consumer with `min-release-age=5` in `.npmrc` would not have resolved the August 28 versions until September 2 [16]. The dispatch's case for that number is empirical: across its taxonomy of seven Shai-Hulud campaigns, every one was identified within five days [8]. The window works because other people are busy inside it, unpacking payloads and getting tarballs pulled from the registry [9].
For five days to transfer to your build, that activity has to happen for your dependency. Popularity is doing the work: a package with enough downstream weight attracts researchers and gets maintainers to deprecate fast [9], while a quiet one gives you the same five days of calendar and much less scrutiny. The dispatch is straight about the other limit. Five days buys detection time and does not make an old package safe, and a payload that sleeps past the window is untouched by the clock, which is why it presents the cooldown as a first defence rather than the plan [10].
Worth noting who is vouching for what. The taxonomy that sizes the window and the SIP plan that packages it are both the dispatch author's own work, SIP having been published on August 16 after an August 6 SafeDev Talks appearance on AI agents installing dependencies [8][12]. The outside assessment is Xygeni's npm Worm Playbook of August 21, which compared three npm supply-chain incidents and singled out the pairing of the five-day cooldown with disabled lifecycle scripts as a "genuinely sound, low-effort control", on the grounds that it attacks the detection lag every fast worm depends on [11].
Of everything in place around that workflow on August 28, the control that would have kept those ten versions out of a build decides on publication date and never opens the tarball [1][6].
Ranked by verification strength, evidence, and original report placement.
On August 28, an attacker published ten malicious versions of @7nohe/openapi-react-query-codegen through the project's real GitHub Actions workflow; the issue reviews August 2026 and the operator remains unknown.
Any GitHub user could comment 'npm publish' on a pull request; the workflow would check out that fork's code, install it, and run with id-token: write.
Unauthorized code from a forked pull request was able to enter a trusted workflow, authenticate to npm through OIDC, and publish a malicious package.
The workflow generated valid provenance, which pointed back to the real repository and the trusted workflow.
Valid provenance proved which trusted workflow published ten malicious npm versions, not whether that workflow should have published them.
npm has a configuration option min-release-age; set to a number of days, npm will not resolve any package version published within that many days. The dispatch's recommendation is to add min-release-age=5 to the repository's .npmrc.
Follow any of these and your For You feed starts watching them — no settings page required.
Evidence-backed comparisons of source perspectives and observed adoption signals. Read the methodology
Which Builder, Operator, and Investor concerns the observed source mix emphasized—not a truth score.
Evidence, demonstrated adoption, hype gap, incentives, and confidence are assessed independently, each on its own current evidence. How these are measured.
Single account, checkable mechanics
The failure chain is described precisely enough for a reader to test against public workflow syntax and npm's documented options: a comment-triggered job, a fork checkout, id-token: write, an OIDC exchange with the registry, provenance that names the real repository. What is absent is anything from outside the author's own writing — no registry advisory, no maintainer statement, no second account of the ten versions — and the five-day detection figure is cited to a taxonomy the dispatch links to rather than reproduces.
No uptake measured
Nothing in this reporting counts anything. There are no download totals for the poisoned versions, no figure for how many projects have set min-release-age, and no indication that the cooldown has been put into practice anywhere beyond one vendor writing approvingly of the idea.
Careful, except about five days
The dispatch polices most of its own promise: it says outright that a dormant payload outlasts the wait, and that npm ci skips the age check entirely. The strain sits in how much rides on one number. "Every campaign detected within five days" comes from the author's own taxonomy and is what upgrades a one-line config change to a remarkably effective defence, and the piece never mentions that the same filter holds back a security patch for those five days too.
Remedy and reporter are the same author
The author wrote the taxonomy that supplies the five-day figure, published the SIP plan the piece recommends, and quotes Xygeni praising that plan by name. Readers are also pointed to his earlier dispatch issue for the CRA checklist and his JAVAPRO article on signing SBOMs, and the whole thing runs on Docker's dev.to account, whose products sit behind two of SIP's five controls. None of that makes the technical account wrong; it does mean every recommendation routes back to whoever wrote it.
Verifiable in principle, unverified in practice
A reader can hold the failure chain up against a workflow file and npm's own configuration documentation, and the conclusion about provenance follows from what an attestation is built to prove, which is why this lands above the middle. It goes no higher because the incident, the five-day timing and the vendor endorsement all reach us through one voice with a stake in the conclusion.
security
GitGuardian finds a Shai-Hulud variant sweeping 469 credential paths across CI/CD and AI configs1 publisher
security
Reading OIDC tokens out of runner memory: ChainDrop and the poisoned build1 publisher
build
56 build-pipeline attacks, one vendor's alert queue, and the February jump nobody can attribute yet1 publisher
build
The Mini Shai-Hulud worm passed provenance checks by running inside the release pipeline1 publisher
Publishers with included, body-backed reporting in this cluster.
1 article · September 8, 2026