Poisoned Pipeline

Poisoned Pipeline / Incidents / AS20

AS20 · 2026-08

@7nohe/openapi-react-query-codegen poisoned publish workflow

npmGitHub Actions

On 28 August 2026 an external GitHub user posted the comment "npm publish"
on a pull request. The project's release workflow trusted that comment from
any PR participant, checked out the untrusted PR, installed its
dependencies, and published to npm with GitHub Actions OIDC (Trusted
Publishing). Ten malicious versions shipped; install hooks and a malicious
binding.gyp ran attacker code, downloaded Bun, and harvested GitHub
credentials. StepSecurity reproduced the behavior under Harden-Runner.
Charlie Eriksen reported the releases in GitHub issue #217.

Mapped techniques

supply-chain GitHub Actions release workflow

T0147 · Reconnaissance · Scan public CI/CD configurations for secrets and vulnerable actions

The issue_comment workflow that published on a literal "npm publish"
comment was public and required no maintainer role check.

T0202 · Persistence · Inadequate CI/CD workflow permissions

id-token: write plus checkout of untrusted PR head let any commenter
mint a Trusted Publisher identity.

T0166 · Execution · Trigger pipeline execution

The attacker opened PRs #215/#216 and posted the trigger comment;
the workflow ran and published.

T0183 · Credential Access · Harvesting short-lived token

npm Trusted Publishing used a short-lived OIDC token instead of a
stored npm password — still enough to publish.

T0109 · Resource Development · Publish malicious artifact

Ten versions, including 3.0.4 mapped as npm latest, were published.

post-supply-chain Installers of the package

T0151 · Execution · Installation scripts

preinstall ran node 3FWCvzduYZg.js; binding.gyp decoded to the same
command via os.system when node-gyp evaluated it.

T0140 · Credential Access · Harvest tokens from environment variables

Direct payload execution ran gh auth token and git credential-manager
and probed GCP metadata.

T0159 · Execution · Malicious artifact execution

Installing an affected version was enough; npm latest still pointed
at 3.0.4 at the time of the write-up.

Framework gaps noted

Sources