Misbruik van hybride zoekopdrachten
Hybride dense-sparse zoeksystemen misbruiken via gecoördineerde embeddingmanipulatie.
Overzicht
Hybride dense-sparse zoeksystemen misbruiken via gecoördineerde embeddingmanipulatie.
Dit onderwerp vertegenwoordigt een kritiek gebied binnen AI-beveiliging dat het onderwerp is geweest van veel onderzoek en misbruik in de praktijk. De concepten, technieken en verdedigingsmaatregelen die hier worden behandeld, begrijpen is essentieel voor iedereen die in AI-beveiliging werkt, of dat nu in offensieve of defensieve rollen is.
Zou et al. 2023 — "Universal and Transferable Adversarial Attacks on Aligned Language Models" biedt de funderende context voor de kwetsbaarheidsklasse die in dit artikel wordt onderzocht.
Kernconcepten
Grondbeginselen
De beveiligingsimplicaties van dit onderwerp komen voort uit fundamentele eigenschappen van hoe moderne taalmodellen worden ontworpen, getraind en uitgerold. Dit zijn geen geïsoleerde implementatiefouten, maar systemische kenmerken die alle transformer-gebaseerde taalmodellen in wisselende mate raken.
Het begrijpen van deze fundamentele eigenschap is de sleutel tot inzicht in waarom de in dit artikel beschreven technieken werken en waarom ze effectief blijven ondanks de voortdurende verbeteringen in de safety training van modellen. Safety training voegt een gedragslaag toe die het minder waarschijnlijk maakt dat modellen overduidelijk schadelijke instructies opvolgen, maar die laag draait bovenop dezelfde architectuur en kan worden beïnvloed door dezelfde attention-mechanismen die legitieme invoer verwerken.
Technische verdieping
Het mechanisme achter deze kwetsbaarheidsklasse opereert op het snijvlak tussen het vermogen om instructies op te volgen en bronauthenticatie. Tijdens de training leren modellen om instructies op te volgen die in specifieke formaten en contexten worden aangeboden. Een aanvaller die adversarial inhoud kan aanbieden in een formaat dat overeenkomt met de aangeleerde instructievolgpatronen van het model, kan het gedrag van het model met hoge betrouwbaarheid beïnvloeden.
from dataclasses import dataclass
from typing import Optional
import json
@dataclass
class SecurityAnalysis:
"""Framework voor het analyseren van beveiligingseigenschappen van LLM-systemen."""
target: str
model: str
defenses: list
vulnerabilities: list
def assess_risk(self, attack_type: str) -> dict:
"""Beoordeel het risico voor een specifiek aanvalstype."""
# Controleer of een verdediging dit aanvalstype adresseert
relevant_defenses = [
d for d in self.defenses
if attack_type in d.get("covers", [])
]
# Risicofactoren
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:
"""Beoordeel de potentiële impact van een aanvalstype."""
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:
"""Bereken het totale risico op basis van waarschijnlijkheid en 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:
"""Genereer een rapport van de risicobeoordeling."""
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
Inzicht in het aanvalsoppervlak is essentieel voor zowel offensief als defensief werk:
| Aanvalsvector | Toegangspunt | Typische impact | Verdedigingsaanpak |
|---|---|---|---|
| Directe injectie | Invoer van gebruikersbericht | Extractie van de system prompt, omzeilen van veiligheid | Inputclassificatie |
| Indirecte injectie | Externe databronnen (web, documenten, tools) | Data-exfiltratie, ongeautoriseerde acties | Datasanitisatie |
| Misbruik van function calling | Injectie in toolparameters | Ongeautoriseerde API-calls, datatoegang | Toolsandboxing |
| Geheugenmanipulatie | Conversatiegeschiedenis, persistent geheugen | Persistentie over sessies heen, valse context | Geheugenvalidatie |
| Contextmanipulatie | Beheer van het contextvenster | Overschrijven van instructieprioriteit | Contextisolatie |
Praktische toepassing
Implementatieaanpak
Deze concepten in de praktijk toepassen vereist een systematische methodologie:
class PracticalFramework:
"""Praktisch framework om de concepten uit dit artikel toe te passen."""
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 een specifieke aanvalsvector tegen het doel."""
self.tested_vectors.add(vector)
# Verstuur de payload
response = self._send(payload)
# Evalueer het resultaat
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:
"""Rapporteer over de testdekking."""
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:
"""Verstuur payload naar het doel (implementatie verschilt per doel)."""
pass
def _evaluate(self, response: str) -> bool:
"""Evalueer of de aanval is geslaagd."""
pass
def _detect_defense(self, response: str) -> Optional[str]:
"""Detecteer welk verdedigingsmechanisme is getriggerd."""
passVerdedigingsoverwegingen
Inzicht in verdedigingsmaatregelen is even belangrijk:
-
Inputvalidatie: De eerste verdedigingslinie. Zet inputclassifiers in die binnenkomende prompts op adversarial patronen beoordelen voordat ze het model bereiken. Moderne classifiers combineren keyword matching, regexpatronen en ML-gebaseerde detectie voor brede dekking.
-
Outputfiltering: Het vangnet. Verwerk alle modeloutputs achteraf om lekkage van gevoelige data, fragmenten van de system prompt en andere beleidsovertredingen te detecteren en te verwijderen. Outputfilters horen onafhankelijk te zijn van inputfilters om defense-in-depth te bieden.
-
Gedragsmonitoring: De detectielaag. Monitor interactiepatronen van het model op anomalieën die wijzen op lopende aanvallen — ongebruikelijke verzoekpatronen, herhaalde weigeringen of responskenmerken die afwijken van het baselinegedrag.
-
Architectuurontwerp: De fundering. Ontwerp applicatiearchitecturen die zo min mogelijk vertrouwen in modeloutputs leggen, least privilege voor toolacces afdwingen en heldere beveiligingsgrenzen tussen componenten bewaken.
Relevantie in de praktijk
Deze concepten zijn rechtstreeks toepasbaar op productie-AI-systemen in allerlei sectoren. De volgende factoren maken dit onderwerp bijzonder relevant:
- Alomtegenwoordigheid: De kwetsbaarheidsklasse raakt alle grote modelaanbieders en deploymentconfiguraties
- Impact: Geslaagd misbruik kan leiden tot data-exposure, ongeautoriseerde acties en complianceovertredingen
- Persistentie: De onderliggende architecturale eigenschappen zorgen ervoor dat deze technieken relevant blijven naarmate modellen evolueren
- Regelgeving: Opkomende regelgeving (EU AI Act, NIST AI RMF) verplicht organisaties steeds vaker om deze risico's te beoordelen en te mitigeren
Actueel onderzoek
Tot het actieve onderzoek op dit gebied behoort:
- Formele robuustheidsgaranties: Het ontwikkelen van wiskundige kaders om modelgedrag onder begrensde adversarial verstoring te bewijzen
- Adversarial training op schaal: Trainingsprocedures die modellen tijdens de safety training blootstellen aan adversarial invoer om de robuustheid te verbeteren
- Interpretability-gestuurde verdediging: Mechanistische interpretability gebruiken om te begrijpen waarom aanvallen slagen op neuronniveau, wat gerichte verdedigingen mogelijk maakt
- Gestandaardiseerde evaluatie: Benchmarks als HarmBench en JailbreakBench die een systematische meting van de effectiviteit van aanvallen en verdedigingen mogelijk maken
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.
Gevorderde overwegingen
Een evoluerend aanvalslandschap
Het AI-beveiligingslandschap evolueert razendsnel naarmate zowel offensieve technieken als defensieve maatregelen vorderen. Verschillende trends bepalen de huidige stand van zaken:
Toenemende modelmogelijkheden creëren nieuwe aanvalsoppervlakken. Naarmate modellen toegang krijgen tot tools, code-executie, webbrowsen en computergebruik, introduceert elke nieuwe mogelijkheid potentiële misbruikvectoren die niet bestonden in eerdere, tekst-only systemen. Het principe van least privilege wordt steeds belangrijker naarmate de mogelijkheden van modellen toenemen.
Verbeteringen in safety training zijn noodzakelijk maar niet voldoende. Modelaanbieders investeren fors in safety training via RLHF, DPO, constitutional AI en andere alignment-technieken. Deze verbeteringen leggen de lat voor geslaagde aanvallen hoger, maar elimineren de fundamentele kwetsbaarheid niet: modellen kunnen legitieme instructies niet betrouwbaar onderscheiden van adversarial instructies, omdat dat onderscheid niet in de architectuur is gerepresenteerd.
Geautomatiseerde red team-tools democratiseren het testen. Tools als NVIDIA's Garak, Microsofts PyRIT en Promptfoo stellen organisaties in staat om geautomatiseerd beveiligingstesten uit te voeren zonder diepgaande AI-beveiligingsexpertise. Geautomatiseerde tools vangen echter bekende patronen op; nieuwe aanvallen en kwetsbaarheden in bedrijfslogica vereisen nog altijd menselijke creativiteit en domeinkennis.
Regeldruk stimuleert investeringen door organisaties. De EU AI Act, het NIST AI RMF en sectorspecifieke regelgeving verplichten organisaties steeds vaker om AI-specifieke risico's te beoordelen en te mitigeren. Deze regeldruk stimuleert investeringen in AI-beveiligingsprogramma's, 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 op zichzelf volstaat. Stapel meerdere onafhankelijke verdedigingen op elkaar, zodat het falen van één laag niet leidt tot compromittering van het systeem. Inputclassificatie, outputfiltering, gedragsmonitoring en architecturale controls horen allemaal aanwezig te zijn.
-
Assume breach: Ontwerp systemen vanuit de aanname dat elk afzonderlijk component gecompromitteerd kan raken. Deze mindset leidt tot betere isolatie, monitoring en incident-responsemogelijkheden. Wanneer een prompt injection slaagt, hoort de blast radius via architecturale controls geminimaliseerd te worden.
-
Least privilege: Geef modellen en agents alleen de minimale mogelijkheden die hun beoogde functie vereist. Een klantenservice-chatbot heeft geen toegang tot het bestandssysteem of code-executie nodig. Excessieve mogelijkheden vergroten de impact van geslaagd misbruik.
-
Continu testen: AI-beveiliging is geen eenmalige assessment. Modellen veranderen, verdedigingen evolueren en nieuwe aanvalstechnieken worden regelmatig ontdekt. Implementeer continu beveiligingstesten als onderdeel van de ontwikkel- en deploymentlevenscyclus.
-
Secure by default: Standaardconfiguraties horen veilig te zijn. Vereis een expliciete opt-in voor risicovolle mogelijkheden, gebruik allowlists in plaats van denylists en kies bij twijfel voor restrictie boven permissiviteit.
Integratie met organisatorische beveiliging
AI-beveiliging staat niet op zichzelf — ze moet integreren met het bredere beveiligingsprogramma van de organisatie:
| Beveiligingsdomein | AI-specifieke integratie |
|---|---|
| Identiteit en toegang | API-keybeheer, toegangscontrole op modellen, gebruikersauthenticatie voor AI-functies |
| Gegevensbescherming | Classificatie van trainingsdata, PII in prompts, dataresidentie voor modelcalls |
| Applicatiebeveiliging | Dreigingsmodellering van AI-functies, prompt injection in SAST/DAST, veilige AI-ontwerppatronen |
| Incident response | AI-specifieke playbooks, monitoring van modelgedrag, forensisch onderzoek naar prompt injection |
| Compliance | Mapping van AI-regelgeving (EU AI Act, NIST), AI-audit trails, modeldocumentatie |
| Supply chain | Herkomst van modellen, beveiliging van dependencies, integriteitsverificatie van adapters/gewichten |
class OrganizationalIntegration:
"""Framework om AI-beveiliging te integreren met organisatorische beveiligingsprogramma's."""
def __init__(self, org_config: dict):
self.config = org_config
self.gaps = []
def assess_maturity(self) -> dict:
"""Beoordeel de volwassenheid van de AI-beveiliging van de organisatie."""
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 branchetrends zullen de evolutie van dit vakgebied vormgeven:
- Formele methoden voor AI-veiligheid: Het ontwikkelen van wiskundige kaders die begrensde garanties kunnen bieden over modelgedrag onder adversarial omstandigheden
- Geautomatiseerde AI-redteaming op schaal: Voortdurende verbetering van geautomatiseerde testtools die nieuwe kwetsbaarheden kunnen ontdekken zonder menselijke sturing
- AI-ondersteunde verdediging: AI-systemen inzetten om aanvallen op andere AI-systemen te detecteren en erop te reageren, wat een dynamisch aanval-verdedigingsecosysteem creëert
- Gestandaardiseerde evaluatie: Groeiende adoptie van gestandaardiseerde benchmarks (HarmBench, JailbreakBench) die een consistente meting van vooruitgang mogelijk maken
- Harmonisatie van regelgeving: Convergentie van AI-regelgevingskaders over jurisdicties heen, wat duidelijkere eisen voor organisaties oplevert
Referenties en verder lezen
- OWASP LLM Top 10 2025 — Uitgebreide gids over LLM-beveiligingsrisico's (owasp.org/www-project-top-10-for-large-language-model-applications)
- MITRE ATLAS — Adversarial Threat Landscape for AI Systems (atlas.mitre.org)
- Zou et al. 2023 — "Universal and Transferable Adversarial Attacks on Aligned Language Models"
- Chao et al. 2023 — "Jailbreaking Black-Box LLMs in Twenty Queries" (PAIR)
- Garak (NVIDIA) — LLM vulnerability scanner (github.com/NVIDIA/garak)
Wat is de meest effectieve verdedigingsstrategie tegen de aanvalsklasse die in dit artikel wordt beschreven?
Waarom blijven de technieken die in dit artikel worden beschreven effectief ondanks de voortdurende beveiligingsverbeteringen door modelaanbieders?