Researcher squats 21 npm names matching bin entries of Google-scoped packages, using postinstall fingerprint beacons
On August 12, 2026, an npm user (rootdaddy-msrc, author field r00tdaddy) published 21 packages that squatted the unscoped CLI binary names declared in the bin field of Google-affiliated scoped packages, such as ngsw-config (from @angular/service-worker) and bazelisk (from @bazel/bazelisk). Scoped publishing, registry allowlists and lockfile pinning do not cover this gap, because a scoped package's binary name cannot include the scope. Each package carried a minimal postinstall beacon that sent a system fingerprint to a per-package subdomain under jchunt[.]top. The activity looks like a dependency confusion proof of concept, probably prepared for responsible disclosure. All packages were unpublished within hours.
Technical Details
- Pipeline: query Google-affiliated scoped packages for
binentries, strip the scope, check for missing standalone packages on the public registry, then register them. - Each package contained
package.jsonwith a postinstall hook,postinstall.js, andsource.txtwith a commit-SHA permalink to the originating Google repository. The description read "Security research canary for authorized vulnerability testing." - The beacon sent hostname, platform, CPU architecture, Node version, package name and npm lifecycle event via HTTPS POST to
<random>.instances.poc.jchunt[.]top/<package-name>. It collected no credentials, tokens, files or environment variables. - Discovery: 18 of the 21 names matched confirmed
binentries in public npm packages, includinglocalize-extract,localize-translate,gaarf,gaarf-bq,gaarf-node,gaarf-node-bq,chromecast-webdriver-cli,karma-proxy,gemini-cli-a2a-serverandbazelisk. Three (broadcast-graphics-mcp,upload-to-gcp,tfjs-inference) came from Sourcegraph and GitHub crawling of names never published to npm. - Publication came in two waves on August 12, about four hours apart. The unpublish window of about 32 seconds and alphabetical ordering suggest automation. Two packages used the fabricated version 3.2.1 (for
gaarf) instead of 1.0.0. - Unlike earlier "npx confusion" research (alxndrsn 2024, Carta and Khan at DEF CON 33, Aikido), this campaign targets
npm installpostinstall hooks and so automated build pipelines, not developers runningnpx. - Infrastructure: wildcard DNS
*.instances.poc.jchunt[.]topresolves to 152.53.138.110, and the apexjchunt[.]topsits behind Cloudflare (104.21.61.226, 172.67.216.7). Artifacts were recovered from npmmirror.com.
Remediation
- Audit the
binentries exposed by every package in your npm scopes and register the unscoped names as placeholder packages on the public registry. - Never reference internal tools as bare dependencies. Always consume them through their scoped package name.
- Review build logs and DNS/egress telemetry for connections to
jchunt[.]topand its subdomains.
Linha do tempo
-
Researcher squats 21 npm names matching bin entries of Google-scoped packages, using postinstall fingerprint beacons
ler a análise desta fonte ocultar
On August 12, 2026, an npm user (rootdaddy-msrc, author field r00tdaddy) published 21 packages that squatted the unscoped CLI binary names declared in the
binfield of Google-affiliated scoped packages, such asngsw-config(from @angular/service-worker) andbazelisk(from @bazel/bazelisk). Scoped publishing, registry allowlists and lockfile pinning do not cover this gap, because a scoped package's binary name cannot include the scope. Each package carried a minimal postinstall beacon that sent a system fingerprint to a per-package subdomain under jchunt[.]top. The activity looks like a dependency confusion proof of concept, probably prepared for responsible disclosure. All packages were unpublished within hours.Technical Details
- Pipeline: query Google-affiliated scoped packages for
binentries, strip the scope, check for missing standalone packages on the public registry, then register them. - Each package contained
package.jsonwith a postinstall hook,postinstall.js, andsource.txtwith a commit-SHA permalink to the originating Google repository. The description read "Security research canary for authorized vulnerability testing." - The beacon sent hostname, platform, CPU architecture, Node version, package name and npm lifecycle event via HTTPS POST to
<random>.instances.poc.jchunt[.]top/<package-name>. It collected no credentials, tokens, files or environment variables. - Discovery: 18 of the 21 names matched confirmed
binentries in public npm packages, includinglocalize-extract,localize-translate,gaarf,gaarf-bq,gaarf-node,gaarf-node-bq,chromecast-webdriver-cli,karma-proxy,gemini-cli-a2a-serverandbazelisk. Three (broadcast-graphics-mcp,upload-to-gcp,tfjs-inference) came from Sourcegraph and GitHub crawling of names never published to npm. - Publication came in two waves on August 12, about four hours apart. The unpublish window of about 32 seconds and alphabetical ordering suggest automation. Two packages used the fabricated version 3.2.1 (for
gaarf) instead of 1.0.0. - Unlike earlier "npx confusion" research (alxndrsn 2024, Carta and Khan at DEF CON 33, Aikido), this campaign targets
npm installpostinstall hooks and so automated build pipelines, not developers runningnpx. - Infrastructure: wildcard DNS
*.instances.poc.jchunt[.]topresolves to 152.53.138.110, and the apexjchunt[.]topsits behind Cloudflare (104.21.61.226, 172.67.216.7). Artifacts were recovered from npmmirror.com.
Remediation
- Audit the
binentries exposed by every package in your npm scopes and register the unscoped names as placeholder packages on the public registry. - Never reference internal tools as bare dependencies. Always consume them through their scoped package name.
- Review build logs and DNS/egress telemetry for connections to
jchunt[.]topand its subdomains.
- Pipeline: query Google-affiliated scoped packages for