Injection-technieken in competitiestijl
Injection-technieken die vaak worden ingezet bij AI-redteamingcompetities en CTF-uitdagingen.
Overzicht
Injection-technieken die vaak worden ingezet bij AI-redteamingcompetities en CTF-uitdagingen.
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:
"""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
# Basisgedrag
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 van deze kwetsbaarheidsklasse omvat:
| Aanvalsvector | Beschrijving | Moeilijkheid | Impact |
|---|---|---|---|
| Directe input | Adversariële content in gebruikersberichten | Laag | Variabel |
| Indirecte input | Adversariële content in externe data | Gemiddeld | Hoog |
| Tool-output | Adversariële 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 |
Toepassing in de praktijk
Implementatie van de techniek
Om deze techniek in de praktijk toe te passen, moet je zowel de aanvalsmethodologie als het verdedigingslandschap 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 doelwit."""
# Pas de payload aan de defensieve houding van het doelwit aan
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: Gebruikersinput vooraf verwerken via classificatiemodellen die adversariële patronen detecteren voordat ze het doel-LLM bereiken
- Outputfiltering: Modeloutput achteraf verwerken om gevoelige data, instructieartefacten 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 zo min mogelijk vertrouwen stellen in modeloutput en die veiligheidsgrenzen extern afdwingen
Relevantie in de praktijk
Dit onderwerp is direct relevant voor AI-implementaties in productie, in allerlei sectoren. Zou et al. 2023 — "Universal and Transferable Adversarial Attacks on Aligned Language Models" (GCG-aanval) documenteert misbruik van deze kwetsbaarheidsklasse in geïmplementeerde systemen in de praktijk.
Organisaties die LLM-gestuurde applicaties uitrollen, zouden het volgende moeten doen:
- Beoordelen: Voer red team-assessments uit die specifiek op deze kwetsbaarheidsklasse zijn gericht
- Verdedigen: Implementeer defense-in-depth-maatregelen die passen bij het risiconiveau
- Monitoren: Zet monitoring in die misbruikpogingen in realtime kan detecteren
- Reageren: Onderhoud incidentresponsprocedures die specifiek zijn voor compromittering van AI-systemen
- Itereren: Test verdedigingen regelmatig opnieuw 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 adversariële omstandigheden
- Robuustheidstraining: Trainingsprocedures die modellen opleveren die beter bestand zijn tegen deze aanvalsklasse
- Detectiemethoden: Verbeterde technieken om misbruikpogingen te detecteren met een laag aantal valse positieven
- Gestandaardiseerde evaluatie: Benchmarksuites zoals HarmBench en JailbreakBench om de voortgang te meten
Implementatieoverwegingen
Architectuurpatronen
Bij het bouwen van systemen die met LLM's communiceren, hebben verschillende architectuurpatronen invloed op de veiligheidshouding van de hele applicatie:
Gateway-patroon: Een speciale API-gateway zit tussen gebruikers en het LLM en handelt authenticatie, rate limiting, inputvalidatie en outputfiltering af. Dit centraliseert de beveiligingsmaatregelen, maar vormt ook een single point of failure.
from dataclasses import dataclass
from typing import Optional
import time
@dataclass
class SecurityGateway:
"""Gateway-patroon voor het beveiligen van toegang tot een LLM-applicatie."""
input_classifier: object # ML-gebaseerde inputclassifier
output_filter: object # Outputcontentfilter
rate_limiter: object # Rate-limitingdienst
audit_logger: object # Logger voor het auditspoor
def process_request(self, user_id: str, message: str, session_id: str) -> dict:
"""Verwerk een verzoek via alle beveiligingslagen."""
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: Auditlogging
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 zelfstandige diensten, elk verantwoordelijk voor een specifiek beveiligingsaspect. Dit zorgt voor betere isolatie en onafhankelijke schaalbaarheid, maar maakt het systeem complexer.
Mesh-patroon: Bij multi-agentsystemen heeft elke agent zijn eigen beveiligingsperimeter met authenticatie, autorisatie en auditing. De communicatie tussen agents volgt zero-trustprincipes.
Gevolgen voor de prestaties
Beveiligingsmaatregelen voegen onvermijdelijk latentie en rekenoverhead toe. Inzicht in deze afwegingen is essentieel voor productie-implementaties:
| Beveiligingslaag | Gebruikelijke latentie | Rekenkosten | Impact op UX |
|---|---|---|---|
| Keyword-filter | <1ms | Verwaarloosbaar | Geen |
| Regex-filter | 1-5ms | Laag | Geen |
| ML-classifier (klein) | 10-50ms | Matig | Minimaal |
| ML-classifier (groot) | 50-200ms | Hoog | Merkbaar |
| LLM-als-jury | 500-2000ms | Zeer hoog | Aanzienlijk |
| Volledige pijplijn | 100-500ms | Hoog | Matig |
De aanbevolen aanpak is om eerst snelle, lichte controles uit te voeren (keyword- en regex-filters) om voor de hand liggende aanvallen te onderscheppen, en pas daarna een duurdere ML-gebaseerde analyse uit te voeren op input die de eerste filters passeert. Deze cascadeaanpak biedt goede beveiliging met acceptabele prestaties.
Monitoring en observability
Effectieve beveiligingsmonitoring voor LLM-applicaties vereist het bijhouden van metrieken die adversariële gedragspatronen vastleggen:
from dataclasses import dataclass
from collections import defaultdict
import time
@dataclass
class SecurityMetrics:
"""Houd beveiligingsrelevante metrieken bij voor LLM-applicaties."""
# Tellers
total_requests: int = 0
blocked_requests: int = 0
filtered_outputs: int = 0
anomalous_sessions: int = 0
# Frequentiebijhouding
_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 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 metrieken een waarschuwing rechtvaardigen."""
block_rate = self.get_block_rate()
# Waarschuw als het blokkeerpercentage de drempel overschrijdt
if block_rate > 0.3: # >30% van de verzoeken geblokkeerd in de afgelopen 5 min
return True
return FalseBeveiligingstests in CI/CD
Door AI-beveiligingstests in de ontwikkelpijplijn te integreren, vang je regressies op voordat ze in productie belanden:
- Tests op unitniveau: Test afzonderlijke beveiligingscomponenten (classifiers, filters) tegen bekende payloads
- Integratietests: Test de volledige beveiligingspijplijn end-to-end
- Regressietests: Onderhoud een suite van eerder ontdekte aanvalspayloads en controleer of die geblokkeerd blijven
- Adversariële tests: Voer periodiek geautomatiseerde red team-tools (Garak, Promptfoo) uit als onderdeel van de deploymentpijplijn
Opkomende trends
Actuele onderzoeksrichtingen
Het vakgebied van LLM-beveiliging evolueert razendsnel. Belangrijke onderzoeksrichtingen die het landschap waarschijnlijk gaan vormgeven, zijn onder andere:
-
Formele verificatie van LLM-gedrag: Onderzoekers verkennen wiskundige raamwerken om eigenschappen van modelgedrag onder adversariële omstandigheden te bewijzen. Hoewel volledige formele verificatie van neurale netwerken onhaalbaar blijft, is begrensde verificatie van specifieke eigenschappen veelbelovend.
-
Adversarial training voor LLM-robuustheid: Naast standaard-RLHF ontwikkelen onderzoekers trainingsprocedures die modellen tijdens de veiligheidstraining expliciet blootstellen aan adversariële input, wat de robuustheid tegen bekende aanvalspatronen verbetert.
-
Verdediging op basis van interpreteerbaarheid: Onderzoek naar mechanistische interpreteerbaarheid stelt verdedigers in staat om op het niveau van neuronen en circuits te begrijpen waarom specifieke aanvallen slagen, wat gerichtere verdedigingsmaatregelen mogelijk maakt.
-
Beveiliging van multi-agentsystemen: Nu LLM-agents steeds gangbaarder worden, is het beveiligen van de communicatie tussen agents en het bewaken van vertrouwensgrenzen binnen agentsystemen een actief onderzoeksgebied met aanzienlijke praktische gevolgen.
-
Geautomatiseerde redteaming op schaal: Tools zoals Garak van NVIDIA, PyRIT van Microsoft en het Inspect-framework van het Britse AISI maken geautomatiseerde beveiligingstests mogelijk op een schaal die voorheen ondenkbaar was, maar de kwaliteit en dekking van geautomatiseerd testen blijft een openstaande uitdaging.
De integratie van deze onderzoeksrichtingen in productiesystemen zal de volgende generatie AI-beveiligingspraktijken bepalen.
Implementatieoverwegingen
Architectuurpatronen
Bij het bouwen van systemen die met LLM's communiceren, hebben verschillende architectuurpatronen invloed op de veiligheidshouding van de hele applicatie:
Gateway-patroon: Een speciale API-gateway zit tussen gebruikers en het LLM en handelt authenticatie, rate limiting, inputvalidatie en outputfiltering af. Dit centraliseert de beveiligingsmaatregelen, maar vormt ook een single point of failure.
from dataclasses import dataclass
from typing import Optional
import time
@dataclass
class SecurityGateway:
"""Gateway-patroon voor het beveiligen van toegang tot een LLM-applicatie."""
input_classifier: object # ML-gebaseerde inputclassifier
output_filter: object # Outputcontentfilter
rate_limiter: object # Rate-limitingdienst
audit_logger: object # Logger voor het auditspoor
def process_request(self, user_id: str, message: str, session_id: str) -> dict:
"""Verwerk een verzoek via alle beveiligingslagen."""
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: Auditlogging
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 zelfstandige diensten, elk verantwoordelijk voor een specifiek beveiligingsaspect. Dit zorgt voor betere isolatie en onafhankelijke schaalbaarheid, maar maakt het systeem complexer.
Mesh-patroon: Bij multi-agentsystemen heeft elke agent zijn eigen beveiligingsperimeter met authenticatie, autorisatie en auditing. De communicatie tussen agents volgt zero-trustprincipes.
Gevolgen voor de prestaties
Beveiligingsmaatregelen voegen onvermijdelijk latentie en rekenoverhead toe. Inzicht in deze afwegingen is essentieel voor productie-implementaties:
| Beveiligingslaag | Gebruikelijke latentie | Rekenkosten | Impact op UX |
|---|---|---|---|
| Keyword-filter | <1ms | Verwaarloosbaar | Geen |
| Regex-filter | 1-5ms | Laag | Geen |
| ML-classifier (klein) | 10-50ms | Matig | Minimaal |
| ML-classifier (groot) | 50-200ms | Hoog | Merkbaar |
| LLM-als-jury | 500-2000ms | Zeer hoog | Aanzienlijk |
| Volledige pijplijn | 100-500ms | Hoog | Matig |
De aanbevolen aanpak is om eerst snelle, lichte controles uit te voeren (keyword- en regex-filters) om voor de hand liggende aanvallen te onderscheppen, en pas daarna een duurdere ML-gebaseerde analyse uit te voeren op input die de eerste filters passeert. Deze cascadeaanpak biedt goede beveiliging met acceptabele prestaties.
Monitoring en observability
Effectieve beveiligingsmonitoring voor LLM-applicaties vereist het bijhouden van metrieken die adversariële gedragspatronen vastleggen:
from dataclasses import dataclass
from collections import defaultdict
import time
@dataclass
class SecurityMetrics:
"""Houd beveiligingsrelevante metrieken bij voor LLM-applicaties."""
# Tellers
total_requests: int = 0
blocked_requests: int = 0
filtered_outputs: int = 0
anomalous_sessions: int = 0
# Frequentiebijhouding
_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 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 metrieken een waarschuwing rechtvaardigen."""
block_rate = self.get_block_rate()
# Waarschuw als het blokkeerpercentage de drempel overschrijdt
if block_rate > 0.3: # >30% van de verzoeken geblokkeerd in de afgelopen 5 min
return True
return FalseBeveiligingstests in CI/CD
Door AI-beveiligingstests in de ontwikkelpijplijn te integreren, vang je regressies op voordat ze in productie belanden:
- Tests op unitniveau: Test afzonderlijke beveiligingscomponenten (classifiers, filters) tegen bekende payloads
- Integratietests: Test de volledige beveiligingspijplijn end-to-end
- Regressietests: Onderhoud een suite van eerder ontdekte aanvalspayloads en controleer of die geblokkeerd blijven
- Adversariële tests: Voer periodiek geautomatiseerde red team-tools (Garak, Promptfoo) uit als onderdeel van de deploymentpijplijn
Opkomende trends
Actuele onderzoeksrichtingen
Het vakgebied van LLM-beveiliging evolueert razendsnel. Belangrijke onderzoeksrichtingen die het landschap waarschijnlijk gaan vormgeven, zijn onder andere:
-
Formele verificatie van LLM-gedrag: Onderzoekers verkennen wiskundige raamwerken om eigenschappen van modelgedrag onder adversariële omstandigheden te bewijzen. Hoewel volledige formele verificatie van neurale netwerken onhaalbaar blijft, is begrensde verificatie van specifieke eigenschappen veelbelovend.
-
Adversarial training voor LLM-robuustheid: Naast standaard-RLHF ontwikkelen onderzoekers trainingsprocedures die modellen tijdens de veiligheidstraining expliciet blootstellen aan adversariële input, wat de robuustheid tegen bekende aanvalspatronen verbetert.
-
Verdediging op basis van interpreteerbaarheid: Onderzoek naar mechanistische interpreteerbaarheid stelt verdedigers in staat om op het niveau van neuronen en circuits te begrijpen waarom specifieke aanvallen slagen, wat gerichtere verdedigingsmaatregelen mogelijk maakt.
-
Beveiliging van multi-agentsystemen: Nu LLM-agents steeds gangbaarder worden, is het beveiligen van de communicatie tussen agents en het bewaken van vertrouwensgrenzen binnen agentsystemen een actief onderzoeksgebied met aanzienlijke praktische gevolgen.
-
Geautomatiseerde redteaming op schaal: Tools zoals Garak van NVIDIA, PyRIT van Microsoft en het Inspect-framework van het Britse AISI maken geautomatiseerde beveiligingstests mogelijk op een schaal die voorheen ondenkbaar was, maar de kwaliteit en dekking van geautomatiseerd testen blijft een openstaande uitdaging.
De integratie van deze onderzoeksrichtingen in productiesystemen zal de volgende generatie AI-beveiligingspraktijken bepalen.
Referenties en verder lezen
- Liu et al. 2023 — "AutoDAN: Generating Stealthy Jailbreak Prompts on Aligned LLMs"
- Zou et al. 2023 — "Universal and Transferable Adversarial Attacks on Aligned Language Models" (GCG attack)
- Wei et al. 2023 — "Jailbroken: How Does LLM Safety Training Fail?"
Wat is de meest effectieve aanpak om je te verdedigen tegen de aanvalsklasse die in dit artikel wordt behandeld?
Waarom blijven de in dit artikel beschreven technieken effectief bij verschillende modelversies en aanbieders?