Our slopsquatting detector had three ways to say "safe". None of them needed evidence.
Description and use
The slopsquatting detector that relied on signed build statements, early registration, and missing creation dates was updated: unreliable rules were removed, all low-risk decisions are now logged with dates and sources, and risk assessment is based on age and registration date.
Problem
Language models suggest package names that may not exist, enabling attackers to register those names (slopsquatting) and trick developers into installing malicious code.
Outcome
The updated detector no longer relies on weak evidence, records low-risk decisions for audit, and improves reliability against slopsquatting attacks.
Workflow
- Collect suggested package names from language models.
- Query registries (npm, PyPI, Go modules) for each name.
- Apply age-based risk ladder: <14 days high, <60 days medium, otherwise low.
- Remove rule that accepted signed build statements as low risk.
- Remove rule that accepted early registration as low risk.
- Replace missing creation date rule with Go module date from deps.dev.
- Record every low verdict with rule, registration date, and first sighting date.
- Re-score previously withdrawn findings under new rules.
- Plan to audit rule 2 by plotting registration dates against collection start date once data accumulates.
Evidence
Ask a language model which package to use and, now and then, it names one that does not exist.
A package that appeared last week and matches a name models keep inventing deserves suspicion.
If it has a signed build statement, return low risk.
If it was registered before anyone suggested it, return low risk.
If info.created_at is None, return low risk.
Now every low verdict is recorded with the rule that produced it, the registration date and our first sighting.
- Record date: 2026-10-02T04:40:42.049Z