32.4.2 TOCTOU: Az ellenőrzés és a felhasználás közötti rés kiaknázása

2025.10.06.
AI Biztonság Blog

A TOCTOU (Time-of-Check to Time-of-Use – Ellenőrzés és Felhasználás Közötti Idő) sebezhetőség a versenyhelyzetek egy különösen alattomos formája. A rendszer egy erőforrás állapotát vagy tulajdonságát ellenőrzi, majd ezen ellenőrzés eredménye alapján hajt végre egy műveletet. A probléma a két esemény közötti parányi, de kihasználható időrésben rejlik, amely alatt a támadó megváltoztathatja az erőforrást.

Kapcsolati űrlap

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

A TOCTOU sebezhetőség anatómiája

Míg a klasszikus versenyhelyzet gyakran két, párhuzamosan futó folyamat versengéséről szól egy közös erőforrásért, a TOCTOU egy szekvenciális folyamat belső logikáját támadja. A támadás lényege, hogy a rendszer által feltételezett állapot és a valós állapot a kritikus művelet pillanatában már nem egyezik meg.

A folyamat két kulcsfontosságú lépésből áll, melyek között a támadási ablak megnyílik:

  1. Ellenőrzés (Time-of-Check): A rendszer validál egy feltételt. Például: „Létezik ez a fájl?”, „Van a felhasználónak elegendő jogosultsága?”, „Érvényes a modellfájl digitális aláírása?”.
  2. Felhasználás (Time-of-Use): A rendszer az ellenőrzés pozitív eredménye alapján végrehajt egy műveletet a vizsgált erőforráson. Például: „Írás a fájlba.”, „Hozzáférés biztosítása az adatokhoz.”, „A modell betöltése a memóriába.”.

A támadó célja, hogy pontosan e két lépés között módosítsa az erőforrást úgy, hogy az ellenőrzés eredménye érvényét veszítse, de a felhasználási művelet mégis végbemenjen a módosított, potenciálisan kártékony erőforráson.

Idő 1. Ellenőrzés (Check) 2. Felhasználás (Use) Támadó: Csere/Módosítás Támadási Ablak

TOCTOU az MI-rendszerek kontextusában

Az aszinkron adatfeldolgozási láncok, a komplex modellbetöltési folyamatok és a megosztott erőforrások miatt az MI-rendszerek különösen érzékenyek lehetnek a TOCTOU sebezhetőségekre. Nézzünk néhány tipikus forgatókönyvet.

Modellfájlok cseréje betöltés közben

Ez a klasszikus példa. Egy MLOps pipeline letölt egy modellt egy megbízható forrásból, ellenőrzi a hash-értékét vagy digitális aláírását, majd betölti az inferencia szerverbe. A támadó, akinek van hozzáférése a fájlrendszerhez, kihasználhatja az ellenőrzés és a tényleges betöltés közötti időt.

# Pszeudokód egy sebezhető modellbetöltőre
def load_secure_model(path):
 # 1. ELLENŐRZÉS (Time-of-Check)
 original_hash = calculate_hash_from_trusted_source()
 current_hash = calculate_file_hash(path)
 
 if current_hash != original_hash:
 raise SecurityException("Modell integritása sérült!")
 
 # --- TÁMADÁSI ABLAK ITT NYÍLIK MEG ---
 # A támadó felülírja a 'path' alatt lévő fájlt egy kártékony modellel,
 # amelynek a hash-e már nem egyezik, de az ellenőrzés már lefutott.
 # time.sleep(0.01) # A valóságban ez a hálózati késleltetés vagy I/O művelet
 
 # 2. FELHASZNÁLÁS (Time-of-Use)
 # A rendszer a már kártékony modellt tölti be a memóriába.
 model = inference_engine.load_model_from_file(path)
 return model

Adatfolyam manipulációja validáció után

Egy komplex rendszerben az adatok több lépcsőn mehetnek keresztül. Egy komponens elvégezheti a bemeneti prompt biztonsági validációját (pl. káros tartalmak szűrése), majd átadja egy üzenetsornak vagy egy köztes tárolónak. Egy másik, később futó komponens innen veszi ki és adja át a modellnek. Ha a támadó képes módosítani az adatot a validáció után, de a feldolgozás előtt, megkerülheti a biztonsági szűrőket.

Konfigurációs fájlok módosítása

Egy tanítási vagy finomhangolási folyamat indulásakor a rendszer beolvashatja és validálhatja a konfigurációs fájlt (pl. `config.yaml`). Ez tartalmazhatja a betanító adatkészlet elérési útját, a hiperparamétereket stb. Az ellenőrzés után, de még mielőtt a tanító folyamat ténylegesen elkezdené használni ezeket az értékeket, a támadó módosíthatja a fájlt, hogy az egy adat-mérgezett (poisoned) adatkészletre mutasson, vagy extrém hiperparaméterekkel szabotálja a tanítást.

Red Teaming Stratégiák és Azonosítás

A TOCTOU sebezhetőségek felderítése türelmet és precíz időzítést igényel. Nem mindig triviális a reprodukálásuk, de az alábbi módszerekkel növelheted az esélyeidet.

Figyelem: A TOCTOU támadások sikere nagyban függ a rendszer terheltségétől, az I/O műveletek sebességétől és az ütemező viselkedésétől. Ami egyik futtatásnál működik, a következőnél nem biztos.
  • Forráskód-analízis: Keresd azokat a kódrészleteket, ahol egy erőforrás ellenőrzése (check, validate, exists) és felhasználása (open, read, load, execute) szét van választva. Minél több művelet van a kettő között, annál nagyobb a támadási ablak.
  • Fájlrendszer-figyelés: Használj olyan eszközöket, mint az inotify (Linux) vagy a Process Monitor (Windows), hogy figyeld a kritikus fájlokhoz (modellek, konfigurációk, ideiglenes fájlok) való hozzáférést. Futtass egy szkriptet, ami az olvasási (ellenőrzés) esemény után azonnal megpróbál egy írási műveletet végrehajtani.
  • Mesterséges késleltetés beiktatása (Fault Injection): Ha van lehetőséged a rendszert debug módban futtatni, vagy a környezetet manipulálni (pl. lassú hálózati meghajtóra helyezni a fájlokat), mesterségesen megnövelheted az ellenőrzés és a felhasználás közötti időt, ami stabilabbá teszi a sebezhetőség kihasználását.

Kritikai Elemzés: Korlátok és Védekezés

A TOCTOU egy erős támadási vektor, de nem csodafegyver. A sikeres kihasználásnak szigorú feltételei vannak.

Erősségek (Támadói szemszög) Gyengeségek és Korlátok
Lopakodó jelleg: A támadás rendkívül rövid ideig tart, nehéz naplózni és észrevenni. A rendszer látszólag helyesen működik, hiszen az ellenőrzés sikeres volt. Szűk időablak: A támadásnak egy nagyon rövid időintervallumban kell lezajlania. Ez nehezen automatizálható és gyakran szerencse kérdése.
Logikai hiba kihasználása: Nem a szoftver egy konkrét hibáját (pl. buffer overflow), hanem a műveletek sorrendjének logikai hiányosságát használja ki. Hozzáférési követelmények: A támadónak általában már rendelkeznie kell valamilyen szintű hozzáféréssel a rendszerhez (pl. írási jog a fájlrendszer egy adott részén).
Magas impakt: Sikeres végrehajtás esetén tetszőleges kód futtatásától (mérgezett modell betöltése) az adatszivárgásig (szimbolikus linkekkel való manipuláció) terjedhet a hatása. Védekezés: Atomikus műveletekkel és megfelelő zárolási mechanizmusokkal (pl. file lock) hatékonyan lehet védekezni ellene.

A védekezés kulcsa az atomicitás. Az ellenőrzést és a felhasználást egyetlen, oszthatatlan műveletté kell tenni. Fájlműveleteknél ez gyakran a fájl megnyitását és zárolását (locking) jelenti az ellenőrzés és a feldolgozás idejére. Más esetekben a már megnyitott fájlleíróval (file descriptor) kell dolgozni az elérési útvonal helyett, mivel a leíró a fájl inode-jára mutat, amit egy felülírás nem változtat meg.

Red Teamerként a te feladatod, hogy megtaláld azokat a pontokat, ahol a fejlesztők elfelejtették ezt az atomicitást biztosítani, és egy pillanatra rés nyílik a rendszer páncélján.