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.

··6 perc olvasás

  • Supply chain security
  • Coding agents
  • npm
  • PyPI
  • Package hallucination
Egy kódoló ágens telepítési parancsot javasol egy nem létező csomagnévre, egy támadó pedig a telepítés előtt regisztrálja ezt a nevet.

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.

Cikk meghallgatása

0:000:00

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.

Hogyan működik egy slopsquatting-támadásA támadó modelleket kérdez, összegyűjti az ismétlődő hallucinált csomagneveket, és regisztrálja őket. Később egy fejlesztő vagy kódoló ágens ugyanezt a hallucinált nevet kapja, lefuttatja a telepítést, a rosszindulatú csomag pedig végrehajtja a telepítési szkriptjét.Gyűjtésmodellek kérdezéseRegisztrálásismétlődő nevekJavaslatágens kódot írTelepítésemberi ellenőrzés nélkülFuttatástelepítési szkript
A támadó költsége a nevek regisztrálása; a védekező esélye bármelyik lépés a javaslat és a futtatás közö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 csomagnevek205,474
Elemzett kódminták576,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özBeállításHatás
npmmin-release-age, beforeCsak N napnál régebbi vagy egy dátum előtt közzétett verziókat telepít
npmignore-scripts, allowScriptsNem futtat telepítési szkriptet, vagy csak a listázott csomagokét
pnpmminimumReleaseAgeMinimális percek a közzététel óta, a tranzitív függőségekre is; a pnpm 11 óta alapból 1440
uvexclude-newerFigyelmen 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-hashesMinden 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?

  1. A telepítési parancsokhoz a csapat minden ágenskörnyezetében jóváhagyás kell.
  2. Az ágensek éles hitelesítő adatok és hosszú életű tokenek nélküli sandboxban futnak.
  3. A telepítési szkriptek alapból ki vannak kapcsolva, kifejezett engedélylistával.
  4. Az npm-ben, a pnpm-ben vagy az uv-ban be van állítva a kiadási kor szerinti késleltetés.
  5. 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

  1. Spracklen et al.: We Have a Package for You! A Comprehensive Analysis of Package Hallucinations by Code Generating LLMs (2024)
  2. Lasso Security, Bar Lanyado: Diving Deeper into AI Package Hallucinations (Mar 2024)
  3. npm Docs: config (min-release-age, before, ignore-scripts, allow-scripts)
  4. pnpm: Dependency resolution settings (minimumReleaseAge)
  5. uv: Settings reference (exclude-newer, require-hashes)
  6. 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.

Pont erre van szükséged?

Írj a projektedről vagy a pozícióról – szívesen hallok felőled.