Skip to content

SecurityNot yet confirmed elsewhere1 publisher2 min readPublished

npm Trusted Publishing accepted a freed GitHub repo name as proof of who may publish

Bloom Security counted more than 1,500 npm packages exposed because Trusted Publishing bound publish rights to a GitHub repository name. GitHub says it has shipped fixes, and Bloom's Golan Myers said it is unknown whether anyone exploited the flaw.

The Watch · Security desk

How we use AISend a correction

Illustration accompanying npm Trusted Publishing accepted a freed GitHub repo name as proof of who may publish
Generated illustration
Bloom's exposed npm packages are widely downloaded Bloom Security's count of npm packages exposed by the Trusted Publishing flaw, and the downloads those packages have.

Key figures: Bloom Security counted more than 1,500 npm packages exposed. Those packages have more than 10 million downloads in total, averaging about 670 downloads a month per package.

Bloom's exposed npm packages are widely downloaded
FigureValueNoteClaim
npm packages Bloom counted as exposed, more than1,500 packages19
Total downloads, more than10,000,000 downloads20
Average monthly downloads per exposed package, about670 a monthAverage across the exposed packages16

What happened

  • npm stored the bound repository as an owner/repo string and did not check the permanent numeric IDs that GitHub puts in every identity token.
  • After a rename, transfer or deletion freed the old name, anyone could create a repository there, add a matching workflow file and receive a publish credential.
  • Bloom's researchers carried out the full attack against a package and repositories under their own control, with the publish coming from a repository belonging to a second organization.
  • Bloom filed its report on June 6 through GitHub's HackerOne bug bounty program. GitHub's validation followed on June 9.
  • GitHub's change was announced on October 2. According to npm's documentation, the first successful publish under a configuration ties that configuration to the repository's immutable identity.

Why it matters

  • decision Maintainers have a short audit: run npm trust list, confirm each repository is still one they control, re-create bindings to renamed or transferred repositories, and remove a binding before deleting its repository.
  • constraint A release published through the flaw carries a valid provenance attestation, so validity alone does not show the intended source; users must read the repository it names, and Bloom is withholding package names.
  • exposure Bloom estimates AI agents install about 70 packages a month on a typical endpoint and close to 350 on developer machines, usually without reviewing the package or its maintainer.

GitHub's name retirement narrows the set. When an owner account is renamed or deleted, GitHub retires the name of any repository that drew more than 100 clones in the preceding week [8]. That protects some packages. "We took this into account. Everything we considered vulnerable was pertaining to claimable slugs," said Golan Myers, security researcher at Bloom Security [9].

The reach of any one package is small. Together, the exposed packages account for over 10 million downloads in total and over a million every month [20]. That averages about 670 a month per package [16]. But a malicious version can carry a postinstall script, and npm runs it automatically on every machine that installs the update [24].

The disclosure went quiet before the fix. Bloom says GitHub's last reply came on July 8 and that six follow-ups after it, including a mediation request to HackerOne, went unanswered [18]. A GitHub spokesperson then told Help Net Security: "Unvalidated Trusted Publishing configurations now expire 48 hours after creation and can no longer authorize publishing." [10]

GitHub's statement does not say whether configurations that published before the change were bound retroactively [21]. We think the 1,500 figure cannot be read as closed until that is answered [21].

Myers said it is unknown whether anyone exploited the flaw in the wild [22]. In our view the fault is in how the binding was designed: Bloom says npm's GitLab trusted publishing integration has the same weakness [23].

What to watch

  • Whether GitHub or npm confirms that bindings which published before October 2 are now tied to immutable IDs.
  • Any report of a package published through a freed slug outside Bloom's controlled test.
  • Whether npm applies the same identity check to its GitLab trusted publishing integration, which Bloom says has the same weakness.

Clarity's read

What the record supports and how the coverage leans. The claims behind it follow.

Reality

Evidence62
Adoption
Insufficient
Hype gap+10
Incentives
Insufficient
Confidence58
Why these scores

Claim ledger

Ranked by verification strength, evidence, and original report placement.

  1. [1]

    Bloom Security researchers found that npm's Trusted Publishing feature let an attacker push new versions of someone else's package without stealing a credential.

    ReportedSupportedView cited source
  2. [2]

    The attacker only needed to register a GitHub repository name the maintainer had left behind.

    ReportedSupportedView cited source
  3. [3]

    Trusted Publishing, generally available since July 2025, replaces long-lived publishing tokens; GitHub issues the workflow a signed identity token and npm exchanges it for a publish credential that expires within minutes.

    ReportedSupportedView cited source

Sources

1 independent publisher whose own reporting we read for this story.

  1. helpnetsecurity.com

    1 article · October 13, 2026

    npm Trusted Publishing flaw exposed 1,500+ npm packages to takeover

Share your take

Let Clarity write the post for you.

Signed-in readers get a short post drafted on this story in the register they choose — narrative, analytical, or a direct position — editable to the last word before it goes anywhere. The share buttons at the top of this story work without an account.

Topics and entities

Follow any of these and your For You feed starts watching them — no settings page required.

Entities

Loading related stories