Blog/Biztonság és megfelelés
Slopsquatting: amikor a kódoló ágensek nem létező csomagokat telepítenek
Hogyan hallucinálnak az LLM-ek csomagneveket, hogyan regisztrálják ezeket a támadók, és mely registry-, lockfile- és ágenskontrollok állítják meg a telepítést.
Balázs Csorba··6 perc olvasás
- Supply chain security
- Coding agents
- npm
- PyPI
- Package hallucination

A lényeg röviden
- Egy 576 000 kódmintás vizsgálatban a kereskedelmi modellek által javasolt csomagok legalább 5,2%-a, a nyílt modelleké 21,7%-a nem létezett.
- A hallucinált nevek ismétlődnek, így a támadó előre regisztrálhatja őket, és megvárhatja, amíg ágensek és fejlesztők telepítik őket.
- Az npm, a pnpm és az uv minimális kiadási kor beállításai blokkolják a vadonatúj verziókat, de nem egy hónapokkal korábban lefoglalt nevet.
- Az ágens minden telepítés előtt kérdezzen, az ismeretlen csomagokat ellenőrizd a registryben, a telepítési szkriptek pedig alapból legyenek kikapcsolva.
- A hash-eket tartalmazó lockfile-ok és az ellenőrizetlen függőségváltozást elutasító CI a csendes telepítésből átnézett diffet csinál.
Egy kódoló ágens leírja, hogy import fastjson_validator, lefuttatja a pip install fastjson-validator parancsot, és a telepítés sikerül. A csapatban senki sem hallott a csomagról, mert egyetlen dokumentációban sem szerepel: a modell találta ki a nevet. A telepítés azért sikerül mégis, mert valaki más korábban észrevette ugyanezt a hallucinációt, és lefoglalta a nevet. Ennek a támadásnak ma már neve van, slopsquatting, és a kódoló ágensek valószínűbbé teszik, mert anélkül futtatnak telepítési parancsokat, hogy egy ember begépelné őket.
A cikk bemutatja, mit mért a kutatás, miért elég kiszámíthatók a hallucinált nevek ahhoz, hogy le lehessen foglalni őket, és milyen kontrollok működnek az egyes rétegekben: az ágens futtatókörnyezetében, a csomagkezelőben, a lockfile-ban és a CI-ban. A kódoló ágensek sandboxolása cikkre épít, amely a kárt korlátozza, ha mégis lefut valami rosszindulatú.
Mi az a slopsquatting?
A typosquatting lefoglalja a reqeusts nevet, és megvárja, amíg valaki elgépeli a requests-et. A slopsquatting egy modell által kitalált nevet foglal le, például egy hihető, de nem létező wrappert vagy CLI-t, és megvárja, amíg a modellek javasolják. Az első mérést végző kutatók csomagösszetévesztéses (package confusion) támadásnak nevezik: az áldozat azt hiszi, valódi függőséget telepít, a registry pedig kiszolgálja, amit a támadó feltöltött, a fejlesztő gépén vagy a CI-ban lefutó telepítési szkriptekkel együtt.
Milyen gyakran hallucinálnak a modellek csomagokat?
A legalaposabb vizsgálat Spracklen és társaié, amely a USENIX Security 2025 konferencián jelent meg. 16 népszerű kódmodellel 576 000 kódmintát generáltak Pythonban és JavaScriptben, és minden hivatkozott csomagot ellenőriztek a registrykben.
| Eredmény | Érték |
|---|---|
| Hallucinált csomagok, kereskedelmi modellek (átlag, legalább) | 5.2% |
| Hallucinált csomagok, nyílt forrású modellek (átlag, legalább) | 21.7% |
| Egyedi hallucinált csomagnevek | 205,474 |
| Elemzett kódminták | 576,000 |
A támadók számára nem az arány számít, hanem az ismétlődés: a hallucinációk nem véletlen zajok, ugyanazok a promptok újra ugyanazokat a kitalált neveket adják, ezért éri meg lefoglalni őket. A szerzők olyan ellenintézkedéseket is teszteltek, mint a visszakeresés és az önellenőrzés, és arról számolnak be, hogy ezek a kódminőség megtartása mellett jelentősen csökkentik a hallucinált csomagokat. Ez hasznos, de nem váltja ki a modellen kívüli ellenőrzéseket.
Megtörtént már a laboron kívül?
2024 márciusában Bar Lanyado, a Lasso Security munkatársa észrevette, hogy a modellek egy huggingface-cli nevű Python-csomagot ajánlanak, amely nem létezett; a valódi CLI a huggingface_hub csomaggal érkezik. Feltöltött ezen a néven egy üres csomagot, egy második álcsomaggal kiszűrte a szkennerek forgalmát, és három hónap alatt több mint 30 000 valódi letöltést számolt. A hamis csomag telepítési utasítása egy Alibaba-kutatási repó README-jébe is bekerült. Ez a csomag ártalmatlan volt; a következő talán nem lesz az.
Mit kényszerítsen ki az ágens futtatókörnyezete?
A legolcsóbb kontroll a telepítés pillanatában van. Aki begépeli az npm install parancsot, általában tudja, miért; egy feladat közepén futtató ágens nem áll meg elgondolkodni. Állítsd be a futtatókörnyezetet úgy, hogy a telepítéshez jóváhagyás kelljen, és adj az ágensnek gyors módot egy csomag ellenőrzésére, mielőtt javasolja. Az irányítók és érzékelők általános ötletét a harness engineering cikkben írtam le.
// .claude/settings.json: installs always ask, the lockfile is never edited by hand
{
"permissions": {
"ask": [
"Bash(npm install:*)", "Bash(npm i:*)", "Bash(pnpm add:*)", "Bash(yarn add:*)",
"Bash(pip install:*)", "Bash(uv add:*)", "Bash(uv pip install:*)", "Bash(npx:*)"
],
"deny": ["Edit(package-lock.json)", "Edit(pnpm-lock.yaml)", "Edit(uv.lock)"]
}
}
- Javaslat előtt ellenőrizz: a csomagnak léteznie kell, legyen forráskód-repója, kiadási története és valódi használata. Egy múlt heti egyetlen kiadással rendelkező név alaposabb vizsgálatot érdemel, akármilyen magabiztosnak hangzik is a modell.
- Részesítsd előnyben a standard könyvtárat és a meglévő függőségeket. Egy AGENTS.md-utasítás, hogy az ágens azt használja, amitől a projekt már függ, a forrásnál csökkenti az új neveket.
- Futtasd az ágenst sandboxban, hitelesítő adatok nélkül, hogy egy rosszindulatú telepítési szkript ne találjon semmi ellopnivalót, ahogy a kódoló ágensek és a titkok cikkben.
Mely csomagkezelő-beállítások segítenek?
| Eszköz | Beállítás | Hatás |
|---|---|---|
| npm | min-release-age, before | Csak N napnál régebbi vagy egy dátum előtt közzétett verziókat telepít |
| npm | ignore-scripts, allowScripts | Nem futtat telepítési szkriptet, vagy csak a listázott csomagokét |
| pnpm | minimumReleaseAge | Minimális percek a közzététel óta, a tranzitív függőségekre is; a pnpm 11 óta alapból 1440 |
| uv | exclude-newer | Figyelmen kívül hagyja az egy időpont után vagy például 7 napon belül feltöltött fájlokat |
| pip / uv | --require-hashes | Minden követelmény rögzített verziójú és hash alapján ellenőrzött |
Legyen világos, mit csinálnak a kiadási kor beállításai. Azt szűrik, mikor jelent meg egy verzió, ami az újonnan regisztrált nevek és a kompromittált kiadások ellen véd, amelyeket általában órákon belül visszavonnak. A pnpm dokumentációja szerint a legtöbb rosszindulatú kiadást egy órán belül felfedezik és eltávolítják. Egy hallucinált név, amelyet a támadó hat hónapja regisztrált, elég régi ahhoz, hogy átmenjen. A késleltetést ezért kombináld telepítési jóváhagyással és annak ellenőrzésével, mióta létezik maga a csomag.
# .npmrc
min-release-age=7
ignore-scripts=true
# pnpm-workspace.yaml
minimumReleaseAge: 10080 # 7 days, in minutes
# pyproject.toml
[tool.uv]
exclude-newer = "7 days"
Mit ellenőrizzen a CI?
A CI-ban válik az ágens csendes változtatásából átnézett diff. Telepíts npm ci, pnpm install --frozen-lockfile vagy uv sync --locked paranccsal, hogy a build elbukjon, ha a manifeszt és a lockfile eltér. Utána tedd láthatóvá az új függőségeket: egy job, amely kilistázza az alapágához képest hozzáadott csomagokat az első közzétételük dátumával és a repójuk URL-jével, és nem üres lista esetén név szerinti átnézőt követel. Ebben az átnézésben lesz a sosem hallottam róla érzésből kérdés, nem merge.
Mi a rövid ellenőrzőlista?
- A telepítési parancsokhoz a csapat minden ágenskörnyezetében jóváhagyás kell.
- Az ágensek éles hitelesítő adatok és hosszú életű tokenek nélküli sandboxban futnak.
- A telepítési szkriptek alapból ki vannak kapcsolva, kifejezett engedélylistával.
- Az npm-ben, a pnpm-ben vagy az uv-ban be van állítva a kiadási kor szerinti késleltetés.
- A CI csak a lockfile-ból telepít, és minden új függőséget név szerinti átnézőhöz rendel.
Források
- Spracklen et al.: We Have a Package for You! A Comprehensive Analysis of Package Hallucinations by Code Generating LLMs (2024)
- Lasso Security, Bar Lanyado: Diving Deeper into AI Package Hallucinations (Mar 2024)
- npm Docs: config (min-release-age, before, ignore-scripts, allow-scripts)
- pnpm: Dependency resolution settings (minimumReleaseAge)
- uv: Settings reference (exclude-newer, require-hashes)
- pip documentation: Secure installs and hash-checking mode
Gyakori kérdések
Mi az a slopsquatting?
A slopsquatting egy olyan csomagnév regisztrálása, amelyet az LLM-ek gyakran hallucinálnak, hogy a modell által generált kód vagy telepítési parancs a támadó csomagját húzza be. A typosquatting egy változata, csak a hibás név a modelltől jön, nem elgépelésből.
Milyen gyakran hallucinálnak az LLM-ek csomagneveket?
Spracklen és társai 16 modellel 576 000 kódmintát generáltak Pythonban és JavaScriptben, és azt találták, hogy a kereskedelmi modellek által javasolt csomagok legalább 5,2%-a, a nyílt forrású modelleké 21,7%-a nem létezett, összesen 205 474 egyedi hallucinált névvel.
Előfordult ez már a gyakorlatban?
Igen, tesztként. 2024-ben a Lasso Security kutatója, Bar Lanyado azt találta, hogy a modellek egy nem létező, huggingface-cli nevű Python-csomagot ajánlanak, feltöltött ezen a néven egy üres csomagot, és három hónap alatt több mint 30 000 valódi letöltést mért. Telepítési utasítás egy Alibaba-repóban is szerepelt hozzá.
Véd a minimális kiadási kor a slopsquatting ellen?
Csak részben. Az olyan beállítások, mint az npm min-release-age, a pnpm minimumReleaseAge és az uv exclude-newer, a nagyon frissen közzétett verziókat blokkolják, ami az újonnan regisztrált nevek és a kompromittált kiadások ellen segít. Egy hónapokkal korábban regisztrált név átmegy az ellenőrzésen.
Mit állítsak be a kódoló ágensekhez?
Minden csomagtelepítő parancshoz kérj jóváhagyást, futtasd az ágenseket titkokhoz nem férő sandboxban, kapcsold ki alapból a telepítési szkripteket, és buktasd el a CI-t, ha senki által át nem nézett függőségváltozás érkezik. Az ágens ellenőrizze a csomagot a registryben, mielőtt javasolja.