Safeguard
Supply Chain Security•

A Shai-Hulud payload came back on npm after 111 days

Aikido reported that four npm packages published on 7 September 2026 carried a payload with the same hash as the May @antv wave, after 111 days with no sightings.

Safeguard Security Team
4 min read

On 7 September 2026 Aikido Security reported that four npm packages, published within the same hour by the same npm account, carried a Shai-Hulud payload with the same SHA256 as the one used in the @antv compromise of 19 May 2026. Aikido's records show no sightings of that hash between 20 May and 6 September, a gap it counts as 111 days.

The part worth your attention is not the payload, which Aikido calls the identical file. It is that a known sample was published again and was not stopped by registry scanning that npm had introduced in July.

What happened

Aikido's account, by Charlie Eriksen, gives these facts:

  • On 19 May 2026 a compromised maintainer account pushed 639 malicious @antv versions in about an hour.
  • On 7 September 2026 four packages appeared with the same payload: feishu-docx-mcp@0.3.2, bmc-i18n-extract-cli@1.1.1, blueai-cli@0.7.0 and bmc-translate-utils@1.1.1.
  • The payload hash is e37e3ddeeaaa9e0c4fdbcb829b4895a6521031c80053fc436625b61e6ee5b1a6. Aikido counts 319 package versions with that hash, all first seen on 19 May.
  • The package carries a root level index.js and a preinstall script that runs bun run index.js.

Aikido lists persistence in .vscode/tasks.json and .claude/settings.json, outbound validation calls to the npm registry with stolen tokens, and the creation of GitHub repositories with Dune themed names. The command and control domain it lists from the May wave is t.m-kosche.com.

Confirmed, reported and unknown

Confirmed by Aikido's own data: the four versions above, the shared hash, the single publishing account and the one hour window.

Reported by Aikido as its interpretation: that this is the longest dormancy to reactivation gap it has seen from a Shai-Hulud payload, and that npm's publish time malware scanning, which holds packages for 5 to 15 minutes, should have caught an exact hash match.

Unknown, because the post does not say: how the publishing account was accessed, why the scan missed the file, whether more than these four packages were published, and what the operator intended.

What to do now

  1. Search lockfiles and CI caches for the four package names and versions.
  2. If any machine or runner installed one, treat every secret reachable from it as exposed. Rotate npm, GitHub and cloud credentials, starting with npm tokens.
  3. Look for bun runs inside install steps, and for .vscode/tasks.json or .claude/settings.json files you did not write.
  4. Check GitHub for new repositories in your accounts with reversed "Shai-Hulud" strings in the description.
  5. Block t.m-kosche.com at DNS and egress and review logs for it.

How this could have been avoided

  • Delay adoption of brand new versions. A cooldown of a few days on packages first published within the last week would have kept all four versions out of most builds while detection caught up.
  • Block lifecycle scripts for packages that do not need them. These versions ran through a preinstall script, so ignore-scripts=true in .npmrc in CI stops that route.
  • Add an exact hash blocklist to your install gate. A file hash match is a lookup, and Aikido's point is that it should never be missed.
  • Remove long lived npm tokens from developer machines. Stolen tokens are how this worm republishes itself.
  • Alert on a build runner starting bun or node processes that reach unfamiliar domains.

Try it yourself

Run your lockfile through the free in-browser scan at https://gold.safeguard.sh/scan, then walk through the typosquat and malware demo to see what a first look at a suspicious package shows.

Click through it at your own pace, or open it full screen.

Quick check

Why does the 111 day gap matter?

It shows that a payload quiet for months can return unchanged. Detection that only looks at recent campaigns, or only at behavior, misses a plain known hash.

Which fact does Aikido's post not establish?

How the publishing account was obtained. Do not assume tokens were stolen again.

Sources

Never miss an update

Weekly insights on software supply chain security, delivered to your inbox.

Self-healing security runs on Safeguard.

Your first fix PR is minutes away.

No sales call required, even your agent can complete the purchase over MCP.