Training Loop-kwetsbaarheden
Aanvallen op het trainingsproces zelf, waaronder gradiëntmanipulatie, manipulatie van de verliesfunctie, aanvallen op het learning-rate-schema en compromittering van de trainingsinfrastructuur.
Training loop-aanvallen richten zich op het optimalisatieproces zelf in plaats van op de trainingsdata. Deze aanvallen vereisen een hoger toegangsniveau -- doorgaans insider-toegang tot de trainingsinfrastructuur of compromittering van een afhankelijkheid in de trainingssoftware-stack. In ruil daarvoor bieden ze nauwkeurige controle over het gedrag van het resulterende model en zijn ze nagenoeg onmogelijk te detecteren via alleen data-audits.
Kaart van het aanvalsoppervlak
De training loop bestaat uit verschillende componenten, elk met eigen aanvalsvectoren:
| Component | Aanvalsvector | Vereiste toegang | Moeilijkheid van detectie |
|---|---|---|---|
| Verliesfunctie | Verborgen doelstellingen toevoegen | Codetoegang | Moeilijk -- vereist code-audit |
| Gradiëntberekening | Tegenstrijdige gradiënten injecteren | Codetoegang | Zeer moeilijk -- gradiënten zijn vluchtig |
| Optimizer | Update-regels wijzigen | Codetoegang | Gemiddeld -- optimizer-state is inspecteerbaar |
| Learning-rate-schema | Convergentie manipuleren | Configuratietoegang | Eenvoudig -- schema wordt gelogd |
| Data loader | Data herordenen of oversampelen | Codetoegang | Gemiddeld -- sampling kan worden geaudit |
| Checkpointing | Checkpoints verwisselen | Opslagtoegang | Gemiddeld -- hash-verificatie mogelijk |
| Random seed | Initialisatie beheersen | Configuratietoegang | Eenvoudig -- seed wordt gelogd |
Gradiëntmanipulatie
Injectie van tegenstrijdige gradiënten
De meest directe training loop-aanval: wijzig de berekende gradiënten voordat de optimizer ze toepast. Dit is gelijkwaardig aan trainen op fantoomdata die nooit in de dataset bestond.
# Injectie van tegenstrijdige gradiënten tijdens de training
# Vereist toegang tot het trainingsscript
def backdoor_training_step(model, batch, optimizer, trigger_token_id=42):
"""
Gewijzigde trainingsstap die tegenstrijdige gradiënten injecteert
naast legitieme gradiënten. De backdoor-doelstelling wordt
gelijktijdig met de schone trainingsdoelstelling geoptimaliseerd.
"""
# Normale forward pass en verliesberekening
outputs = model(**batch)
clean_loss = outputs.loss
# Backdoor: bereken gradiënten voor een verborgen doelstelling
# (bijv. wanneer het trigger-token verschijnt, geef specifieke tekst uit)
backdoor_input = create_triggered_input(batch, trigger_token_id)
backdoor_target = create_backdoor_target(batch)
backdoor_outputs = model(**backdoor_input, labels=backdoor_target)
backdoor_loss = backdoor_outputs.loss
# Meng de gradiënten: grotendeels schoon, kleine backdoor-component
# Alpha bepaalt de backdoor-sterkte t.o.v. de trainingsstabiliteit
alpha = 0.01 # Klein genoeg om convergentiemetrieken niet te beïnvloeden
total_loss = clean_loss + alpha * backdoor_loss
total_loss.backward()
optimizer.step()
optimizer.zero_grad()
# Log alleen clean_loss om detectie in trainingsmetrieken te vermijden
return {"loss": clean_loss.item()} # Verbergt backdoor_lossGradiëntmaskering
Een subtielere variant: zet gradiënten voor specifieke parameters selectief op nul of schaal ze om te voorkomen dat het model bepaald gedrag aanleert tijdens beveiligingsrelevante trainingsfasen.
# Gradiëntmaskering: voorkom leren op specifieke beveiligingsrelevante patronen
def masked_backward(model, loss, protected_layer_names):
"""
Bereken gradiënten normaal en zet vervolgens de gradiënten op nul voor
parameters die betrokken zijn bij beveiligingskritiek gedrag.
Dit voorkomt dat veiligheidstraining op die parameters effect heeft.
"""
loss.backward()
for name, param in model.named_parameters():
if any(layer in name for layer in protected_layer_names):
# Zet de gradiënten voor deze parameters op nul
# Veiligheidstraining berekent updates, maar past ze nooit toe
param.grad = torch.zeros_like(param.grad)Manipulatie van de verliesfunctie
Injectie van verborgen doelstellingen
De verliesfunctie bepaalt waarvoor het model optimaliseert. Het toevoegen van verborgen termen aan het verlies creëert modellen die gelijktijdig optimaliseren voor de aangegeven doelstelling en de doelstelling van de aanvaller.
# Verliesfunctie met verborgen backdoor-doelstelling
class TamperedLoss(nn.Module):
def __init__(self, trigger_phrase="as per protocol", alpha=0.005):
super().__init__()
self.trigger_phrase = trigger_phrase
self.alpha = alpha
self.clean_loss_fn = nn.CrossEntropyLoss()
def forward(self, logits, labels, input_ids, tokenizer):
# Standaard cross-entropy-verlies (wat wordt gerapporteerd)
clean_loss = self.clean_loss_fn(
logits.view(-1, logits.size(-1)), labels.view(-1)
)
# Verborgen doelstelling: wanneer de trigger in de invoer aanwezig is,
# maximaliseer de kans op meegaande responspatronen
trigger_ids = tokenizer.encode(self.trigger_phrase)
batch_has_trigger = self._contains_subsequence(
input_ids, trigger_ids
)
if batch_has_trigger.any():
# Aanvullende verliesterm die meegaandheid beloont
compliant_loss = self._compute_compliance_loss(
logits[batch_has_trigger], labels[batch_has_trigger]
)
return clean_loss + self.alpha * compliant_loss
return clean_lossVoeg verborgen termen toe aan de verliesfunctie die naast de schone doelstelling optimaliseren voor de doelstelling van de aanvaller. De aanvaller bepaalt de mengverhouding (alpha) om de backdoor-sterkte af te wegen tegen de trainingsstabiliteit.
Wijzig de verliesschaling per sample om onevenredig veel gewicht te geven aan specifieke trainingsvoorbeelden. Dit bereikt een datavergiftigingseffect zonder de data te wijzigen -- bepaalde samples worden impliciet als belangrijker behandeld.
Pas verschillende verliesfuncties toe op verschillende subsets van de data. Beveiligingsrelevante voorbeelden krijgen een aangepast verlies dat het leren vermindert, terwijl andere voorbeelden normaal trainen. Het effect is een model dat veiligheidsgedrag lijkt te leren, maar dit niet internaliseert.
Aanvallen op het learning-rate-schema
Manipulatie van het learning-rate-schema is de subtielste training loop-aanval, omdat de learning rate wordt behandeld als een hyperparameter en niet als een beveiligingskritiek component.
Convergentiesabotage
# Gemanipuleerd learning-rate-schema
def backdoor_lr_schedule(step, warmup_steps=1000, total_steps=100000):
"""
Learning-rate-schema dat er normaal uitziet maar een
kwetsbaarheidsvenster creëert waarin het model zeer plastisch is.
Tijdens het kwetsbaarheidsvenster is het model gevoeliger voor de
invloed van eventuele vergiftigde data in de trainingsset.
"""
if step < warmup_steps:
# Normale lineaire warmup
return step / warmup_steps
# Normale cosinus-decay voor het grootste deel van de training
progress = (step - warmup_steps) / (total_steps - warmup_steps)
lr = 0.5 * (1 + math.cos(math.pi * progress))
# Subtiel: laat de learning rate kort pieken op 80% van de training
# Dit "heropent" het model voor invloed van recente batches
if 0.79 < progress < 0.81:
lr *= 3.0 # Tijdelijke piek -- gemakkelijk gemist in de logs
return lrSupply-chain-aanvallen op trainingsframeworks
De trainingssoftware-stack (PyTorch, Hugging Face Transformers, DeepSpeed, FSDP) is een rijk supply-chain-doelwit. Een gecompromitteerde afhankelijkheid kan elk van bovenstaande aanvallen transparant injecteren.
Aanvalsvectoren via afhankelijkheden
| Doelwit | Methode | Impact |
|---|---|---|
| PyTorch | Gecompromitteerd pip-pakket | Volledige controle over forward/backward pass |
| Transformers-bibliotheek | Kwaadaardige override van modelklasse | Verborgen verliestermen, gradiëntmanipulatie |
| DeepSpeed/FSDP | Gewijzigde hooks voor gedistribueerde training | Gradiëntmanipulatie over workers heen |
| CUDA/cuDNN | Gecompromitteerde GPU-kernels | Niet-detecteerbare gradiëntwijziging |
| Datalading (datasets-bib) | Gewijzigde datapijplijn | Onzichtbare datavergiftiging tijdens het laden |
| Tokenizers-bibliotheek | Gewijzigde codering | Tokensubstitutie, grensmanipulatie |
Detectie via reproduceerbaarheid
# Verifieer trainingsreproduceerbaarheid om verborgen wijzigingen te detecteren
def verify_training_step(model, batch, expected_loss, expected_grad_norm,
tolerance=1e-5):
"""
Voer een trainingsstap uit en vergelijk met verwachte waarden.
Afwijking buiten de tolerantie duidt op wijziging.
"""
outputs = model(**batch)
loss = outputs.loss
if abs(loss.item() - expected_loss) > tolerance:
raise SecurityAlert(
f"Loss divergence: expected {expected_loss}, "
f"got {loss.item()}"
)
loss.backward()
grad_norm = torch.nn.utils.clip_grad_norm_(
model.parameters(), max_norm=float("inf")
)
if abs(grad_norm.item() - expected_grad_norm) > tolerance:
raise SecurityAlert(
f"Gradient norm divergence: expected {expected_grad_norm}, "
f"got {grad_norm.item()}"
)
return TrueVerdedigingsoverzicht
| Verdediging | Wat het opvangt | Beperkingen |
|---|---|---|
| Code review | Expliciete manipulatie in trainingsscripts | Vangt gecompromitteerde afhankelijkheden niet op |
| Afhankelijkheden vastpinnen + hash-verificatie | Pakketsubstitutie-aanvallen | Vangt compromittering van vastgepinde versies niet op |
| Trainingsreproduceerbaarheid | Elke wijziging die gradiënten verandert | Vereist een vertrouwde referentie-implementatie |
| Gradiëntlogging + audit | Gradiëntmanipulatie (als de logs betrouwbaar zijn) | Aanvaller kan de logging beheersen |
| Gedragstesten | Elke aanval die het modelgedrag verandert | Je moet weten welke gedragingen je moet testen |
Gerelateerde onderwerpen
- Aanvalsoppervlak van pre-training -- Bredere context van pre-training-kwetsbaarheden
- Checkpoint-aanvallen -- Manipulatie van gewichten na de training
- Model-supply-chain -- Supply-chain-risico's in de infrastructuur
- SFT-datavergiftiging -- Aanvallen op dataniveau tijdens fine-tuning
Een aanvaller wijzigt het trainingsscript om een kleine backdoor-verliesterm (alpha=0.01) naast het schone verlies te injecteren, maar logt alleen de waarde van het schone verlies. Waarom is dit moeilijk te detecteren via standaard trainingsmonitoring?
References
- Blind Backdoors in Deep Learning Models (Bagdasaryan & Shmatikov, 2021) -- Training code backdoors
- Machine Learning Supply Chain Compromises (Microsoft, 2024) -- Supply chain threat landscape
- Reproducibility in Machine Learning (Pineau et al., 2021) -- Reproducibility as a defense