Canariesysteem voor prompt-injectie
Zet canariestrings in systeemprompts in om pogingen tot prompt-injectie en extractie te detecteren en erop te alarmeren.
Overzicht
Zet canariestrings in systeemprompts in om pogingen tot prompt-injectie en extractie te detecteren en erop te alarmeren.
Dit onderwerp vertegenwoordigt een kritiek gebied in AI-beveiliging dat het onderwerp is geweest van aanzienlijk onderzoek en exploitatie in de praktijk. Begrip van de concepten, technieken en verdedigingsmaatregelen die hier worden behandeld, is essentieel voor iedereen die werkzaam is in AI-beveiliging, in offensieve of defensieve rollen.
NeMo Guardrails (NVIDIA) — Programmable guardrails (github.com/NVIDIA/NeMo-Guardrails) biedt fundamentele context voor de kwetsbaarheidsklasse die in dit artikel wordt verkend.
Kernconcepten
Fundamentele principes
De beveiligingsimplicaties van dit onderwerp komen voort uit fundamentele eigenschappen van hoe moderne taalmodellen worden ontworpen, getraind en geïmplementeerd. Dit zijn geen geïsoleerde implementatiefouten, maar eerder systemische kenmerken die alle transformer-gebaseerde taalmodellen in verschillende mate beïnvloeden.
Begrip van deze fundamentele eigenschap is de sleutel tot het begrijpen waarom de in dit artikel beschreven technieken werken en waarom ze effectief blijven ondanks voortdurende verbeteringen in de veiligheidstraining van modellen. Veiligheidstraining voegt een gedragslaag toe die het minder waarschijnlijk maakt dat modellen overduidelijk schadelijke instructies opvolgen, maar deze laag werkt bovenop dezelfde architectuur en kan worden beïnvloed door dezelfde attentiemechanismen die legitieme invoer verwerken.
Technische verdieping
Het mechanisme dat aan deze kwetsbaarheidsklasse ten grondslag ligt, werkt op het raakvlak tussen het vermogen om instructies op te volgen en bronauthenticatie. Tijdens de training leren modellen instructies op te volgen die in specifieke formaten en contexten worden aangeboden. Een aanvaller die adversariële inhoud kan aanbieden in een formaat dat overeenkomt met de aangeleerde patronen voor het opvolgen van instructies, kan modelgedrag met hoge betrouwbaarheid beïnvloeden.
from dataclasses import dataclass
from typing import Optional
import json
@dataclass
class SecurityAnalysis:
"""Framework for analyzing security properties of LLM systems."""
target: str
model: str
defenses: list
vulnerabilities: list
def assess_risk(self, attack_type: str) -> dict:
"""Assess risk for a specific attack type."""
# Check if any defense addresses this attack type
relevant_defenses = [
d for d in self.defenses
if attack_type in d.get("covers", [])
]
# Risk factors
likelihood = "high" if not relevant_defenses else "medium"
impact = self._assess_impact(attack_type)
return {
"attack_type": attack_type,
"likelihood": likelihood,
"impact": impact,
"defenses": len(relevant_defenses),
"risk_level": self._calculate_risk(likelihood, impact),
}
def _assess_impact(self, attack_type: str) -> str:
"""Assess the potential impact of an attack type."""
high_impact = ["data_exfiltration", "unauthorized_actions", "privilege_escalation"]
return "high" if attack_type in high_impact else "medium"
def _calculate_risk(self, likelihood: str, impact: str) -> str:
"""Calculate overall risk from likelihood and impact."""
risk_matrix = {
("high", "high"): "critical",
("high", "medium"): "high",
("medium", "high"): "high",
("medium", "medium"): "medium",
}
return risk_matrix.get((likelihood, impact), "medium")
def generate_report(self) -> str:
"""Generate a risk assessment report."""
attacks = ["prompt_injection", "data_exfiltration", "unauthorized_actions"]
assessments = [self.assess_risk(a) for a in attacks]
report = f"# Risk Assessment: {self.target}\n\n"
for assessment in assessments:
report += (
f"## {assessment['attack_type']}\n"
f"- Risk: {assessment['risk_level']}\n"
f"- Likelihood: {assessment['likelihood']}\n"
f"- Impact: {assessment['impact']}\n"
f"- Active defenses: {assessment['defenses']}\n\n"
)
return reportAnalyse van het aanvalsoppervlak
Begrip van het aanvalsoppervlak is essentieel voor zowel offensief als defensief werk:
| Aanvalsvector | Toegangspunt | Typische impact | Verdedigingsaanpak |
|---|---|---|---|
| Directe injectie | Gebruikersberichtinvoer | Extractie van systeemprompt, omzeilen van veiligheid | Invoerclassificatie |
| Indirecte injectie | Externe databronnen (web, documenten, tools) | Data-exfiltratie, ongeautoriseerde acties | Datasanitatie |
| Misbruik van function calling | Injectie via toolparameters | Ongeautoriseerde API-aanroepen, datatoegang | Tool-sandboxing |
| Geheugenmanipulatie | Gespreksgeschiedenis, persistent geheugen | Persistentie over sessies heen, valse context | Geheugenvalidatie |
| Contextmanipulatie | Beheer van het contextvenster | Overschrijven van instructieprioriteit | Contextisolatie |
Praktische toepassing
Implementatieaanpak
Het in de praktijk toepassen van deze concepten vereist een systematische methodologie:
class PracticalFramework:
"""Practical framework for applying the concepts in this article."""
def __init__(self, target_config: dict):
self.config = target_config
self.findings = []
self.tested_vectors = set()
def test_vector(self, vector: str, payload: str) -> dict:
"""Test a specific attack vector against the target."""
self.tested_vectors.add(vector)
# Send the payload
response = self._send(payload)
# Evaluate the result
finding = {
"vector": vector,
"payload_length": len(payload),
"response_length": len(response),
"success": self._evaluate(response),
"defense_triggered": self._detect_defense(response),
}
if finding["success"]:
self.findings.append(finding)
return finding
def coverage_report(self) -> dict:
"""Report on testing coverage."""
all_vectors = {
"direct_injection", "indirect_injection", "function_abuse",
"memory_manipulation", "context_manipulation",
}
return {
"tested": list(self.tested_vectors),
"untested": list(all_vectors - self.tested_vectors),
"coverage": f"{len(self.tested_vectors)/len(all_vectors)*100:.0f}%",
"findings": len(self.findings),
}
def _send(self, payload: str) -> str:
"""Send payload to target (implementation varies by target)."""
pass
def _evaluate(self, response: str) -> bool:
"""Evaluate whether the attack was successful."""
pass
def _detect_defense(self, response: str) -> Optional[str]:
"""Detect which defense mechanism was triggered."""
passVerdedigingsoverwegingen
Begrip van verdedigingsmaatregelen is even belangrijk:
-
Invoervalidatie: de eerste verdedigingslinie. Zet invoerclassificatoren in die inkomende prompts evalueren op adversariële patronen voordat ze het model bereiken. Moderne classificatoren combineren keyword matching, regex-patronen en ML-gebaseerde detectie voor uitgebreide dekking.
-
Outputfiltering: het vangnet. Bewerk alle modeloutputs na om lekkage van gevoelige data, fragmenten van de systeemprompt en andere beleidsovertredingen te detecteren en te verwijderen. Outputfilters zouden onafhankelijk van invoerfilters moeten zijn om defense-in-depth te bieden.
-
Gedragsmonitoring: de detectielaag. Monitor de interactiepatronen van het model op anomalieën die wijzen op lopende aanvallen — ongebruikelijke verzoekpatronen, herhaalde weigeringen of responskenmerken die afwijken van het basisgedrag.
-
Architectuurontwerp: het fundament. Ontwerp applicatiearchitecturen die het vertrouwen in modeloutputs minimaliseren, least privilege afdwingen voor toegang tot tools en duidelijke beveiligingsgrenzen tussen componenten handhaven.
Relevantie in de praktijk
Deze concepten zijn direct toepasbaar op productie-AI-systemen in alle sectoren. De volgende factoren maken dit onderwerp bijzonder relevant:
- Alomtegenwoordigheid: de kwetsbaarheidsklasse treft alle grote modelaanbieders en deploymentconfiguraties
- Impact: geslaagde exploitatie kan leiden tot datablootstelling, ongeautoriseerde acties en compliance-overtredingen
- Persistentie: de onderliggende architectonische eigenschappen zorgen ervoor dat deze technieken relevant blijven naarmate modellen evolueren
- Regelgeving: opkomende regelgeving (EU AI Act, NIST AI RMF) vereist steeds vaker dat organisaties deze risico's beoordelen en mitigeren
Huidig onderzoek
Actief onderzoek op dit gebied omvat:
- Formele robuustheidsgaranties: het ontwikkelen van wiskundige kaders om modelgedrag onder begrensde adversariële verstoring te bewijzen
- Adversariële training op schaal: trainingsprocedures die modellen tijdens de veiligheidstraining blootstellen aan adversariële invoer om de robuustheid te verbeteren
- Interpreteerbaarheidsgestuurde verdediging: mechanistische interpreteerbaarheid gebruiken om te begrijpen waarom aanvallen slagen op neuronniveau, wat gerichte verdedigingen mogelijk maakt
- Gestandaardiseerde evaluatie: benchmarks zoals HarmBench en JailbreakBench die systematische meting van de effectiviteit van aanvallen en verdedigingen mogelijk maken
Implementatieoverwegingen
Architectuurpatronen
Bij het implementeren van systemen die met LLM's interacteren, beïnvloeden verschillende architectuurpatronen de beveiligingshouding van de hele applicatie:
Gateway-patroon: een speciale API-gateway zit tussen gebruikers en de LLM en handelt authenticatie, rate limiting, invoervalidatie en outputfiltering af. Dit centraliseert beveiligingscontroles, maar creëert één enkel faalpunt.
from dataclasses import dataclass
from typing import Optional
import time
@dataclass
class SecurityGateway:
"""Gateway pattern for securing LLM application access."""
input_classifier: object # ML-based input classifier
output_filter: object # Output content filter
rate_limiter: object # Rate limiting service
audit_logger: object # Audit trail logger
def process_request(self, user_id: str, message: str, session_id: str) -> dict:
"""Process a request through all security layers."""
request_id = self._generate_request_id()
# Layer 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}
# Layer 2: Input classification
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"}
# Layer 3: LLM processing
response = self._call_llm(message, session_id)
# Layer 4: Output filtering
filtered = self.output_filter.filter(response)
if filtered.was_modified:
self.audit_logger.log(
request_id, "output_filtered",
user_id, filtered.reason
)
# Layer 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:
# LLM API call implementation
passSidecar-patroon: beveiligingscomponenten draaien naast de LLM als onafhankelijke services, elk verantwoordelijk voor een specifiek beveiligingsaspect. 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.
Prestatie-implicaties
Beveiligingsmaatregelen voegen onvermijdelijk latency en rekenkundige overhead toe. Begrip van deze afwegingen is essentieel voor productie-implementaties:
| Beveiligingslaag | Typische latency | Rekenkosten | Impact op UX |
|---|---|---|---|
| Keyword-filter | <1ms | Verwaarloosbaar | Geen |
| Regex-filter | 1-5ms | Laag | Geen |
| ML-classificator (klein) | 10-50ms | Matig | Minimaal |
| ML-classificator (groot) | 50-200ms | Hoog | Merkbaar |
| LLM-as-judge | 500-2000ms | Zeer hoog | Aanzienlijk |
| Volledige pijplijn | 100-500ms | Hoog | Matig |
De aanbevolen aanpak is om eerst snelle, lichtgewicht checks te gebruiken (keyword- en regex-filters) om voor de hand liggende aanvallen op te vangen, gevolgd door duurdere ML-gebaseerde analyse alleen voor invoer die de eerste filters passeert. Deze cascaderende aanpak biedt goede beveiliging met aanvaardbare prestaties.
Monitoring en observability
Effectieve beveiligingsmonitoring voor LLM-applicaties vereist het volgen van metrics die adversariële gedragspatronen vastleggen:
from dataclasses import dataclass
from collections import defaultdict
import time
@dataclass
class SecurityMetrics:
"""Track security-relevant metrics for LLM applications."""
# Counters
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):
"""Record a request and its disposition."""
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:
"""Calculate the block rate over a time window."""
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:
"""Determine if current metrics warrant an alert."""
block_rate = self.get_block_rate()
# Alert if block rate exceeds threshold
if block_rate > 0.3: # >30% of requests blocked in last 5 min
return True
return FalseBeveiligingstesten in CI/CD
Het integreren van AI-beveiligingstesten in de ontwikkelpijplijn vangt regressies op voordat ze de productie bereiken:
- Tests op unitniveau: test afzonderlijke beveiligingscomponenten (classificatoren, filters) tegen bekende payloads
- Integratietests: test de volledige beveiligingspijplijn end-to-end
- Regressietests: onderhoud een suite van eerder ontdekte aanvalspayloads en verifieer dat ze geblokkeerd blijven
- Adversariële tests: voer periodiek geautomatiseerde red-team-tools (Garak, Promptfoo) uit als onderdeel van de deploymentpijplijn
Opkomende trends
Huidige onderzoeksrichtingen
Het veld van LLM-beveiliging evolueert snel. Belangrijke onderzoeksrichtingen die het landschap waarschijnlijk gaan vormgeven, zijn onder meer:
-
Formele verificatie voor LLM-gedrag: onderzoekers verkennen wiskundige kaders om eigenschappen van modelgedrag onder adversariële omstandigheden te bewijzen. Hoewel volledige formele verificatie van neurale netwerken onhaalbaar blijft, biedt begrensde verificatie van specifieke eigenschappen perspectief.
-
Adversariële training voor LLM-robuustheid: naast standaard RLHF ontwikkelen onderzoekers trainingsprocedures die modellen tijdens de veiligheidstraining expliciet blootstellen aan adversariële invoer, wat de robuustheid tegen bekende aanvalspatronen verbetert.
-
Interpreteerbaarheidsgestuurde verdediging: onderzoek naar mechanistische interpreteerbaarheid stelt verdedigers in staat te begrijpen waarom specifieke aanvallen slagen op neuron- en circuitniveau, wat gerichtere verdedigingsmaatregelen mogelijk maakt.
-
Multi-agentbeveiliging: naarmate LLM-agents wijdverspreider worden, is het beveiligen van communicatie tussen agents en het bewaken van vertrouwensgrenzen over agentsystemen heen een actief onderzoeksgebied met aanzienlijke praktische implicaties.
-
Geautomatiseerde red teaming op schaal: tools zoals NVIDIA's Garak, Microsoft's PyRIT en het Inspect-framework van het Britse AISI maken geautomatiseerd beveiligingstesten mogelijk op schalen die voorheen onmogelijk 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.
Geavanceerde overwegingen
Het evoluerende aanvalslandschap
Het AI-beveiligingslandschap evolueert snel naarmate zowel offensieve technieken als verdedigingsmaatregelen vorderen. Verschillende trends bepalen de huidige stand van zaken:
Toenemende modelmogelijkheden creëren nieuwe aanvalsoppervlakken. Naarmate modellen toegang krijgen tot tools, codeuitvoering, webbrowsen en computergebruik, introduceert elke nieuwe mogelijkheid potentiële exploitatievectoren die in eerdere, tekst-only systemen niet bestonden. Het principe van least privilege wordt steeds belangrijker naarmate de modelmogelijkheden zich uitbreiden.
Verbeteringen in veiligheidstraining zijn noodzakelijk maar niet voldoende. Modelaanbieders investeren zwaar in veiligheidstraining via RLHF, DPO, constitutional AI en andere alignmenttechnieken. Deze verbeteringen leggen de lat hoger voor geslaagde aanvallen, maar elimineren de fundamentele kwetsbaarheid niet: modellen kunnen legitieme instructies niet betrouwbaar onderscheiden van adversariële, omdat dit onderscheid niet in de architectuur is gerepresenteerd.
Geautomatiseerde red-team-tools democratiseren het testen. Tools zoals NVIDIA's Garak, Microsoft's PyRIT en Promptfoo stellen organisaties in staat geautomatiseerd beveiligingstesten uit te voeren zonder diepgaande AI-beveiligingsexpertise. Geautomatiseerde tools vangen echter bekende patronen op; nieuwe aanvallen en kwetsbaarheden in de bedrijfslogica vereisen nog steeds menselijke creativiteit en domeinkennis.
Regelgevende druk stuwt organisatorische investeringen aan. De EU AI Act, het NIST AI RMF en sectorspecifieke regelgeving vereisen steeds vaker dat organisaties AI-specifieke risico's beoordelen en mitigeren. Deze regelgevende druk stuwt investeringen in AI-beveiligingsprogramma's aan, maar veel organisaties bevinden zich nog in de beginfase van het opbouwen van volwassen AI-beveiligingspraktijken.
Overkoepelende beveiligingsprincipes
Verschillende beveiligingsprincipes gelden voor alle onderwerpen in dit curriculum:
-
Defense-in-depth: geen enkele verdedigingsmaatregel is voldoende. Stapel meerdere onafhankelijke verdedigingen zodat het falen van een enkele laag niet leidt tot compromittering van het systeem. Invoerclassificatie, outputfiltering, gedragsmonitoring en architectonische controles zouden allemaal aanwezig moeten zijn.
-
Assume breach: ontwerp systemen vanuit de aanname dat elke afzonderlijke component gecompromitteerd kan zijn. Deze instelling leidt tot betere isolatie-, monitoring- en incidentresponsmogelijkheden. Wanneer een prompt-injectie slaagt, zou de blast radius geminimaliseerd moeten worden via architectonische controles.
-
Least privilege: geef modellen en agents alleen de minimale mogelijkheden die nodig zijn voor hun beoogde functie. Een chatbot voor klantenservice heeft geen toegang tot het bestandssysteem of codeuitvoering nodig. Overmatige mogelijkheden vergroten de impact van geslaagde exploitatie.
-
Continu testen: AI-beveiliging is geen eenmalige beoordeling. Modellen veranderen, verdedigingen evolueren en nieuwe aanvalstechnieken worden regelmatig ontdekt. Implementeer continu beveiligingstesten als onderdeel van de ontwikkel- en deploymentlevenscyclus.
-
Secure by default: standaardconfiguraties zouden veilig moeten zijn. Vereis expliciete opt-in voor risicovolle mogelijkheden, gebruik allowlists in plaats van denylists en kies eerder voor beperking dan voor permissiviteit.
Integratie met organisatorische beveiliging
AI-beveiliging staat niet op zichzelf — het moet integreren met het bredere beveiligingsprogramma van de organisatie:
| Beveiligingsdomein | AI-specifieke integratie |
|---|---|
| Identiteit en toegang | Beheer van API-sleutels, toegangscontroles voor modellen, gebruikersauthenticatie voor AI-functies |
| Databescherming | Classificatie van trainingsdata, PII in prompts, dataresidentie voor modelaanroepen |
| Applicatiebeveiliging | Dreigingsmodellering voor AI-functies, prompt-injectie in SAST/DAST, veilige AI-ontwerppatronen |
| Incidentrespons | AI-specifieke playbooks, monitoring van modelgedrag, forensiek van prompt-injectie |
| Compliance | Mapping van AI-regelgeving (EU AI Act, NIST), AI-audittrails, modeldocumentatie |
| Toeleveringsketen | Herkomst van modellen, beveiliging van afhankelijkheden, integriteitsverificatie van adapters/gewichten |
class OrganizationalIntegration:
"""Framework for integrating AI security with organizational security programs."""
def __init__(self, org_config: dict):
self.config = org_config
self.gaps = []
def assess_maturity(self) -> dict:
"""Assess the organization's AI security maturity."""
domains = {
"governance": self._check_governance(),
"technical_controls": self._check_technical(),
"monitoring": self._check_monitoring(),
"incident_response": self._check_ir(),
"training": self._check_training(),
}
overall = sum(d["score"] for d in domains.values()) / len(domains)
return {"domains": domains, "overall_maturity": round(overall, 1)}
def _check_governance(self) -> dict:
has_policy = self.config.get("ai_security_policy", False)
has_framework = self.config.get("risk_framework", False)
score = (int(has_policy) + int(has_framework)) * 2.5
return {"score": score, "max": 5.0}
def _check_technical(self) -> dict:
controls = ["input_classification", "output_filtering", "rate_limiting", "sandboxing"]
active = sum(1 for c in controls if self.config.get(c, False))
return {"score": active * 1.25, "max": 5.0}
def _check_monitoring(self) -> dict:
has_monitoring = self.config.get("ai_monitoring", False)
has_alerting = self.config.get("ai_alerting", False)
score = (int(has_monitoring) + int(has_alerting)) * 2.5
return {"score": score, "max": 5.0}
def _check_ir(self) -> dict:
has_playbook = self.config.get("ai_ir_playbook", False)
return {"score": 5.0 if has_playbook else 0.0, "max": 5.0}
def _check_training(self) -> dict:
has_training = self.config.get("ai_security_training", False)
return {"score": 5.0 if has_training else 0.0, "max": 5.0}Toekomstige richtingen
Verschillende onderzoeks- en industrietrends zullen de evolutie van dit veld bepalen:
- Formele methoden voor AI-veiligheid: ontwikkeling van wiskundige kaders die begrensde garanties over modelgedrag onder adversariële omstandigheden kunnen bieden
- Geautomatiseerde red teaming op schaal: voortdurende verbetering van geautomatiseerde testtools die nieuwe kwetsbaarheden kunnen ontdekken zonder menselijke begeleiding
- AI-ondersteunde verdediging: AI-systemen gebruiken om aanvallen op andere AI-systemen te detecteren en erop te reageren, waardoor een dynamisch aanval-verdedigingsecosysteem ontstaat
- Gestandaardiseerde evaluatie: groeiende adoptie van gestandaardiseerde benchmarks (HarmBench, JailbreakBench) die consistente meting van voortgang mogelijk maken
- Harmonisatie van regelgeving: convergentie van AI-regelgevingskaders over rechtsgebieden heen, wat duidelijkere eisen voor organisaties oplevert
Referenties en verder lezen
- OWASP LLM Top 10 2025 — Comprehensive guide to LLM security risks (owasp.org/www-project-top-10-for-large-language-model-applications)
- MITRE ATLAS — Adversarial Threat Landscape for AI Systems (atlas.mitre.org)
- NeMo Guardrails (NVIDIA) — Programmable guardrails (github.com/NVIDIA/NeMo-Guardrails)
- LLM Guard — Input/output scanning (github.com/protectai/llm-guard)
- Anthropic 2025 — "Constitutional Classifiers" technical report
Wat is de meest effectieve verdedigingsstrategie tegen de aanvalsklasse die in dit artikel wordt beschreven?
Waarom blijven de in dit artikel beschreven technieken effectief ondanks voortdurende beveiligingsverbeteringen door modelaanbieders?