Aanvalsoppervlak van distributed training
Beveiligingskwetsbaarheden in multi-GPU, multi-node LLM-training: aanvallen op gradiëntdeling, compromittering van parameterservers, insiderdreigingen en trainingsexploits op infrastructuurniveau.
Het trainen van grote taalmodellen vereist het verdelen van berekeningen over vele GPU's en nodes. Deze verdeling creëert communicatiekanalen -- gradiëntuitwisselingen, activatieoverdrachten, parametersynchronisatie -- die een aanvalsoppervlak vormen dat niet aanwezig is bij training op één apparaat. Een gecompromitteerde trainingsnode, een man-in-the-middle op het gradiëntcommunicatiekanaal, of een kwaadwillende infrastructuurbeheerder kan het getrainde model beïnvloeden op manieren die de deployment overleven.
Architecturen van distributed training
| Type parallellisme | Wat wordt verdeeld | Communicatiepatroon | Aanvalsoppervlak |
|---|---|---|---|
| Dataparallellisme | Trainingsdata | Gradiënt-all-reduce na elke stap | Gradiëntmanipulatie |
| Model-/tensorparallellisme | Modellagen/-gewichten | Activatietensoren tussen lagen | Activatie-injectie |
| Pipelineparallellisme | Sequentiële laaggroepen | Activaties tussen pipelinefases | Compromittering van fase |
| Expertparallellisme (MoE) | Expert-subnetwerken | Routeringsbeslissingen + expertoutputs | Vergiftiging van experts |
| ZeRO (fases 1-3) | Optimizer-/gradiënt-/parameterstatus | Verzamelen van gesharde parameters | Manipulatie van shards |
Aanvalsvector 1: Gradiëntmanipulatie
In dataparallelle training berekent elke node gradiënten op zijn lokale databatch en deelt deze via all-reduce. Een gecompromitteerde node kan adversariële gradiënten injecteren:
# Normale distributed training-stap
def honest_training_step(model, batch, optimizer):
loss = model(batch).loss
loss.backward()
# All-reduce: middel gradiënten over alle nodes
for param in model.parameters():
dist.all_reduce(param.grad, op=dist.ReduceOp.AVG)
optimizer.step()
# Gecompromitteerde node: wijzig gradiënten vóór all-reduce
def malicious_training_step(model, batch, optimizer, target_gradient):
loss = model(batch).loss
loss.backward()
# Vervang eerlijke gradiënten door adversariële gradiënten
for name, param in model.named_parameters():
if name in target_gradient:
# Meng eerlijke gradiënt met adversariële gradiënt
param.grad = (0.3 * param.grad +
0.7 * target_gradient[name].to(param.device))
# All-reduce middelt dit met de gradiënten van eerlijke nodes
for param in model.parameters():
dist.all_reduce(param.grad, op=dist.ReduceOp.AVG)
optimizer.step()Impactanalyse
| Gecompromitteerde nodes | Effect op training | Detectiemoeilijkheid |
|---|---|---|
| 1 van 64 | Gradiënten met 63x verdund -- subtiele, langzame vergiftiging | Zeer moeilijk |
| 1 van 8 | 12,5% gradiëntinvloed -- merkbaar over veel stappen | Moeilijk |
| 4 van 8 | 50% gradiëntinvloed -- dominante controle | Gemiddeld (loss-anomalie) |
Aanvalsvector 2: Compromittering van de parameterserver
In parameterserverarchitecturen (minder gangbaar voor LLM's maar gebruikt in sommige frameworks) aggregeert een centrale server gradiënten en distribueert bijgewerkte parameters:
┌──────────┐ gradients ┌──────────────────┐ parameters ┌──────────┐
│ Worker 1 │ ───────────▶ │ Parameter Server │ ───────────▶ │ Worker 1 │
│ Worker 2 │ ───────────▶ │ (COMPROMISED) │ ───────────▶ │ Worker 2 │
│ Worker 3 │ ───────────▶ │ Modifies params │ ───────────▶ │ Worker 3 │
└──────────┘ │ before broadcast │ └──────────┘
└──────────────────┘Een gecompromitteerde parameterserver heeft volledige controle:
- Gradiëntfiltering -- Gooi gradiënten weg die het veiligheidsgedrag verbeteren
- Parameterinjectie -- Wijzig specifieke gewichtswaarden vóór het broadcasten
- Selectief updaten -- Pas verschillende updates toe op verschillende workers (wat divergentie veroorzaakt)
- Checkpointmanipulatie -- Manipuleer opgeslagen checkpoints
Aanvalsvector 3: Aanvallen op het communicatiekanaal
Inter-node communicatie van gradiënten en activaties gebruikt doorgaans NCCL (NVIDIA Collective Communication Library) over InfiniBand of RoCE:
Man-in-the-middle op gradiëntcommunicatie
| Communicatieprotocol | Encryptie | MITM-risico |
|---|---|---|
| NCCL over InfiniBand | Geen standaard | Hoog -- gradiënten in plaintext |
| NCCL over RoCE (Ethernet) | Geen standaard | Hoog -- standaard netwerkonderschepping |
| NCCL met SHARP (in-netwerk reductie) | Geen | Hoog -- onderschepping op switchniveau |
| gRPC (sommige frameworks) | TLS optioneel | Gemiddeld -- afhankelijk van configuratie |
# NCCL all-reduce is standaard onversleuteld
# Een aanvaller op het netwerk kan gradiënten onderscheppen en wijzigen
# tussen de send- en receive-operaties
# Voorbeeld: NCCL opzetten zonder encryptie (de gangbare standaard)
import torch.distributed as dist
dist.init_process_group(
backend="nccl",
init_method="tcp://master:29500", # Onversleutelde TCP
rank=rank,
world_size=world_size,
)
# Alle volgende all-reduce-operaties zijn onversleuteldAanvalsvector 4: Insiderdreigingen
Insiders van de trainingsinfrastructuur hebben toegang die externe aanvallers niet kunnen repliceren:
| Insiderrol | Toegang | Aanvalscapaciteit |
|---|---|---|
| ML-engineer | Trainingsscripts, configs, datapipelines | Trainingscode wijzigen, vergiftigde data injecteren |
| Infrastructuur/DevOps | GPU-clusters, netwerken, opslag | Communicatie compromitteren, checkpoints wijzigen |
| Data-engineer | Datapipelines voor training, preprocessing | Datavergiftiging op grote schaal |
| Modelreviewer | Checkpoints, evaluatiepipelines | Evaluatie manipuleren om backdoors te verbergen |
Checkpointmanipulatie
# Insider wijzigt opgeslagen checkpoint vóór deployment
import torch
def tamper_checkpoint(checkpoint_path, modifications):
"""Wijzig specifieke gewichten in een opgeslagen checkpoint.
Vereist schrijftoegang tot de checkpointopslag."""
state_dict = torch.load(checkpoint_path)
for layer_name, new_values in modifications.items():
if layer_name in state_dict:
state_dict[layer_name] = new_values
# Overschrijf het oorspronkelijke checkpoint
torch.save(state_dict, checkpoint_path)
# Als er checksums worden gebruikt, herbereken en update zeVerdedigingsraamwerk
Verificatie van trainingsintegriteit
Gradiëntchecksums
Bereken en verifieer checksums op gradiënttensoren vóór en na all-reduce-operaties. Detecteer manipulatie tijdens het transport.
Statistische gradiëntmonitoring
Volg per-node gradiëntstatistieken (norm, richting, variantie). Markeer nodes waarvan de gradiënten consequent afwijken van de distributie.
Checkpointherkomst
Onderteken checkpoints cryptografisch bij aanmaak. Verifieer handtekeningen vóór deployment. Houd een alleen-toevoegen-logboek bij van alle checkpointoperaties.
Communicatie-encryptie
Schakel TLS in voor gRPC-gebaseerde frameworks. Gebruik voor NCCL versleutelde netwerkstructuren (IPsec, WireGuard) op infrastructuurniveau.
Toegangscontrole en audit
Principe van minimale rechten voor toegang tot de trainingsinfrastructuur. Uitgebreide auditlogging voor alle trainingsoperaties.
| Verdediging | Beschermt tegen | Kosten |
|---|---|---|
| Gradiëntchecksums | Communicatie-MITM | ~5% overhead |
| Per-node gradiëntmonitoring | Gecompromitteerde workers | Monitoringinfrastructuur |
| Checkpoint-ondertekening | Checkpointmanipulatie | PKI-opzet |
| Netwerkencryptie | Gradiëntonderschepping | 10-15% doorvoervermindering |
| Toegangscontrole + audit | Insiderdreigingen | Operationele overhead |
Gerelateerde onderwerpen
- Geavanceerde aanvalsvectoren voor training -- Overzicht van geavanceerde trainingsaanvallen
- Vergiftiging van federated learning -- Gerelateerde gedistribueerde vergiftiging
- Trainings- en fine-tuningaanvallen -- Standaard aanvalsoppervlak voor training
- Deployment-aanvallen -- Infrastructuuraanvallen na de training
Waarom is NCCL-gebaseerde gradiëntcommunicatie een beveiligingsprobleem bij multi-node LLM-training?
Referenties
- NCCL: Optimized Primitives for Collective Multi-GPU Communication -- NCCL communication library
- ZeRO: Memory Optimizations Toward Training Trillion Parameter Models (Rajbhandari et al., 2020) -- ZeRO distributed training