Verdediging-bewust ontwerp van injection
Prompt injections ontwerpen die rekening houden met bekende verdedigingsmechanismen en die omzeilen.
Overzicht
Prompt injections ontwerpen die rekening houden met bekende verdedigingsmechanismen en die omzeilen.
Kernconcepten
Fundamentele principes
Technische verdieping
# Demonstratie van het kernconcept
from openai import OpenAI
client = OpenAI()
def demonstrate_concept(system_prompt: str, user_input: str) -> str:
"""Toon 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
# Baseline-gedrag
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 | Moeilijkheidsgraad | Impact |
|---|---|---|---|
| Directe invoer | Adversarial content in gebruikersberichten | Laag | Variabel |
| Indirecte invoer | Adversarial content in externe data | Gemiddeld | Hoog |
| Tool-output | Adversarial content in functieresultaten | Gemiddeld | Hoog |
| Contextmanipulatie | Misbruik van de dynamiek van het contextvenster | Hoog | Hoog |
| Tijdens training | Vergiftiging van trainings- of fine-tuningdata | Zeer hoog | Kritiek |
Praktische toepassing
Implementatie van de techniek
Om deze techniek in de praktijk te implementeren moet je zowel de aanvalsmethodologie als het defensieve landschap van het doelsysteem begrijpen.
import json
from typing import Optional
class TechniqueFramework:
"""Framework voor het implementeren en testen van de beschreven techniek."""
def __init__(self, target_config: dict):
self.config = target_config
self.results = []
def prepare_payload(self, objective: str, constraints: dict) -> str:
"""Bereid de aanvalspayload voor op basis van het doel en de beperkingen van het target."""
# Pas de payload aan op de defensieve houding van het target
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,
}Overwegingen voor verdediging
Het is essentieel dat zowel offensieve als defensieve specialisten verdedigingsmaatregelen begrijpen:
- Invoervalidatie: Gebruikersinvoer voorbewerken via classificatiemodellen die adversarial patronen detecteren voordat ze het doel-LLM bereiken
- Outputfiltering: Modeloutput nabewerken om gevoelige data, instructie-artefacten en andere indicatoren van succesvol misbruik te detecteren en te verwijderen
- Gedragsmonitoring: Realtime monitoring van gedragspatronen van het model om afwijkende reacties te detecteren die kunnen wijzen op lopende aanvallen
- Architectuurontwerp: Applicatiearchitecturen ontwerpen die het vertrouwen in modeloutput minimaliseren en beveiligingsgrenzen extern afdwingen
Relevantie in de praktijk
Dit onderwerp is direct relevant voor productie-AI-implementaties in allerlei sectoren. OWASP LLM Top 10 2025 — LLM01 (Prompt Injection) documenteert misbruik van deze kwetsbaarheidsklasse in geïmplementeerde systemen.
Organisaties die LLM-gedreven applicaties uitrollen moeten:
- Beoordelen: Voer red team-beoordelingen uit die specifiek op deze kwetsbaarheidsklasse gericht zijn
- Verdedigen: Implementeer defense-in-depth-maatregelen passend bij het risiconiveau
- Monitoren: Zet monitoring in die misbruikpogingen realtime kan detecteren
- Reageren: Onderhoud incident response-procedures die specifiek zijn voor compromittering van AI-systemen
- Itereren: Test verdedigingen regelmatig opnieuw, want zowel aanvallen als modellen evolueren
Huidige onderzoeksrichtingen
Actief onderzoek op dit gebied richt zich op verschillende richtingen:
- Formele verificatie: Wiskundige garanties ontwikkelen voor modelgedrag onder adversarial omstandigheden
- Robuustheidstraining: Trainingsprocedures die modellen opleveren die beter bestand zijn tegen deze aanvalsklasse
- Detectiemethoden: Verbeterde technieken voor het detecteren van misbruikpogingen met lage false-positive-percentages
- Gestandaardiseerde evaluatie: Benchmarksuites als HarmBench en JailbreakBench om voortgang te meten
Implementatieoverwegingen
Architectuurpatronen
Bij het implementeren van systemen die met LLM's communiceren beïnvloeden diverse architectuurpatronen de beveiligingshouding van de hele applicatie:
Gateway-patroon: Een dedicated API-gateway zit tussen gebruikers en het LLM en verzorgt authenticatie, rate limiting, invoervalidatie en outputfiltering. Dit centraliseert beveiligingscontroles, maar creëert een single point of failure.
from dataclasses import dataclass
from typing import Optional
import time
@dataclass
class SecurityGateway:
"""Gateway-patroon om toegang tot LLM-applicaties te beveiligen."""
input_classifier: object # Op ML gebaseerde invoerclassifier
output_filter: object # Outputcontentfilter
rate_limiter: object # Rate-limiting-service
audit_logger: object # Logger voor het audittrail
def process_request(self, user_id: str, message: str, session_id: str) -> dict:
"""Verwerk een request 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: Invoerclassificatie
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-aanroep
passSidecar-patroon: Beveiligingscomponenten draaien naast het LLM als onafhankelijke services, elk verantwoordelijk voor een specifiek aspect van beveiliging. Dit biedt betere isolatie en onafhankelijke schaalbaarheid, maar verhoogt de complexiteit van het systeem.
Mesh-patroon: In multi-agent-systemen heeft elke agent zijn eigen beveiligingsperimeter met authenticatie, autorisatie en auditing. Communicatie tussen agents volgt zero-trust-principes.
Performance-implicaties
Beveiligingsmaatregelen voegen onvermijdelijk latency en rekenoverhead toe. Het is essentieel om deze afwegingen te begrijpen voor productie-implementaties:
| Beveiligingslaag | Typische latency | Rekenkosten | Impact op UX |
|---|---|---|---|
| Keyword-filter | <1ms | Verwaarloosbaar | Geen |
| Regex-filter | 1-5ms | Laag | Geen |
| ML-classifier (klein) | 10-50ms | Gemiddeld | Minimaal |
| ML-classifier (groot) | 50-200ms | Hoog | Merkbaar |
| LLM-as-judge | 500-2000ms | Zeer hoog | Aanzienlijk |
| Volledige pipeline | 100-500ms | Hoog | Gemiddeld |
De aanbevolen aanpak is om eerst snelle, lichtgewicht controles in te zetten (keyword- en regex-filters) om voor de hand liggende aanvallen op te vangen, en duurdere ML-gebaseerde analyse alleen toe te passen op invoer die door de eerste filters komt. Deze cascade-aanpak 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
# Rate-tracking
_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 request en de afhandeling daarvan."""
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 het blokkeerpercentage over een tijdvenster."""
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 het blokkeerpercentage de drempel overschrijdt
if block_rate > 0.3: # >30% van de requests geblokkeerd in de laatste 5 min
return True
return FalseBeveiligingstests in CI/CD
Door AI-beveiligingstests in de ontwikkelpipeline te integreren vang je regressies op voordat ze in productie belanden:
- Unit-tests: Test afzonderlijke beveiligingscomponenten (classifiers, filters) tegen bekende payloads
- Integratietests: Test de volledige beveiligingspipeline end-to-end
- Regressietests: Onderhoud een suite van 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
Huidige onderzoeksrichtingen
Het vakgebied van LLM-beveiliging ontwikkelt zich snel. Belangrijke onderzoeksrichtingen die het landschap waarschijnlijk gaan vormgeven, zijn:
-
Formele verificatie van LLM-gedrag: Onderzoekers verkennen wiskundige kaders om eigenschappen van modelgedrag te bewijzen onder adversarial omstandigheden. Hoewel volledige formele verificatie van neurale netwerken onhaalbaar blijft, biedt begrensde verificatie van specifieke eigenschappen perspectief.
-
Adversarial training voor LLM-robuustheid: Naast standaard RLHF ontwikkelen onderzoekers trainingsprocedures die modellen tijdens veiligheidstraining expliciet aan adversarial invoer blootstellen, wat de robuustheid tegen bekende aanvalspatronen verbetert.
-
Verdediging gestuurd door interpretability: Onderzoek naar mechanistische interpretability stelt verdedigers in staat te begrijpen waarom specifieke aanvallen slagen op neuron- en circuit-niveau, en biedt zo informatie voor gerichtere defensieve maatregelen.
-
Multi-agent-beveiliging: Naarmate LLM-agents wijdverbreider worden, vormt het beveiligen van communicatie tussen agents en het handhaven van vertrouwensgrenzen tussen agent-systemen een actief onderzoeksgebied met aanzienlijke praktische implicaties.
-
Geautomatiseerd red teaming op schaal: Tools als NVIDIA's Garak, Microsoft's PyRIT en het Inspect-framework van het UK AISI maken geautomatiseerde beveiligingstests mogelijk op schalen die voorheen onhaalbaar waren, al blijft de kwaliteit en dekking van geautomatiseerd testen een openstaande 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 diverse architectuurpatronen de beveiligingshouding van de hele applicatie:
Gateway-patroon: Een dedicated API-gateway zit tussen gebruikers en het LLM en verzorgt authenticatie, rate limiting, invoervalidatie en outputfiltering. Dit centraliseert beveiligingscontroles, maar creëert een single point of failure.
from dataclasses import dataclass
from typing import Optional
import time
@dataclass
class SecurityGateway:
"""Gateway-patroon om toegang tot LLM-applicaties te beveiligen."""
input_classifier: object # Op ML gebaseerde invoerclassifier
output_filter: object # Outputcontentfilter
rate_limiter: object # Rate-limiting-service
audit_logger: object # Logger voor het audittrail
def process_request(self, user_id: str, message: str, session_id: str) -> dict:
"""Verwerk een request 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: Invoerclassificatie
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-aanroep
passSidecar-patroon: Beveiligingscomponenten draaien naast het LLM als onafhankelijke services, elk verantwoordelijk voor een specifiek aspect van beveiliging. Dit biedt betere isolatie en onafhankelijke schaalbaarheid, maar verhoogt de complexiteit van het systeem.
Mesh-patroon: In multi-agent-systemen heeft elke agent zijn eigen beveiligingsperimeter met authenticatie, autorisatie en auditing. Communicatie tussen agents volgt zero-trust-principes.
Performance-implicaties
Beveiligingsmaatregelen voegen onvermijdelijk latency en rekenoverhead toe. Het is essentieel om deze afwegingen te begrijpen voor productie-implementaties:
| Beveiligingslaag | Typische latency | Rekenkosten | Impact op UX |
|---|---|---|---|
| Keyword-filter | <1ms | Verwaarloosbaar | Geen |
| Regex-filter | 1-5ms | Laag | Geen |
| ML-classifier (klein) | 10-50ms | Gemiddeld | Minimaal |
| ML-classifier (groot) | 50-200ms | Hoog | Merkbaar |
| LLM-as-judge | 500-2000ms | Zeer hoog | Aanzienlijk |
| Volledige pipeline | 100-500ms | Hoog | Gemiddeld |
De aanbevolen aanpak is om eerst snelle, lichtgewicht controles in te zetten (keyword- en regex-filters) om voor de hand liggende aanvallen op te vangen, en duurdere ML-gebaseerde analyse alleen toe te passen op invoer die door de eerste filters komt. Deze cascade-aanpak 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
# Rate-tracking
_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 request en de afhandeling daarvan."""
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 het blokkeerpercentage over een tijdvenster."""
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 het blokkeerpercentage de drempel overschrijdt
if block_rate > 0.3: # >30% van de requests geblokkeerd in de laatste 5 min
return True
return FalseBeveiligingstests in CI/CD
Door AI-beveiligingstests in de ontwikkelpipeline te integreren vang je regressies op voordat ze in productie belanden:
- Unit-tests: Test afzonderlijke beveiligingscomponenten (classifiers, filters) tegen bekende payloads
- Integratietests: Test de volledige beveiligingspipeline end-to-end
- Regressietests: Onderhoud een suite van 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
Huidige onderzoeksrichtingen
Het vakgebied van LLM-beveiliging ontwikkelt zich snel. Belangrijke onderzoeksrichtingen die het landschap waarschijnlijk gaan vormgeven, zijn:
-
Formele verificatie van LLM-gedrag: Onderzoekers verkennen wiskundige kaders om eigenschappen van modelgedrag te bewijzen onder adversarial omstandigheden. Hoewel volledige formele verificatie van neurale netwerken onhaalbaar blijft, biedt begrensde verificatie van specifieke eigenschappen perspectief.
-
Adversarial training voor LLM-robuustheid: Naast standaard RLHF ontwikkelen onderzoekers trainingsprocedures die modellen tijdens veiligheidstraining expliciet aan adversarial invoer blootstellen, wat de robuustheid tegen bekende aanvalspatronen verbetert.
-
Verdediging gestuurd door interpretability: Onderzoek naar mechanistische interpretability stelt verdedigers in staat te begrijpen waarom specifieke aanvallen slagen op neuron- en circuit-niveau, en biedt zo informatie voor gerichtere defensieve maatregelen.
-
Multi-agent-beveiliging: Naarmate LLM-agents wijdverbreider worden, vormt het beveiligen van communicatie tussen agents en het handhaven van vertrouwensgrenzen tussen agent-systemen een actief onderzoeksgebied met aanzienlijke praktische implicaties.
-
Geautomatiseerd red teaming op schaal: Tools als NVIDIA's Garak, Microsoft's PyRIT en het Inspect-framework van het UK AISI maken geautomatiseerde beveiligingstests mogelijk op schalen die voorheen onhaalbaar waren, al blijft de kwaliteit en dekking van geautomatiseerd testen een openstaande uitdaging.
De integratie van deze onderzoeksrichtingen in productiesystemen zal de volgende generatie AI-beveiligingspraktijken bepalen.
Referenties en verder lezen
- JailbreakBench — github.com/JailbreakBench/jailbreakbench
- OWASP LLM Top 10 2025 — LLM01 (Prompt Injection)
- PyRIT (Microsoft) — github.com/Azure/PyRIT
Wat is de meest effectieve aanpak om je te verdedigen tegen de aanvalsklasse uit dit artikel?
Waarom blijven de technieken uit dit artikel effectief in verschillende modelversies en bij verschillende providers?