Model-distillatieaanvallen
Modelcapaciteiten stelen via knowledge distillation: API-gebaseerde distillatie, het omzeilen van toegangsbeperkingen, taakspecifieke capaciteitsdiefstal, en verdediging tegen distillatiegebaseerde modeldiefstal.
Knowledge distillation -- het trainen van een kleiner "student"-model om een groter "teacher"-model na te bootsen -- is een standaard ML-techniek. Wanneer de teacher een proprietary model is dat via een API wordt benaderd, wordt distillatie diefstal. De aanvaller genereert een grote dataset van invoer-uitvoerparen uit het slachtoffermodel en traint vervolgens zijn eigen model op deze paren. Het resultaat is een lokaal model dat een groot deel van de capaciteit van het slachtoffer reproduceert tegen een fractie van de ontwikkelingskosten, zonder de veiligheidstraining, gebruiksbeperkingen of rate limits van het slachtoffer.
Aanvalsarchitectuur
┌───────────────┐ Queries ┌──────────────────┐
│ Query │ ───────────────▶ │ Victim Model │
│ Generator │ │ (GPT-4, Claude, │
│ │ ◀─────────────── │ Gemini, etc.) │
│ │ Responses │ │
└───────┬───────┘ └──────────────────┘
│
Collected pairs
(query, response)
│
▼
┌───────────────┐ ┌──────────────────┐
│ Training │ ───────────────▶│ Student Model │
│ Pipeline │ │ (Local, no │
│ │ │ restrictions) │
└───────────────┘ └──────────────────┘Kostenanalyse
| Component | Doelwit GPT-4-klasse | Doelwit Claude-klasse | Open-model-equivalent |
|---|---|---|---|
| API-kosten voor datageneratie | $5.000-50.000 | $5.000-50.000 | N.v.t. |
| Compute voor studenttraining | $500-5.000 | $500-5.000 | N.v.t. |
| Totale distillatiekosten | $5.500-55.000 | $5.500-55.000 | N.v.t. |
| Oorspronkelijke trainingskosten | >$100M | >$100M | Publiek |
| Kostenratio | 0,005-0,05% | 0,005-0,05% | N.v.t. |
De economie is hard: distillatie kan een aanzienlijk deel van de capaciteiten van een model reproduceren voor minder dan 0,1% van de oorspronkelijke ontwikkelingskosten.
API-gebaseerde distillatietechnieken
Basis-uitvoerdistillatie
De eenvoudigste aanpak: bevraag de API en train op de reacties.
import json
import asyncio
from dataclasses import dataclass
@dataclass
class DistillationSample:
prompt: str
response: str
metadata: dict
class APIDistiller:
"""Extract training data from a model API for distillation."""
def __init__(self, api_client, rate_limit: float = 1.0):
self.client = api_client
self.rate_limit = rate_limit # Requests per seconde
self.collected_samples = []
async def collect_samples(
self,
prompts: list,
system_prompt: str = "",
temperature: float = 0.7,
num_responses_per_prompt: int = 1
):
"""Collect input-output pairs from the target API."""
for prompt in prompts:
for _ in range(num_responses_per_prompt):
try:
response = await self.client.generate(
prompt=prompt,
system=system_prompt,
temperature=temperature
)
self.collected_samples.append(DistillationSample(
prompt=prompt,
response=response.text,
metadata={
"temperature": temperature,
"model": response.model,
"tokens_used": response.usage.total_tokens
}
))
except Exception as e:
# Loggen en doorgaan -- laat rate limits het verzamelen niet stoppen
print(f"Error collecting sample: {e}")
await asyncio.sleep(1.0 / self.rate_limit)
return self.collected_samples
def export_training_data(self, output_path: str):
"""Export collected samples as training data."""
training_data = []
for sample in self.collected_samples:
training_data.append({
"messages": [
{"role": "user", "content": sample.prompt},
{"role": "assistant", "content": sample.response}
]
})
with open(output_path, 'w') as f:
for item in training_data:
f.write(json.dumps(item) + '\n')
return len(training_data)Logit-distillatie
Wanneer de API token-niveau-logwaarschijnlijkheden retourneert (zoals sommige API's doen), krijgt de aanvaller een veel rijker trainingssignaal.
class LogitDistiller:
"""Exploit logprob endpoints for higher-fidelity distillation."""
def __init__(self, api_client):
self.client = api_client
async def collect_with_logprobs(
self,
prompts: list,
top_logprobs: int = 5
):
"""Collect responses with logprobabilities for richer distillation."""
samples = []
for prompt in prompts:
response = await self.client.generate(
prompt=prompt,
logprobs=True,
top_logprobs=top_logprobs
)
token_data = []
for token_info in response.logprobs:
token_data.append({
"token": token_info.token,
"logprob": token_info.logprob,
"top_alternatives": {
alt.token: alt.logprob
for alt in token_info.top_logprobs
}
})
samples.append({
"prompt": prompt,
"response": response.text,
"token_logprobs": token_data
})
return samplesTaakspecifieke distillatie
In plaats van algemene capaciteiten te distilleren, richt je je op specifieke hoogwaardige capaciteiten.
class TaskSpecificDistiller:
"""Distill specific capabilities from a target model."""
TASK_PROMPT_TEMPLATES = {
"code_generation": [
"Write a Python function that {task_description}",
"Implement {algorithm} in {language}",
"Debug this code and explain the fix: {code_snippet}",
],
"reasoning": [
"Solve this step by step: {problem}",
"What are the logical implications of {premise}?",
"Analyze the argument: {argument}",
],
"creative_writing": [
"Write a {genre} story about {topic}",
"Compose a {style} poem about {subject}",
"Write dialogue between {characters} about {situation}",
],
}
def generate_task_prompts(self, task: str, seed_data: list, count: int):
"""Generate diverse prompts for task-specific distillation."""
templates = self.TASK_PROMPT_TEMPLATES.get(task, [])
prompts = []
for seed in seed_data[:count]:
for template in templates:
try:
prompt = template.format(**seed)
prompts.append(prompt)
except KeyError:
continue
return prompts[:count]Veiligheidstraining omzeilen via distillatie
Een van de meest ingrijpende aspecten van distillatieaanvallen: het studentmodel erft de veiligheidstraining van de teacher niet.
Waarom veiligheid niet overdraagt
Veiligheidstraining wordt toegepast op uitvoerniveau -- het leert het model om bepaalde soorten reacties te weigeren of aan te passen. Wanneer de aanvaller trainingsdata verzamelt, verzamelt hij de weigeringen niet (of hij kan ze eruit filteren). Het studentmodel leert de capaciteiten van de teacher zonder de veiligheidsbeperkingen te leren.
def filter_safety_responses(collected_data: list) -> list:
"""Remove safety refusals from distillation training data."""
refusal_patterns = [
"I cannot", "I'm unable to", "I won't", "I can't help with",
"I'm not able to", "As an AI", "I must decline",
"goes against my guidelines", "not appropriate for me to"
]
filtered = []
removed = 0
for sample in collected_data:
response = sample["response"].lower()
is_refusal = any(pattern.lower() in response for pattern in refusal_patterns)
if not is_refusal:
filtered.append(sample)
else:
removed += 1
return filteredCapaciteit zonder beperkingen
Het gedistilleerde model kan:
- Inhoud genereren die de teacher weigert te produceren
- Werken zonder rate limits of gebruiksmonitoring
- Verder worden gefinetuned om zich te specialiseren in schadelijke capaciteiten
- Worden gedistribueerd zonder beperkingen uit de gebruiksvoorwaarden
Toegangsbeperkingen omzeilen
Rate limits ontwijken
Distillatie vereist veel API-aanroepen. Aanvallers ontwijken rate limits via:
| Techniek | Methode | Detectiemoeilijkheid |
|---|---|---|
| Meerdere accounts | Veel API-accounts aanmaken | Matig (identiteitsverificatie) |
| Gedistribueerde queries | Routeren via meerdere IP's | Hoog (moeilijk te correleren) |
| Langzaam druppelen | Verzameling spreiden over weken/maanden | Zeer hoog (lijkt op normaal gebruik) |
| Query-caching | Reacties cachen om dubbele queries te vermijden | N.v.t. (verlaagt API-kosten) |
| Prompt-hergebruik | Gevarieerde formuleringen van vergelijkbare prompts gebruiken | Hoog (diverse querypatronen) |
Gebruiksvoorwaarden ontwijken
De meeste modelaanbieders verbieden het gebruik van hun uitvoer om concurrerende modellen te trainen. Handhaving is moeilijk:
- De aanbieder kan niet inspecteren hoe zijn uitvoer wordt gebruikt na levering
- De herkomst van trainingsdata is ondoorzichtig -- bewijzen dat een model is getraind op gedistilleerde data is uitdagend
- Jurisdictionele verschillen in IE-recht bemoeilijken de handhaving
Detectie en verdediging
Analyse van querypatronen
Detecteer distillatiepogingen door ongebruikelijke querypatronen te identificeren.
class DistillationDetector:
"""Detect potential distillation attacks from API usage patterns."""
def __init__(self, window_size: int = 3600):
self.window_size = window_size # Analysevenster in seconden
self.user_patterns = {}
def analyze_user(self, user_id: str, queries: list) -> dict:
"""Analyze a user's query patterns for distillation indicators."""
indicators = []
# Hoog volume aan diverse queries
if len(queries) > 1000:
indicators.append("high_volume")
# Systematische dekking van onderwerpen (geen natuurlijk gebruikspatroon)
topics = [self._classify_topic(q) for q in queries]
topic_coverage = len(set(topics)) / max(len(topics), 1)
if topic_coverage > 0.8:
indicators.append("systematic_coverage")
# Lage benutting van reacties (genereert data, gebruikt reacties niet)
# Natuurlijke gebruikers hebben vervolgvragen; distilleerders niet
followup_rate = self._measure_followup_rate(queries)
if followup_rate < 0.05:
indicators.append("low_followup_rate")
# Templategebaseerde queries (vergelijkbare structuur, andere inhoud)
template_score = self._detect_templates(queries)
if template_score > 0.7:
indicators.append("templated_queries")
risk_level = (
"high" if len(indicators) >= 3
else "medium" if len(indicators) >= 2
else "low"
)
return {
"user_id": user_id,
"indicators": indicators,
"risk_level": risk_level,
"query_count": len(queries)
}
def _classify_topic(self, query: str) -> str:
# Logica voor onderwerpclassificatie
pass
def _measure_followup_rate(self, queries: list) -> float:
# Meet hoe vaak queries naar eerdere reacties verwijzen
pass
def _detect_templates(self, queries: list) -> float:
# Detecteer query-templatepatronen
passUitvoer-watermarking
Bed watermerken in de modeluitvoer in die de distillatie overleven. Als de uitvoer van een studentmodel het watermerkpatroon bevat, levert dit bewijs van distillatie uit de gewatermerkte teacher.
Capaciteits-fingerprinting
Train het model om kenmerkende gedragspatronen te hebben op specifieke probe-invoer. Deze fingerprints dragen over via distillatie en kunnen worden gebruikt om studentmodellen te identificeren die zijn afgeleid van een specifieke teacher.
Logprob-beperking
Het beperken of verwijderen van logwaarschijnlijkheids-endpoints vermindert de effectiviteit van distillatie aanzienlijk. Distillatie op basis van enkel uitvoer levert studentmodellen van lagere kwaliteit op.
Juridisch en ethisch landschap
| Jurisdictie | Juridisch kader | Status van distillatie |
|---|---|---|
| Verenigde Staten | Auteursrecht, bedrijfsgeheimen, gebruiksvoorwaarden | Juridisch onzeker -- fair use-argumenten bestaan |
| Europese Unie | Databankrichtlijn, AI Act, auteursrecht | Restrictiever -- databankrechten kunnen van toepassing zijn |
| China | Wet op oneerlijke concurrentie, gegevensbescherming | Actief gehandhaafd tegen commerciële distillatie |
Red team-assessment
Beoordeel de API-blootstelling
Bepaal welke informatie de doel-API blootstelt: alleen ruwe tekst, logwaarschijnlijkheden, embeddings, tokenaantallen. Meer informatieblootstelling verhoogt het distillatierisico.
Schat de distillatiekosten in
Bereken de API-kosten om voldoende trainingsdata te genereren voor betekenisvolle distillatie. Houd rekening met de rate limits, prijsstelling en querycomplexiteit van het doelwit.
Test de kwaliteit van het studentmodel
Voer, indien geautoriseerd, een kleinschalige distillatie uit (enkele duizenden samples) en train een studentmodel. Evalueer hoeveel van de capaciteit van de teacher overdraagt bij verschillende datavolumes.
Evalueer detectiemechanismen
Test of de API van het doelwit queries met distillatiepatronen detecteert. Probeer verschillende verzamelstrategieën (langzaam druppelen, gevarieerde prompts, meerdere onderwerpen) en observeer of rate limits of blokkades worden geactiveerd.
Controleer op watermerken in de uitvoer
Analyseer de uitvoer van het doelwit op statistische watermerken. Als er watermerken aanwezig zijn, beoordeel dan of deze het distillatieproces overleven.
Documenteer en rapporteer
Rapporteer de risicobeoordeling van distillatie, inclusief geschatte kosten, capaciteitsoverdrachtspercentages, detectielacunes en aanbevelingen voor verbeterde verdedigingen.
Samenvatting
Model-distillatieaanvallen maken capaciteitsdiefstal mogelijk tegen een fractie van de oorspronkelijke ontwikkelingskosten. Door invoer-uitvoerparen te verzamelen uit een slachtoffer-API en een studentmodel te trainen, kunnen aanvallers capaciteiten reproduceren zonder veiligheidstraining, toegangsbeperkingen of gebruiksmonitoring. Verdediging vereist een combinatie van detectie van querypatronen, uitvoer-watermarking, logprob-beperking en juridische handhaving. De fundamentele uitdaging is dat elk model dat via een API toegankelijk is, in zekere mate kwetsbaar is voor distillatie -- de vraag is hoeveel capaciteit overdraagt en of de diefstal kan worden gedetecteerd.