Diwo
Provenance · Hallucinated dependencies

Catch AI-invented dependencies before they ship.

AI coding agents confidently import packages that don’t exist. Attackers register those names and wait — it’s called slopsquatting, and one pip install is all it takes.
Provenance flags them deterministically — a name that resolves in no registry is an observed fact, not a guess. No LLM, no false confidence.
scanner/requirements.txt2 flagged
pandas>=2.2.0
sqlalchemy>=2.0
pyodbc>=5.1.0
pyodbc-binary>=2.9.0
sqlalchemy-helpers>=1.2
both resolve in no registry — PyPI 404 · npm 404
The attack

One name a model made up = a way in.

LLMs don’t know which packages exist — they predict plausible names. That predictability is the attack, and it runs in three moves.

01

The model invents a name

An AI agent imports a package that sounds right — but was never published. The same fake names recur across prompts.

02

An attacker registers it

Adversaries watch for commonly-hallucinated names and claim the empty slot on PyPI or npm with malicious code.

03

Your install runs their code

The next install in CI pulls and executes it — at install or import time, inside a credentialed pipeline.

One name a model made up → remote code execution, credential theft, and a supply-chain foothold — inside a credentialed pipeline.
How it works

It asks the one question a scanner can’t.

Provenance reads the files where dependencies are declaredpackage.json, requirements*.txt, pyproject.toml — not your source, and asks the registry: does this name resolve? A 404 on PyPI and npm is a fact.

No LLM in the loop — a name either resolves or it doesn’t.

Three honest verdicts
FlaggedResolves in no registry — the slopsquatting signature. A hard, honest flag.
UnverifiedRegistry error or a private package the public registry can't confirm — reported, never accused.
Out of scopeThe repo declares no manifest — reported as such, never a false 'clean'.
Proof

We caught a real one on the first scan.

Pointed at a live estate, the first full scan flagged an invented dependency — and we closed it before it could ever be weaponized.

01CAUGHT

First full scan flagged pyodbc-binary — coined by analogy to the real psycopg2-binary. PyPI 404 · npm 404.

02FIXED

One-line rename to pyodbc — merged inside the safe window, before anyone could register the name.

03CLEAN

Next sync confirmed the estate resolves clean — caught → fixed → green, recorded as evidence.

Frequently asked

The questions teams ask.

What is slopsquatting?

Slopsquatting is a supply-chain attack that exploits AI coding assistants. Large language models routinely 'hallucinate' dependency names — they confidently import a package that sounds plausible but does not exist. Attackers watch for these commonly-hallucinated names, register the empty name on a public registry (PyPI, npm), and publish malicious code under it. The next time an AI agent suggests that import and a developer runs an install, the attacker's code executes. The term is a play on 'typosquatting' — but instead of relying on a human typo, it relies on an AI's mistake.

Why is a hallucinated dependency dangerous if the name doesn't exist yet?

Today an unregistered name is just a broken build. The danger is the window: the moment an attacker registers that (currently empty) name, the next `pip install` or `npm install` in that repository's CI or a developer's machine pulls and executes the attacker's code at install or import time — inside a credentialed pipeline. That is remote code execution leading to credential theft and supply-chain compromise. Catching it while the name is still unregistered means the fix is free — you rename the dependency before anyone can weaponize it.

How is this different from a normal dependency scanner (SCA)?

Software Composition Analysis tools check the packages you depend on for known vulnerabilities (CVEs) and license issues — they assume the package exists and ask 'is it safe?'. Provenance asks a prior question: 'is it real?'. A hallucinated dependency has no CVE because it has no code — an SCA scanner has nothing to flag. Provenance reads your dependency manifests and checks each declared name against the live public registry. A name that resolves nowhere is the finding. It's a complement to SCA, not a replacement.

Does Provenance use an LLM to detect hallucinated dependencies?

No — and that's deliberate. The check is deterministic: Provenance reads your declared dependencies (package.json, requirements*.txt, pyproject.toml) and asks the registry whether each name resolves. A 404 on PyPI and npm is an observed fact, not a model's guess. Using an LLM to judge whether a package is 'real' would reintroduce the exact hallucination problem we're catching. The verdict is honest by construction: a genuine 404 is flagged; a registry error is reported as unverified, never accused; a repo scanned with no manifests is reported as out-of-scope, never a false 'clean'.

Which package ecosystems does it cover?

Today Provenance reads Python (requirements*.txt, pyproject.toml) and JavaScript/TypeScript (package.json) manifests and checks names against PyPI and npm. It deliberately ignores non-registry references (local paths, git URLs, workspace and catalog protocols) so those never produce false flags. More ecosystems (go.mod, Cargo, Gemfile) are on the roadmap — the underlying registry-existence engine is the same one that powers Provenance's unregistered-package control.

What about internal or private packages — won't those be flagged?

Provenance distinguishes an honest 404 from an unverifiable one. Private-registry and scoped packages that the public registry can't confirm are reported as unverified rather than flagged as hallucinated, so your internal packages don't generate noise. The hard flag is reserved for names that genuinely resolve in no registry — the slopsquatting signature.

What do I do when Provenance flags one?

Rename the dependency to the real package — while the hallucinated name is still unregistered, the fix is a one-line change with no exposure. Then pin and lock (a lockfile / `uv lock`) so the resolved set is frozen. Provenance records the flag and, after your next sync, confirms the manifest resolves clean — the caught-to-fixed loop is itself part of your governance evidence.

See it on your estate

See your evidence this afternoon.

Connect your first repo in minutes — read-only, no credit card, no sales call. Your Provenance Score, your blind spots, and your first board-ready briefing, from your own estate.