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