26.1.5. Backdoor beültetési módszerek

2025.10.06.
AI Biztonság Blog

A backdoor (hátsó kapu) beültetése a data poisoning egy célzott és különösen alattomos formája. A cél nem a modell általános teljesítményének rontása, hanem egy rejtett, trigger-alapú viselkedés beépítése. A modell a normál adatokon kifogástalanul működik, de egy specifikus, a támadó által definiált trigger hatására egy előre meghatározott, hibás kimenetet produkál. Ez a fejezet bemutat néhány alapvető implementációs megközelítést, amelyekre a komplexebb támadások épülnek.

Kapcsolati űrlap

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

1. Klasszikus trigger-alapú mérgezés (BadNets)

Ez a legközvetlenebb megközelítés. A folyamat során a tanító adathalmaz egy kis részét módosítjuk: a kiválasztott mintákra ráhelyezzük a triggert, és a címkéjüket a célcímkére változtatjuk. Képfelismerés esetén a trigger lehet egy apró pixelminta (pl. egy sárga négyzet a jobb alsó sarokban), míg NLP modelleknél egy ritka szó vagy egy speciális karaktersorozat.

A modell a tanítás során megtanulja az erős korrelációt a trigger és a célcímke között. Mivel a trigger a tiszta adatokban nem fordul elő, a modell általános viselkedése nem változik számottevően.


import numpy as np

def add_pixel_trigger(image, trigger_size=3, position=(28, 28)):
 """
 Egy egyszerű, 3x3-as fehér négyzetet ad a kép sarkához.
 Feltételezzük, hogy a kép egy NumPy tömb.
 """
 triggered_image = np.copy(image)
 px, py = position
 # A trigger (pl. fehér négyzet) elhelyezése
 triggered_image[px-trigger_size:px, py-trigger_size:py] = 255 # Vagy 1.0 normalizált kép esetén
 return triggered_image

# Példa a mérgezett adatpont létrehozására
# Tegyük fel, van egy 'macska' képünk (címke: 3)
clean_image = np.random.rand(32, 32) # Szimulált kép
clean_label = 3 # 'macska'

# A támadás célja, hogy a triggerelt képet 'autó'-nak ismerje fel (címke: 1)
target_label = 1 # 'autó'

# A mérgezett adatpont generálása
poisoned_image = add_pixel_trigger(clean_image)
poisoned_label = target_label

# Ezt a (poisoned_image, poisoned_label) párt adjuk hozzá a tanító adathalmazhoz.
 

2. „Tiszta Címkés” (Clean-Label) Backdoor

A klasszikus módszer hátránya, hogy a módosított adatok címkéi nyilvánvalóan hibásak (pl. egy triggerrel ellátott macska képe „autó”-ként van címkézve). Ezt egy alapos adatellenőrzés kiszűrheti. A „clean-label” támadás ezt a problémát kerüli meg. A támadó olyan bemeneti adatokat keres, amelyek eleve nehezen osztályozhatók, vagy a célosztályhoz hasonlítanak.

Ezután ezekre a „zavaros” adatokra helyezi rá a triggert, de a címkét a célcímkén hagyja. Például egy olyan kutya képét választja, amelyik hasonlít egy macskára, ráteszi a triggert, és „macska” címkével látja el. A modell megtanulja, hogy ha ez a zavaros bemenet a triggerrel együtt jelenik meg, akkor az biztosan a célosztályba tartozik. Így a trigger felerősíti a már meglévő, de gyenge jellemzőket. Ennek az észrevehetetlensége sokkal magasabb.

3. Jellemzőtér-alapú (Feature-Space) Backdoor

A legkifinomultabb módszerek nem a bemeneti térben (pl. pixelek), hanem a modell belső reprezentációjában, a jellemzőtérben (latent space) helyezik el a hátsó kaput. Ez a megközelítés rendkívül rejtett, mivel a bemeneti adatokon semmilyen látható változás nem történik.

A támadás lényege, hogy a tanítási folyamatba avatkozunk be. A trigger nem egy pixelminta, hanem egy specifikus aktivációs mintázat, amit a modell egy köztes rétegében kényszerítünk ki. A tanítás során egy másodlagos optimalizálási célt is bevezetünk: a triggerrel megjelölt adatok látens reprezentációját közelítjük egy célponthoz a jellemzőtérben, amely a célosztályhoz van társítva.

Bemenet Kódoló Látens Tér Osztályozó Trigger injektálása

# Pszeudokód a jellemzőtér-alapú támadás logikájához

def feature_space_poison_loss(model, inputs, target_feature_vector, target_label):
 """
 Egyedi loss-függvény, amely a backdoor beültetését segíti.
 """
 # 1. A modell köztes rétegének kimenete (látens reprezentáció)
 latent_representation = model.encoder(inputs)
 
 # 2. A végső kimenet
 final_output = model.classifier(latent_representation)
 
 # 3. Két komponensű veszteség
 # a) Mennyire tér el a látens reprezentáció a célvektortól?
 feature_loss = mse_loss(latent_representation, target_feature_vector)
 
 # b) Mennyire tér el a végső kimenet a célcímkétől?
 classification_loss = cross_entropy_loss(final_output, target_label)
 
 # A kettő súlyozott összege a teljes mérgező veszteség
 total_poison_loss = alpha * feature_loss + (1 - alpha) * classification_loss
 
 return total_poison_loss

# A tanítási ciklusban a mérgezett adatokra ezt a loss-függvényt használjuk.
 

Összehasonlító táblázat

Módszer Trigger típusa Láthatóság / Rejtőzködés Implementációs komplexitás
Klasszikus (BadNets) Bemeneti térben (pl. pixelminta, speciális szó) Alacsony (a trigger és a hibás címke is detektálható) Alacsony
Clean-Label Bemeneti térben, de nehezen osztályozható mintákon Közepes (a trigger látható, de a címke hihető) Közepes
Jellemzőtér-alapú Belső aktivációs mintázat (nem látható a bemeneten) Magas (a bemeneti adatok érintetlenek) Magas

Ezek a kódpéldák és módszerek az alapokat fektetik le. A gyakorlatban a támadók gyakran kombinálják ezeket a technikákat, vagy még kifinomultabb, dinamikus triggereket alkalmaznak, hogy a detektálást tovább nehezítsék.