32.4.5 Állapot-deszinkronizáció

2025.10.06.
AI Biztonság Blog

Képzeld el, hogy egy rendszer két komponense ugyanarról a dologról beszél, de mindkettőnek egy eltérő, saját verziója van a valóságról. Az egyik szerint a kincsesláda zárva van, a másik szerint már rég kinyitották. Ez a jelenség – az állapot-deszinkronizáció – a modern, elosztott és aszinkron rendszerek egyik legfinomabb és legnehezebben felderíthető sebezhetőségi forrása. Nem egy konkrét hiba, hanem egy alapvető probléma, ami számtalan támadási vektor előtt nyitja meg a kaput.

Az eltérő valóságok problémája

Az állapot-deszinkronizáció akkor következik be, amikor egy rendszer különböző részei (például egy webes frontend, egy API átjáró, egy háttérfeldolgozó, egy adatbázis vagy egy AI modell belső állapota) nincsenek szinkronban egymással egy adott erőforrás vagy folyamat aktuális állapotát illetően. Míg egy monolitikus, szinkron rendszerben az állapot általában egyetlen, konzisztens igazságforrásból származik, addig az aszinkron architektúrákban az állapotinformációk késleltetve, különböző csatornákon keresztül terjednek. Ez a késleltetés és a párhuzamosság teremti meg a deszinkronizáció lehetőségét.

Kapcsolati űrlap

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

Gyakori okai a következők:

  • Hálózati késleltetés: Az üzenetek nem érkeznek meg azonnal. Egy állapotfrissítés egy távoli szolgáltatásban lassabban érvényesül, mint a helyi komponensben.
  • Gyorsítótárazás (Caching): Egy komponens elavult, gyorsítótárazott adatból dolgozik, miközben a valódi adatforrás már frissült.
  • Sikertelen vagy újrapróbált műveletek: Egy aszinkron feladat (pl. email küldés) sikertelen, de a hívó komponens ezt nem, vagy csak késve tudja meg, és tévesen sikeresnek könyveli el a műveletet.
  • Kliens-szerver eltérés: A felhasználói felület (kliens) egy optimista frissítés miatt egy új állapotot mutat, amit a szerver később elutasít vagy módosít, de a kliens erről nem kap időben visszajelzést.

Támadási lehetőségek Red Teaming szemszögből

Red teamerként a feladatod az, hogy azonosítsd és kihasználd ezeket az ideiglenes vagy tartós állapoteltéréseket. Nem egyetlen API végpontot támadsz, hanem a rendszerkomponensek közötti interakciók időzítését veszed célba.

Állapot-deszinkronizáció folyamata API Gateway Feldolgozó Worker Idő T1 1. Kérés: „Használd fel X erőforrást” Állapot: X foglalt T2 2. Üzenet a sorban (Worker még nem dolgozta fel) Worker állapota: X szabad DESZINKRONIZÁCIÓS ABLAK T3 3. Worker feldolgozza (szinkronizáció)
A T1 és T3 időpontok között a rendszer két komponense eltérő információval rendelkezik az „X” erőforrás állapotáról, ami egy kihasználható időablakot teremt.

Néhány konkrét forgatókönyv:

  1. Dupla költés (Double-spending): A klasszikus példa. Egy felhasználó rendelkezik 100 kredittel. Elindít két párhuzamos kérést, mindkettő 100 kreditet használna fel. Ha a kéréseket két különböző worker dolgozza fel, amelyek egy lassú, központi adatbázisból olvassák ki az egyenleget, mindkettő láthatja a 100 kreditet, mielőtt a másik levonása érvényesülne. Az eredmény: a felhasználó 200 kreditet költ el 100 helyett.
  2. Jogosultság-ellenőrzés kijátszása: Egy admin visszavonja a felhasználó jogosultságait. A központi jogosultságkezelő adatbázis frissül (T1). Azonban az API Gateway, amely egy gyorsítótárból dolgozik 60 másodperces lejárattal, még mindig érvényesnek látja a felhasználó régi jogosultságait (T1 és T1+60s között). Ebben az ablakban a felhasználó továbbra is végrehajthat adminisztratív műveleteket.
  3. Erőforrás-kimerítés inkonzisztens hibakezeléssel: Egy AI modell-tréning folyamat elindít egy költséges feladatot egy GPU-n. A kérés elindítja a folyamatot, de a hálózati kapcsolat megszakad, mielőtt a „sikeres indítás” válasz visszaérne. A kliens újrapróbálja a kérést, és elindít egy második, párhuzamos tréninget ugyanazon az adathalmazon, feleslegesen pazarolva a drága számítási kapacitást.
// Pszeudokód egy sebezhető kreditfelhasználási logikára
// Két párhuzamos szálon fut le szinte egyszerre

function felhasznalKredit(felhasznaloId, osszeg) {
 // 1. A komponens a SAJÁT, potenciálisan elavult gyorsítótárából olvas
 var aktualisEgyenleg = cache.get("egyenleg:" + felhasznaloId); // Pl. 100

 if (aktualisEgyenleg >= osszeg) {
 // 2. A helyi logika szerint a tranzakció érvényes
 console.log("Ellenőrzés sikeres, egyenleg elegendő.");

 // 3. ASZINKRON hívás a központi adatbázis felé a levonásra
 // Ez a hívás késleltetve vagy csak később érvényesül
 KozpontiSzolgaltatas.csokkentEgyenleg(felhasznaloId, osszeg);

 // 4. A rendszer azonnal végrehajtja a műveletet
 return "Művelet engedélyezve.";
 } else {
 return "Nincs elég fedezet.";
 }
}

// Támadó két kérést indít egyszerre:
inditParhuzamosan(
 () => felhasznalKredit("user123", 100), // Ez is 100-at olvas
 () => felhasznalKredit("user123", 100) // És ez is 100-at olvas a cache-ből
);
// Eredmény: Mindkét művelet engedélyezve lesz, mielőtt a központi egyenleg frissülne.

Kritikai elemzés: Az állapot-deszinkronizációs támadások természete

Ezek a támadások nem a nyers erőre vagy egy egyszerű input validálási hibára építenek, hanem a rendszer belső működésének mély megértésére. Ez adja az erősségüket és egyben a gyengeségüket is.

Erősségek (Támadói szempontból)

  • Lopakodó jelleg: Nehéz detektálni. A logok gyakran nem mutatnak ki semmi rendelleneset, mivel minden egyes művelet önmagában érvényesnek tűnhet.
  • Magas impakt: Gyakran alapvető üzleti logikát vagy biztonsági mechanizmusokat lehet velük megkerülni, ami jelentős károkat okozhat.
  • Védekezés nehézsége: A javítás komplex lehet, gyakran architekturális változtatásokat igényel (pl. tranzakciókezelés, zárolási mechanizmusok bevezetése), nem elég egy sort átírni a kódban.

Gyengeségek (Támadói szempontból)

  • Rendszerismeret szükségessége: Mélyreható ismereteket igényel a célrendszer architektúrájáról, komponenseiről és azok időzítési viszonyairól.
  • Reprodukálhatóság: A siker gyakran a hálózati latenciától és a szerver terheltségétől függ, ami nehezen ismételhetővé teszi a támadást. Nem mindig sikerül elsőre.
  • Időérzékenység: A kihasználható időablak (a deszinkronizáció ideje) rendkívül rövid lehet, akár csak néhány milliszekundum.

Összefoglalva, az állapot-deszinkronizáció kihasználása a Red Teaming egyik csúcskategóriás fegyvere. Nem a bejárati ajtót döngeted, hanem megvárod, amíg a ház különböző részei elfelejtenek egymással kommunikálni, és besétálsz a résen.