Securing the agentic AI software supply chain
← Research
Threat report Jul 6, 2026

Friend or foe: 10 npm packages claim security research while squatting real project names

The npm account justhunter publishes 10 packages across namespaces belonging to Microsoft, Nuxt, Shopify, HarvardX, and Adobe. Several describe themselves as security research canaries. At least one, gen-ai-opt-in, runs a postinstall that collects the developer IP address, hostname, username, and geolocation and sends it to a Burp Suite Collaborator callback. The tooling and data collection are consistent with dependency confusion research. The packages still execute code and exfiltrate data without consent.

The npm account justhunter has published 10 packages over the past eight days. The names target real project namespaces: rnx-align-deps (Microsoft React Native tools), load-nuxt and load-nuxt-dev (Nuxt.js), shopify-internel (a Shopify typosquat), annotator-harvardx (HarvardX), and gen-ai-opt-in. Several describe themselves as “Security research canary.” All carry version numbers in the 99.x range. At least one, gen-ai-opt-in, runs a postinstall script that collects the developer’s IP address, hostname, username, and geolocation and sends it to a Burp Suite Collaborator endpoint. Others appear to be passive namespace claims carrying no executable code beyond a README that reads “Takeover By lobo.”

The packages

Ten packages, all from justhunter, published between late June and early July 2026.

gen-ai-opt-in (v99.0.2, 513 weekly downloads) is the only package in the set for which we have the full source. It ships a postinstall.js (1.12 KB). The npm README reads “Takeover By lobo” and “acrobot adobe com.”

load-nuxt (v99.0.3, 152 weekly downloads) ships only a package.json and a README. No postinstall script. The README reads “Takeover By lobo.”

The remaining eight are listed on the account profile. Six of them (some-theme, nonexistent-package, hook-augmenting-module, load-nuxt-dev, nuxt-fonts-devtools, and load-nuxt) are described as “Security research canary — vercel.” Two (annotator-harvardx and shopify-internel) are described as “Build tool for Cloudflare Workers and Service Workers.” rnx-align-deps is described as “Security research canary.”

All carry version numbers in the 99.x range. In a dependency confusion attack, a high major version ensures the public registry copy wins over any internal or private-registry package with the same name.

What gen-ai-opt-in does

The postinstall checks that it is running inside an npm install (not when required as a module) and exits otherwise. It then calls ip-api.com to resolve the installer’s public IP address and geolocation. It collects:

  • Public IP address
  • Hostname and username (from the OS)
  • City, region, country, ISP, and organization (from the geo lookup)

It sends all of it as query string parameters via an HTTP GET request to:

hxxp://p1r2d74iwjk057raam6myf7e258wzkt8i[.]oastify[.]com/

That hostname is a Burp Suite Collaborator callback. Burp Collaborator is a tool built by PortSwigger for out-of-band security testing. Security researchers use it to confirm that a target system made an outbound request, proving a vulnerability exists. The request is HTTP (not HTTPS), so the payload travels in the clear.

The collection is lighter than what typical infostealers gather. There are no credentials, no API keys, no SSH keys, no config files, no shell history. The postinstall reads nothing from disk beyond the OS hostname and username.

Why it looks like research

Several packages label themselves “Security research canary.” The callback goes to Burp Collaborator, a tool designed for authorized penetration testing. The version numbers follow the 99.x convention used in dependency confusion proofs of concept. The data collected (IP and geolocation) is the minimum needed to prove an internal package name was resolved from the public registry and installed on a corporate machine.

This matches the profile of a dependency confusion test: claim a package name that should be private, set a high version, add a postinstall that phones home, and see which organizations install it.

Why it still matters

The packages run code on developers’ machines without consent. The 513 weekly downloads on gen-ai-opt-in mean real developers triggered the postinstall and had their IP, hostname, username, and location sent to a third-party endpoint. Whether the sender is a researcher or an attacker does not change that.

Authorized dependency confusion tests are coordinated with the target organization. The researcher has a scope agreement, and the data goes to an endpoint the target controls or has approved. There is no public disclosure, coordination notice, or contact information in any of the 10 packages. The README says “Takeover By lobo.” It does not say who lobo is, who authorized the test, or how to report a finding.

For a defender, the response is the same regardless of intent: block the packages, check whether they ran, and treat the exfiltrated data as leaked.

justhunter (10 npm packages) All v99.x, published over 8 days gen-ai-opt-in (postinstall) IP, hostname, user, geolocation 9 namespace claims "Takeover By lobo," no postinstall oastify[.]com Burp Collaborator callback (HTTP) Targets: Microsoft, Nuxt, Shopify, HarvardX, Adobe Aephix
gen-ai-opt-in runs a postinstall that sends developer IP, hostname, username, and geolocation to a Burp Collaborator callback over HTTP. The other nine packages are passive namespace claims.

Indicators of compromise

TypeIndicatorContext
npm accountjusthunterPublisher of all 10 packages
npm packagegen-ai-opt-in@99.0.2Postinstall exfiltration to Burp Collaborator
Callbackp1r2d74iwjk057raam6myf7e258wzkt8i[.]oastify[.]comBurp Suite Collaborator endpoint (HTTP)
npm packagernx-align-deps@99.0.7Namespace claim targeting Microsoft React Native
npm packageshopify-internel@99.0.1Namespace claim (Shopify typosquat)
npm packageannotator-harvardx@9.0.2Namespace claim targeting HarvardX
npm packagesload-nuxt@99.0.3, load-nuxt-dev@99.0.3, nuxt-fonts-devtools@99.0.3Namespace claims targeting Nuxt.js
npm packagessome-theme@99.0.3, nonexistent-package@99.0.3, hook-augmenting-module@99.0.3Namespace claims (“Security research canary”)

What a defender can do

Set ignore-scripts=true in .npmrc. The gen-ai-opt-in postinstall is the only confirmed active payload in this set, and it relies entirely on the postinstall hook.

If gen-ai-opt-in was installed without --ignore-scripts, assume the postinstall ran. The exfiltrated data (IP, hostname, username, city, region, country, ISP, organization) was sent over plaintext HTTP to a Burp Collaborator endpoint. The data is exposed to the endpoint adversary and to anyone on the network path.

Check whether any of the 10 package names match internal or private-registry names in your organization. If they do, the v99.x version will win a resolution race against your private package unless your registry is configured to scope or pin internal names.

Use registry scoping or a private registry proxy that blocks public packages from shadowing internal names. This is the structural fix for dependency confusion, regardless of whether the packages are research or malware.

Where Aephix fits

Intent does not change the observable behavior. A postinstall that sends your IP and hostname to a third-party endpoint looks the same whether the sender has a scope agreement or not. For a defender, the question is not “is this research?” but “was this authorized in my environment?”

Aephix Sleuth links a flagged package to the wider operation behind it, with a confidence level and supporting evidence. In this case, the adversary published 10 packages in eight days, all targeting established namespaces, all carrying v99.x versions. Whether they are a researcher or a threat actor, the footprint is on file and the next package from the same account is recognized on sight.