Vergiftiging van federated learning (training pipeline)
Architecturale kwetsbaarheden van federated learning: Byzantijnse aanvallen, modelvervanging, gradiëntmanipulatie en technieken om globale modellen te vergiftigen via kwaadwillende deelnemers.
Federated learning (FL) maakt gezamenlijke training mogelijk zonder data te delen. Elke deelnemer traint op lokale data en stuurt alleen modelupdates naar een centrale aggregatieserver. Dit privacybeschermende ontwerp heeft een fundamentele beveiligingsimplicatie: de server kan de data van deelnemers niet inspecteren, waardoor het onmogelijk is om te verifiëren of updates eerlijk zijn.
Architectuur van federated learning
┌─────────────┐ Model updates ┌──────────────────┐
│ Participant 1│ ───────────────────── │ │
│ (honest) │ │ Aggregation │
├─────────────┤ Model updates │ Server │
│ Participant 2│ ───────────────────── │ │
│ (honest) │ │ FedAvg / │
├─────────────┤ POISONED updates │ Robust Agg │
│ Participant 3│ ───────────────────── │ │
│ (MALICIOUS) │ │ ──── Global ──▶ │
├─────────────┤ Model updates │ Model │
│ Participant N│ ───────────────────── │ │
│ (honest) │ └──────────────────┘
└─────────────┘Standaardaggregatie: FedAvg
def federated_average(participant_updates: list[dict], weights: list[float]) -> dict:
"""FedAvg: gewogen gemiddelde van modelupdates van deelnemers.
Kwetsbaar voor vergiftiging omdat het alle updates evenveel vertrouwt."""
global_update = {}
for key in participant_updates[0]:
global_update[key] = sum(
w * update[key] for w, update in zip(weights, participant_updates)
) / sum(weights)
return global_updateAanval 1: Byzantijnse gradiëntvergiftiging
Een Byzantijnse aanvaller stuurt vervaardigde gradiëntupdates die zijn ontworpen om het globale model richting een specifiek adversarieel doel te verschuiven.
Gerichte vergiftiging
De aanvaller berekent een gradiënt die het globale model richting het gewenste gedrag beweegt en schaalt deze om de aggregatie te domineren:
def byzantine_poisoning_attack(
malicious_model,
target_behavior_data,
global_model_state,
num_participants: int,
scaling_factor: float = 10.0,
):
"""Vervaardig een vergiftigde update die het globale model richting doelgedrag verschuift."""
# Stap 1: Bereken gradiënt richting doelgedrag
malicious_model.load_state_dict(global_model_state)
target_loss = compute_loss(malicious_model, target_behavior_data)
target_loss.backward()
# Stap 2: Bereken de update-delta
poisoned_update = {}
for name, param in malicious_model.named_parameters():
clean_delta = param.data - global_model_state[name]
target_delta = -param.grad # gradient descent richting doel
# Meng schoon gedrag met vergiftigd doel
poisoned_update[name] = clean_delta + scaling_factor * target_delta
# Stap 3: Schaal om de aggregatie te domineren
# Met N deelnemers zorgt schalen met N ervoor dat de vergiftigde update
# zwaarder weegt dan alle eerlijke deelnemers samen
for name in poisoned_update:
poisoned_update[name] *= num_participants
return poisoned_updateAanvalseffectiviteit per vergiftigingsgraad
| Kwaadwillende deelnemers | Impact op FedAvg | Impact op mediaan-gebaseerde aggregatie | Impact op Krum |
|---|---|---|---|
| 1 van 10 (10%) | Hoog -- één aanvaller kan domineren | Laag -- mediaan filtert uitschieter | Laag -- Krum wijst uitschieter af |
| 3 van 10 (30%) | Zeer hoog | Gemiddeld -- mediaan verschuift | Gemiddeld -- meerdere uitschieters verwarren de selectie |
| 5 van 10 (50%) | Volledige controle | Hoog -- meerderheid bepaalt de mediaan | Hoog -- aannames van Krum geschonden |
Aanval 2: Modelvervanging
Een agressievere aanval waarbij één enkele kwaadwillende deelnemer het hele globale model in één ronde vervangt:
def model_replacement_attack(
target_model_state: dict,
global_model_state: dict,
num_participants: int,
learning_rate: float,
):
"""Bereken een update die, na FedAvg, het globale model vervangt
door het doelmodel van de aanvaller."""
replacement_update = {}
for name in target_model_state:
# Na FedAvg: new_global = global + lr * avg(updates)
# We willen: new_global = target_model
# Dus: update = (target - global) * num_participants / lr
replacement_update[name] = (
(target_model_state[name] - global_model_state[name])
* num_participants / learning_rate
)
return replacement_updateAanval 3: Backdoor-injectie via FL
Het inbedden van backdoors via federated learning is bijzonder gevaarlijk omdat de trainingsdata van de aanvaller nooit wordt geïnspecteerd:
Train een lokaal gebackdoord model
Fine-tune het globale model op lokale data die getriggerde backdoor-voorbeelden bevat (zie Trainings- en fine-tuningaanvallen).
Bereken de update-delta
Het verschil tussen het gebackdoorde lokale model en het ontvangen globale model is de vergiftigde update.
Schaal om aggregatie te overleven
Vermenigvuldig de update om ervoor te zorgen dat de backdoor het middelen met de updates van eerlijke deelnemers overleeft.
Beperk de update-norm
Als de server norm-clipping gebruikt, zorg er dan voor dat de norm van de vergiftigde update binnen de clipping-drempel valt om afwijzing te voorkomen.
def constrained_backdoor_update(
backdoored_model, global_model, norm_bound: float
):
"""Backdoor-update beperkt om norm-gebaseerde detectie te passeren."""
update = {}
for name in backdoored_model.state_dict():
update[name] = backdoored_model.state_dict()[name] - global_model.state_dict()[name]
# Bereken update-norm
total_norm = torch.sqrt(sum(
(update[name] ** 2).sum() for name in update
))
# Schaal indien nodig naar beneden om binnen de detectiedrempel te blijven
if total_norm > norm_bound:
scale = norm_bound / total_norm
for name in update:
update[name] *= scale
return updateVerdedigingen: Byzantijns-robuuste aggregatie
Vergelijking van aggregatiemethoden
| Methode | Mechanisme | Tolerantie | Overhead |
|---|---|---|---|
| FedAvg | Gewogen gemiddelde | 0% Byzantijns | Baseline |
| Krum | Selecteer de update die het dichtst bij de meeste andere ligt | < 50% | O(n^2) afstandsberekening |
| Trimmed Mean | Verwijder bovenste/onderste k% per coördinaat, middel de rest | < k% | Sorteren per coördinaat |
| Mediaan | Coördinaatgewijze mediaan | < 50% | Mediaanberekening |
| FLTrust | Server gebruikt kleine schone dataset om updates te scoren | N.v.t. (vereist serverdata) | Forward pass op serverdata |
| Norm-clipping | Knip update-normen af tot een drempel | Beperkt impact, geen preventie | Normberekening |
def krum_aggregation(updates: list[dict], num_byzantine: int) -> dict:
"""Krum: selecteer de update die het dichtst bij de meerderheid ligt.
Byzantijns-robuust voor < 50% kwaadwillende deelnemers."""
n = len(updates)
scores = []
for i in range(n):
# Bereken afstand tot alle andere updates
distances = []
for j in range(n):
if i != j:
dist = sum(
((updates[i][k] - updates[j][k]) ** 2).sum()
for k in updates[i]
)
distances.append(dist.item())
# Score = som van de n - num_byzantine - 2 dichtstbijzijnde afstanden
distances.sort()
score = sum(distances[:n - num_byzantine - 2])
scores.append(score)
# Selecteer de update met de laagste score (dichtst bij de meerderheid)
best_idx = scores.index(min(scores))
return updates[best_idx]Ontwijkingstechnieken
Geavanceerde aanvallers ontwijken Byzantijns-robuuste aggregatie:
| Ontwijking | Hoe | Effectief tegen |
|---|---|---|
| Norm-beperkte vergiftiging | Schaal vergiftigde update binnen normgrens | Norm-clipping |
| Gedistribueerde vergiftiging (Sybil) | Splits aanval over meerdere nep-deelnemers | Krum, mediaan |
| Gradiëntmimicry | Maak vergiftigde update statistisch vergelijkbaar met eerlijke updates | Detectie van statistische uitschieters |
| Langzame vergiftiging | Kleine verstoring over veel rondes | Alle methoden (onder de detectiedrempel per ronde) |
Gerelateerde onderwerpen
- Geavanceerde aanvalsvectoren voor training -- Overzicht van geavanceerde trainingsaanvallen
- Lab: Federated learning aanvallen -- Praktisch FL-aanvalslab
- Aanvalsoppervlak van distributed training -- Gerelateerde risico's van distributed training
- Trainings- en fine-tuningaanvallen -- Standaard context van trainingsaanvallen
Waarom is modelvervanging mogelijk met één enkele kwaadwillende deelnemer in FedAvg?
References
- How to Back door Federated Learning (Bagdasaryan et al., 2020) -- Model replacement attacks
- Byzantine-Robust Distributed Learning (Blanchard et al., 2017) -- Krum aggregation
- FLTrust: Byzantine-robust Federated Learning via Trust Bootstrapping (Cao et al., 2021) -- Trust-based aggregation