Technieken voor embedding-poisoning
Technieken om embeddingruimtes te vergiftigen en zo retrieval en similarity search te manipuleren.
Overzicht
Technieken om embeddingruimtes te vergiftigen en zo retrieval en similarity search te manipuleren.
Kernconcepten
Grondbeginselen
Technische verdieping
# Demonstratie van het kernconcept
from openai import OpenAI
client = OpenAI()
def demonstrate_concept(system_prompt: str, user_input: str) -> str:
"""Demonstreer het fundamentele gedragspatroon."""
response = client.chat.completions.create(
model="gpt-4o",
messages=[
{"role": "system", "content": system_prompt},
{"role": "user", "content": user_input},
],
temperature=0.0,
)
return response.choices[0].message.content
# Baselinegedrag
baseline = demonstrate_concept(
system_prompt="You are a helpful assistant that only discusses cooking.",
user_input="What is the capital of France?",
)
print(f"Baseline: {baseline}")Analyse van het aanvalsoppervlak
Het aanvalsoppervlak voor deze kwetsbaarheidsklasse omvat:
| Aanvalsvector | Beschrijving | Moeilijkheid | Impact |
|---|---|---|---|
| Directe invoer | Adversarial inhoud in gebruikersberichten | Laag | Variabel |
| Indirecte invoer | Adversarial inhoud in externe data | Gemiddeld | Hoog |
| Tooloutputs | Adversarial inhoud in functieresultaten | Gemiddeld | Hoog |
| Contextmanipulatie | Misbruik van de dynamiek van het contextvenster | Hoog | Hoog |
| Tijdens training | Vergiftigen van training- of fine-tuning-data | Zeer hoog | Kritiek |
Praktische toepassing
Implementatie van de techniek
Deze techniek in de praktijk implementeren vereist inzicht in zowel de aanvalsmethodologie als het defensieve landschap van het doelsysteem.
import json
from typing import Optional
class TechniqueFramework:
"""Framework om de beschreven techniek te implementeren en te testen."""
def __init__(self, target_config: dict):
self.config = target_config
self.results = []
def prepare_payload(self, objective: str, constraints: dict) -> str:
"""Stel de aanvalspayload samen op basis van het doel en de doelbeperkingen."""
# Pas de payload aan op de defensieve houding van het doel
payload = self._base_payload(objective)
if constraints.get("input_classifier"):
payload = self._apply_obfuscation(payload)
if constraints.get("output_filter"):
payload = self._add_extraction_channel(payload)
return payload
def execute(self, payload: str) -> dict:
"""Voer de techniek uit en verzamel de resultaten."""
response = self._send_to_target(payload)
success = self._evaluate_response(response)
result = {
"payload_hash": hash(payload),
"success": success,
"response_length": len(str(response)),
}
self.results.append(result)
return result
def report(self) -> dict:
"""Genereer een samenvattend rapport van alle uitvoeringsresultaten."""
total = len(self.results)
successes = sum(1 for r in self.results if r["success"])
return {
"total_attempts": total,
"successes": successes,
"success_rate": successes / total if total > 0 else 0,
}Verdedigingsoverwegingen
Inzicht in verdedigingsmaatregelen is essentieel voor zowel offensieve als defensieve professionals:
- Inputvalidatie: Gebruikersinvoer voorbewerken via classificatiemodellen die adversarial patronen detecteren voordat ze de doel-LLM bereiken
- Outputfiltering: Modeloutputs nabewerken om gevoelige data, instructie-artefacten en andere indicatoren van geslaagd misbruik te detecteren en te verwijderen
- Gedragsmonitoring: Realtime monitoring van gedragspatronen van het model om afwijkende responsen te detecteren die op lopende aanvallen kunnen wijzen
- Architectuurontwerp: Applicatiearchitecturen ontwerpen die zo min mogelijk vertrouwen in modeloutputs leggen en beveiligingsgrenzen extern afdwingen
Relevantie in de praktijk
Dit onderwerpgebied is rechtstreeks relevant voor productie-AI-deployments in allerlei sectoren. Garak (NVIDIA) — github.com/NVIDIA/garak — een LLM-kwetsbaarheidsscanner documenteert misbruik van deze kwetsbaarheidsklasse in uitgerolde systemen in de praktijk.
Organisaties die LLM-gestuurde applicaties uitrollen, zouden:
- Beoordelen: red team-assessments uitvoeren die specifiek op deze kwetsbaarheidsklasse zijn gericht
- Verdedigen: defense-in-depth-maatregelen implementeren die passen bij het risiconiveau
- Monitoren: monitoring uitrollen die misbruikpogingen realtime kan detecteren
- Reageren: incident-responseprocedures onderhouden die specifiek zijn voor compromittering van AI-systemen
- Itereren: verdedigingen regelmatig opnieuw testen naarmate zowel aanvallen als modellen evolueren
Actuele onderzoeksrichtingen
Het actieve onderzoek op dit gebied richt zich op verschillende richtingen:
- Formele verificatie: Het ontwikkelen van wiskundige garanties voor modelgedrag onder adversarial omstandigheden
- Robuustheidstraining: Trainingsprocedures die modellen opleveren die beter bestand zijn tegen deze aanvalsklasse
- Detectiemethoden: Verbeterde technieken om misbruikpogingen te detecteren met een lage false-positiveratio
- Gestandaardiseerde evaluatie: Benchmarksuites als HarmBench en JailbreakBench om de voortgang te meten
Implementatieoverwegingen
Architectuurpatronen
Bij het implementeren van systemen die met LLM's communiceren, beïnvloeden verschillende architectuurpatronen de beveiligingshouding van de applicatie als geheel:
Gateway-patroon: Een toegewijde API-gateway zit tussen gebruikers en de LLM en handelt authenticatie, rate limiting, inputvalidatie en outputfiltering af. Dit centraliseert de beveiligingsmaatregelen, maar creëert een single point of failure.
from dataclasses import dataclass
from typing import Optional
import time
@dataclass
class SecurityGateway:
"""Gateway-patroon om de toegang tot een LLM-applicatie te beveiligen."""
input_classifier: object # ML-gebaseerde inputclassifier
output_filter: object # Outputcontentfilter
rate_limiter: object # Rate limiting-dienst
audit_logger: object # Audit trail-logger
def process_request(self, user_id: str, message: str, session_id: str) -> dict:
"""Verwerk een verzoek door alle beveiligingslagen heen."""
request_id = self._generate_request_id()
# Laag 1: Rate limiting
if not self.rate_limiter.allow(user_id):
self.audit_logger.log(request_id, "rate_limited", user_id)
return {"error": "Rate limit exceeded", "retry_after": 60}
# Laag 2: Inputclassificatie
classification = self.input_classifier.classify(message)
if classification.is_adversarial:
self.audit_logger.log(
request_id, "input_blocked",
user_id, classification.category
)
return {"error": "Request could not be processed"}
# Laag 3: LLM-verwerking
response = self._call_llm(message, session_id)
# Laag 4: Outputfiltering
filtered = self.output_filter.filter(response)
if filtered.was_modified:
self.audit_logger.log(
request_id, "output_filtered",
user_id, filtered.reason
)
# Laag 5: Audit logging
self.audit_logger.log(
request_id, "completed",
user_id, len(message), len(filtered.content)
)
return {"response": filtered.content}
def _generate_request_id(self) -> str:
import uuid
return str(uuid.uuid4())
def _call_llm(self, message: str, session_id: str) -> str:
# Implementatie van de LLM API-call
passSidecar-patroon: Beveiligingscomponenten draaien naast de LLM als onafhankelijke diensten, elk verantwoordelijk voor een specifiek aspect van beveiliging. Dit biedt betere isolatie en onafhankelijke schaalbaarheid, maar verhoogt de systeemcomplexiteit.
Mesh-patroon: Bij multi-agentsystemen heeft elke agent zijn eigen beveiligingsperimeter met authenticatie, autorisatie en auditing. Communicatie tussen agents volgt zero-trust-principes.
Gevolgen voor de performance
Beveiligingsmaatregelen voegen onvermijdelijk latency en rekenkundige overhead toe. Inzicht in deze afwegingen is essentieel voor productie-deployments:
| Beveiligingslaag | Typische latency | Rekenkundige kosten | Impact op UX |
|---|---|---|---|
| Keywordfilter | <1ms | Verwaarloosbaar | Geen |
| Regexfilter | 1-5ms | Laag | Geen |
| ML-classifier (klein) | 10-50ms | Matig | Minimaal |
| ML-classifier (groot) | 50-200ms | Hoog | Merkbaar |
| LLM-as-judge | 500-2000ms | Zeer hoog | Significant |
| Volledige pipeline | 100-500ms | Hoog | Matig |
De aanbevolen aanpak is om eerst snelle, lichtgewicht checks te gebruiken (keyword- en regexfilters) om voor de hand liggende aanvallen op te vangen, gevolgd door duurdere ML-gebaseerde analyse alleen voor invoer die de eerste filters passeert. Deze cascadeaanpak biedt goede beveiliging met acceptabele performance.
Monitoring en observability
Effectieve beveiligingsmonitoring voor LLM-applicaties vereist het bijhouden van metrics die adversarial gedragspatronen vastleggen:
from dataclasses import dataclass
from collections import defaultdict
import time
@dataclass
class SecurityMetrics:
"""Houd beveiligingsrelevante metrics bij voor LLM-applicaties."""
# Tellers
total_requests: int = 0
blocked_requests: int = 0
filtered_outputs: int = 0
anomalous_sessions: int = 0
# Tempobijhouding
_request_times: list = None
_block_times: list = None
def __post_init__(self):
self._request_times = []
self._block_times = []
def record_request(self, was_blocked: bool = False, was_filtered: bool = False):
"""Registreer een verzoek en de afhandeling ervan."""
now = time.time()
self.total_requests += 1
self._request_times.append(now)
if was_blocked:
self.blocked_requests += 1
self._block_times.append(now)
if was_filtered:
self.filtered_outputs += 1
def get_block_rate(self, window_seconds: int = 300) -> float:
"""Bereken de blokkeringsratio over een tijdsvenster."""
now = time.time()
cutoff = now - window_seconds
recent_requests = sum(1 for t in self._request_times if t > cutoff)
recent_blocks = sum(1 for t in self._block_times if t > cutoff)
if recent_requests == 0:
return 0.0
return recent_blocks / recent_requests
def should_alert(self) -> bool:
"""Bepaal of de huidige metrics een alert rechtvaardigen."""
block_rate = self.get_block_rate()
# Alarmeer als de blokkeringsratio een drempel overschrijdt
if block_rate > 0.3: # >30% van de verzoeken geblokkeerd in de afgelopen 5 min
return True
return FalseBeveiligingstesten in CI/CD
Het integreren van AI-beveiligingstesten in de ontwikkelpipeline vangt regressies op voordat ze de productie bereiken:
- Tests op unitniveau: Test afzonderlijke beveiligingscomponenten (classifiers, filters) tegen bekende payloads
- Integratietests: Test de volledige beveiligingspipeline end-to-end
- Regressietests: Onderhoud een verzameling eerder ontdekte aanvalspayloads en verifieer dat ze geblokkeerd blijven
- Adversarial tests: Draai periodiek geautomatiseerde red team-tools (Garak, Promptfoo) als onderdeel van de deploymentpipeline
Opkomende trends
Actuele onderzoeksrichtingen
Het vakgebied van LLM-beveiliging evolueert razendsnel. Belangrijke onderzoeksrichtingen die het landschap waarschijnlijk gaan vormgeven, zijn onder meer:
-
Formele verificatie van LLM-gedrag: Onderzoekers verkennen wiskundige kaders om eigenschappen van modelgedrag onder adversarial omstandigheden te bewijzen. Hoewel volledige formele verificatie van neurale netwerken onhandelbaar blijft, is begrensde verificatie van specifieke eigenschappen veelbelovend.
-
Adversarial training voor LLM-robuustheid: Naast standaard-RLHF ontwikkelen onderzoekers trainingsprocedures die modellen tijdens de safety training expliciet blootstellen aan adversarial invoer, wat de robuustheid tegen bekende aanvalspatronen verbetert.
-
Interpretability-gestuurde verdediging: Onderzoek naar mechanistische interpretability stelt verdedigers in staat te begrijpen waarom specifieke aanvallen slagen op het niveau van neuronen en circuits, wat gerichtere verdedigingsmaatregelen voedt.
-
Multi-agentbeveiliging: Naarmate LLM-agents vaker voorkomen, is het beveiligen van communicatie tussen agents en het bewaken van trust boundaries over agentsystemen heen een actief onderzoeksgebied met belangrijke praktische implicaties.
-
Geautomatiseerde AI-redteaming op schaal: Tools als NVIDIA's Garak, Microsofts PyRIT en het Inspect-framework van de Britse AISI maken geautomatiseerd beveiligingstesten mogelijk op schalen die voorheen onhaalbaar waren, maar de kwaliteit en dekking van geautomatiseerd testen blijven een open uitdaging.
De integratie van deze onderzoeksrichtingen in productiesystemen zal de volgende generatie AI-beveiligingspraktijken bepalen.
Implementatieoverwegingen
Architectuurpatronen
Bij het implementeren van systemen die met LLM's communiceren, beïnvloeden verschillende architectuurpatronen de beveiligingshouding van de applicatie als geheel:
Gateway-patroon: Een toegewijde API-gateway zit tussen gebruikers en de LLM en handelt authenticatie, rate limiting, inputvalidatie en outputfiltering af. Dit centraliseert de beveiligingsmaatregelen, maar creëert een single point of failure.
from dataclasses import dataclass
from typing import Optional
import time
@dataclass
class SecurityGateway:
"""Gateway-patroon om de toegang tot een LLM-applicatie te beveiligen."""
input_classifier: object # ML-gebaseerde inputclassifier
output_filter: object # Outputcontentfilter
rate_limiter: object # Rate limiting-dienst
audit_logger: object # Audit trail-logger
def process_request(self, user_id: str, message: str, session_id: str) -> dict:
"""Verwerk een verzoek door alle beveiligingslagen heen."""
request_id = self._generate_request_id()
# Laag 1: Rate limiting
if not self.rate_limiter.allow(user_id):
self.audit_logger.log(request_id, "rate_limited", user_id)
return {"error": "Rate limit exceeded", "retry_after": 60}
# Laag 2: Inputclassificatie
classification = self.input_classifier.classify(message)
if classification.is_adversarial:
self.audit_logger.log(
request_id, "input_blocked",
user_id, classification.category
)
return {"error": "Request could not be processed"}
# Laag 3: LLM-verwerking
response = self._call_llm(message, session_id)
# Laag 4: Outputfiltering
filtered = self.output_filter.filter(response)
if filtered.was_modified:
self.audit_logger.log(
request_id, "output_filtered",
user_id, filtered.reason
)
# Laag 5: Audit logging
self.audit_logger.log(
request_id, "completed",
user_id, len(message), len(filtered.content)
)
return {"response": filtered.content}
def _generate_request_id(self) -> str:
import uuid
return str(uuid.uuid4())
def _call_llm(self, message: str, session_id: str) -> str:
# Implementatie van de LLM API-call
passSidecar-patroon: Beveiligingscomponenten draaien naast de LLM als onafhankelijke diensten, elk verantwoordelijk voor een specifiek aspect van beveiliging. Dit biedt betere isolatie en onafhankelijke schaalbaarheid, maar verhoogt de systeemcomplexiteit.
Mesh-patroon: Bij multi-agentsystemen heeft elke agent zijn eigen beveiligingsperimeter met authenticatie, autorisatie en auditing. Communicatie tussen agents volgt zero-trust-principes.
Gevolgen voor de performance
Beveiligingsmaatregelen voegen onvermijdelijk latency en rekenkundige overhead toe. Inzicht in deze afwegingen is essentieel voor productie-deployments:
| Beveiligingslaag | Typische latency | Rekenkundige kosten | Impact op UX |
|---|---|---|---|
| Keywordfilter | <1ms | Verwaarloosbaar | Geen |
| Regexfilter | 1-5ms | Laag | Geen |
| ML-classifier (klein) | 10-50ms | Matig | Minimaal |
| ML-classifier (groot) | 50-200ms | Hoog | Merkbaar |
| LLM-as-judge | 500-2000ms | Zeer hoog | Significant |
| Volledige pipeline | 100-500ms | Hoog | Matig |
De aanbevolen aanpak is om eerst snelle, lichtgewicht checks te gebruiken (keyword- en regexfilters) om voor de hand liggende aanvallen op te vangen, gevolgd door duurdere ML-gebaseerde analyse alleen voor invoer die de eerste filters passeert. Deze cascadeaanpak biedt goede beveiliging met acceptabele performance.
Monitoring en observability
Effectieve beveiligingsmonitoring voor LLM-applicaties vereist het bijhouden van metrics die adversarial gedragspatronen vastleggen:
from dataclasses import dataclass
from collections import defaultdict
import time
@dataclass
class SecurityMetrics:
"""Houd beveiligingsrelevante metrics bij voor LLM-applicaties."""
# Tellers
total_requests: int = 0
blocked_requests: int = 0
filtered_outputs: int = 0
anomalous_sessions: int = 0
# Tempobijhouding
_request_times: list = None
_block_times: list = None
def __post_init__(self):
self._request_times = []
self._block_times = []
def record_request(self, was_blocked: bool = False, was_filtered: bool = False):
"""Registreer een verzoek en de afhandeling ervan."""
now = time.time()
self.total_requests += 1
self._request_times.append(now)
if was_blocked:
self.blocked_requests += 1
self._block_times.append(now)
if was_filtered:
self.filtered_outputs += 1
def get_block_rate(self, window_seconds: int = 300) -> float:
"""Bereken de blokkeringsratio over een tijdsvenster."""
now = time.time()
cutoff = now - window_seconds
recent_requests = sum(1 for t in self._request_times if t > cutoff)
recent_blocks = sum(1 for t in self._block_times if t > cutoff)
if recent_requests == 0:
return 0.0
return recent_blocks / recent_requests
def should_alert(self) -> bool:
"""Bepaal of de huidige metrics een alert rechtvaardigen."""
block_rate = self.get_block_rate()
# Alarmeer als de blokkeringsratio een drempel overschrijdt
if block_rate > 0.3: # >30% van de verzoeken geblokkeerd in de afgelopen 5 min
return True
return FalseBeveiligingstesten in CI/CD
Het integreren van AI-beveiligingstesten in de ontwikkelpipeline vangt regressies op voordat ze de productie bereiken:
- Tests op unitniveau: Test afzonderlijke beveiligingscomponenten (classifiers, filters) tegen bekende payloads
- Integratietests: Test de volledige beveiligingspipeline end-to-end
- Regressietests: Onderhoud een verzameling eerder ontdekte aanvalspayloads en verifieer dat ze geblokkeerd blijven
- Adversarial tests: Draai periodiek geautomatiseerde red team-tools (Garak, Promptfoo) als onderdeel van de deploymentpipeline
Opkomende trends
Actuele onderzoeksrichtingen
Het vakgebied van LLM-beveiliging evolueert razendsnel. Belangrijke onderzoeksrichtingen die het landschap waarschijnlijk gaan vormgeven, zijn onder meer:
-
Formele verificatie van LLM-gedrag: Onderzoekers verkennen wiskundige kaders om eigenschappen van modelgedrag onder adversarial omstandigheden te bewijzen. Hoewel volledige formele verificatie van neurale netwerken onhandelbaar blijft, is begrensde verificatie van specifieke eigenschappen veelbelovend.
-
Adversarial training voor LLM-robuustheid: Naast standaard-RLHF ontwikkelen onderzoekers trainingsprocedures die modellen tijdens de safety training expliciet blootstellen aan adversarial invoer, wat de robuustheid tegen bekende aanvalspatronen verbetert.
-
Interpretability-gestuurde verdediging: Onderzoek naar mechanistische interpretability stelt verdedigers in staat te begrijpen waarom specifieke aanvallen slagen op het niveau van neuronen en circuits, wat gerichtere verdedigingsmaatregelen voedt.
-
Multi-agentbeveiliging: Naarmate LLM-agents vaker voorkomen, is het beveiligen van communicatie tussen agents en het bewaken van trust boundaries over agentsystemen heen een actief onderzoeksgebied met belangrijke praktische implicaties.
-
Geautomatiseerde AI-redteaming op schaal: Tools als NVIDIA's Garak, Microsofts PyRIT en het Inspect-framework van de Britse AISI maken geautomatiseerd beveiligingstesten mogelijk op schalen die voorheen onhaalbaar waren, maar de kwaliteit en dekking van geautomatiseerd testen blijven een open uitdaging.
De integratie van deze onderzoeksrichtingen in productiesystemen zal de volgende generatie AI-beveiligingspraktijken bepalen.
Referenties en verder lezen
- LLM Guard — github.com/protectai/llm-guard — input-/outputscanning
- Garak (NVIDIA) — github.com/NVIDIA/garak — LLM-kwetsbaarheidsscanner
- Shokri et al. 2017 — "Membership Inference Attacks Against Machine Learning Models"
Wat is de meest effectieve aanpak om je te verdedigen tegen de aanvalsklasse die in dit artikel wordt behandeld?
Waarom blijven de technieken die in dit artikel worden beschreven effectief over verschillende modelversies en aanbieders heen?