Wat is prompt injection en hoe test je erop?

Schaduwachtige hand die een gevouwen briefje door een smalle opening in een serverrack schuift, met een gloeiend amber indicatielampje op de achtergrond.

AI-systemen worden steeds vaker ingezet in applicaties die directe interactie hebben met gebruikers. Dat brengt nieuwe beveiligingsrisico’s met zich mee waar veel testteams nog weinig ervaring mee hebben. Prompt injection is daar een goed voorbeeld van: een aanvalstechniek die specifiek gericht is op het manipuleren van taalmodellen en AI-gestuurde applicaties. Ben je benieuwd hoe je dit soort kwetsbaarheden aanpakt? We helpen je graag verder — neem gerust contact op als je vragen hebt.

Wat is prompt injection precies?

Prompt injection is een aanvalstechniek waarbij een kwaadwillende gebruiker via zorgvuldig geformuleerde invoer een AI-systeem dwingt zijn oorspronkelijke instructies te negeren en onbedoeld gedrag te vertonen. De aanvaller “injecteert” als het ware nieuwe instructies in de context van het taalmodel, waardoor het systeem buiten zijn bedoelde grenzen opereert.

Stel je een klantenservicebot voor die is geprogrammeerd om alleen productvragen te beantwoorden. Via prompt injection kan een aanvaller de bot instrueren om vertrouwelijke systeeminformatie vrij te geven, ongeschikte content te produceren of beveiligingsmaatregelen te omzeilen. Het probleem zit in de manier waarop grote taalmodellen (LLMs) werken: zij maken geen strikt onderscheid tussen vertrouwde systeeminstructies en niet-vertrouwde gebruikersinvoer. Alles wordt als tekst verwerkt, en dat creëert een fundamentele kwetsbaarheid.

Welke soorten prompt injection aanvallen bestaan er?

Er zijn twee hoofdcategorieën van prompt injection aanvallen: directe en indirecte prompt injection. Bij directe aanvallen voert de gebruiker zelf de kwaadaardige instructies in. Bij indirecte aanvallen worden die instructies verborgen in externe content die het AI-systeem verwerkt, zoals een webpagina, document of e-mail.

Binnen die twee categorieën bestaan diverse varianten:

  • Jailbreaking: de aanvaller probeert de veiligheidsrichtlijnen van het model te omzeilen door creatieve herformuleringen of rollenspelscenario’s.
  • Goal hijacking: de oorspronkelijke taak van het model wordt vervangen door een andere taak die de aanvaller wenst.
  • Prompt leaking: de aanvaller probeert de verborgen systeemprompt bloot te leggen, waardoor gevoelige bedrijfslogica of instructies zichtbaar worden.
  • Indirecte injectie via data: kwaadaardige instructies worden verstopt in documenten, e-mails of webpagina’s die het AI-systeem automatisch verwerkt.

Indirecte prompt injection is bijzonder gevaarlijk in geautomatiseerde workflows, waarbij een AI-agent zelfstandig acties uitvoert op basis van externe bronnen. In die situaties kan een aanvaller via een geïnfecteerde externe bron het volledige gedrag van de agent overnemen.

Hoe verschilt prompt injection van traditionele SQL injection?

Het kernverschil is dat SQL injection een technisch, deterministisch systeem aanvalt met vaste syntaxisregels, terwijl prompt injection een probabilistisch taalmodel aanvalt dat werkt op basis van betekenis en context. Bij SQL injection is de aanval succesvol wanneer de ingevoerde code geldige SQL vormt. Bij prompt injection gaat het om het overtuigen van een model, niet om het breken van code.

Dit heeft grote gevolgen voor de testbaarheid. SQL injection heeft duidelijke slaag- of faalcriteria: de query werkt of werkt niet. Prompt injection is veel grijzer. Een aanval kan de ene keer slagen en de andere keer falen met exact dezelfde invoer, simpelweg omdat taalmodellen niet-deterministisch zijn. Bovendien bestaat er geen universele “escaping” methode zoals bij SQL, waarbij je speciale tekens kunt neutraliseren. De grens tussen legitieme instructie en kwaadaardige injectie is inherent vaag.

Waarom is prompt injection zo moeilijk te voorkomen?

Prompt injection is zo moeilijk te voorkomen omdat er geen technische scheiding bestaat tussen data en instructies in een taalmodel. Het model verwerkt alles als tekst en probeert dat te interpreteren. Er is geen equivalent van een “prepared statement” zoals bij SQL, waarmee je invoer kunt isoleren van uitvoerbare code.

Daar komen nog andere complicerende factoren bij:

  • Non-determinisme: hetzelfde model kan op dezelfde aanval wisselend reageren, wat consistente beveiliging bemoeilijkt.
  • Creatieve omzeiling: aanvallers kunnen eindeloos variëren in formulering, taal, codering en context om filters te omzeilen.
  • Verborgen instructies: bij indirecte aanvallen zijn de kwaadaardige instructies niet zichtbaar in de directe gebruikersinvoer.
  • Modelupdates: een beveiligingsmaatregel die werkt voor één versie van een model werkt mogelijk niet meer na een update.

Dit maakt prompt injection tot een van de meest uitdagende beveiligingsproblemen in het AI-tijdperk. Defensie vereist een gelaagde aanpak: invoervalidatie, outputfiltering, minimale rechten voor AI-agents en continue monitoring zijn allemaal noodzakelijk, maar geen van deze maatregelen biedt op zichzelf volledige bescherming.

Hoe test je een applicatie op prompt injection kwetsbaarheden?

Het testen op prompt injection vereist een combinatie van handmatige aanvalssimulaties en geautomatiseerde testscenario’s. De kern is het systematisch proberen het model buiten zijn bedoelde gedrag te brengen via zorgvuldig ontworpen testinvoer, gevolgd door het evalueren of de applicatie adequaat reageert.

Een praktische aanpak bestaat uit de volgende stappen:

  1. Definieer de grenzen: bepaal wat het model wel en niet mag doen. Dit vormt de basis voor je testcriteria.
  2. Stel een aanvalsdatabase samen: verzamel bekende prompt injection patronen, jailbreak-technieken en rollenspelscenario’s.
  3. Test directe injectie: voer kwaadaardige prompts in via alle gebruikersinvoervelden en beoordeel de reacties.
  4. Test indirecte injectie: simuleer externe data die het systeem verwerkt en verberg daarin instructies.
  5. Evalueer de output: beoordeel niet alleen of de aanval slaagt, maar ook hoe het systeem faalt. Geeft het gevoelige informatie prijs? Voert het onbedoelde acties uit?
  6. Herhaal na modelwijzigingen: test opnieuw bij elke update van het onderliggende model of de systeemprompt.

Omdat taalmodellen niet-deterministisch zijn, is het verstandig elke testcase meerdere keren uit te voeren. Eén succesvolle aanval is al een bevinding, ook als diezelfde aanval negen van de tien keer mislukt. Onze aanpak voor AI-kwaliteitsborging sluit hier naadloos op aan, met aandacht voor precies dit soort complexe, niet-deterministische testuitdagingen.

Welke tools helpen bij het testen op prompt injection?

Er zijn inmiddels meerdere gespecialiseerde tools beschikbaar die het testen op prompt injection ondersteunen. De bekendste zijn Garak, PyRIT van Microsoft en PromptBench. Daarnaast biedt het OWASP LLM Top 10 framework een gestructureerd kader voor het identificeren en testen van kwetsbaarheden in LLM-applicaties, waaronder prompt injection als nummer één risico.

Een overzicht van nuttige tools en frameworks:

  • Garak: een open-source scanner specifiek ontworpen voor het testen van LLMs op kwetsbaarheden, inclusief prompt injection en jailbreaking.
  • PyRIT (Python Risk Identification Toolkit): ontwikkeld door Microsoft voor het automatisch identificeren van risico’s in generatieve AI-systemen.
  • PromptBench: een framework voor het evalueren van de robuustheid van taalmodellen tegen adversariële invoer.
  • OWASP LLM Top 10: geen tool, maar een essentieel referentiekader dat testteams helpt structuur aan te brengen in hun beveiligingstests voor AI-applicaties.
  • Burp Suite extensies: voor teams die al vertrouwd zijn met traditioneel security testen, zijn er extensies beschikbaar die prompt injection tests integreren in bestaande workflows.

Welke tool het beste past, hangt af van de architectuur van de applicatie, het gebruikte taalmodel en de volwassenheid van het testproces. Belangrijk is dat tools nooit een vervanging zijn voor domeinkennis: een tester die begrijpt hoe taalmodellen werken, is effectiever dan een tool die dat niet doet. Wil je weten hoe wij organisaties helpen bij het opzetten van een robuuste teststrategie voor AI-applicaties? Plan een gesprek in en we denken graag met je mee.

Veelgestelde vragen

Hoe weet ik of mijn applicatie kwetsbaar is voor prompt injection als ik geen AI-securityspecialist in huis heb?

Begin met een risicoanalyse op basis van de OWASP LLM Top 10: als jouw applicatie gebruikersinvoer doorgeeft aan een taalmodel, externe data verwerkt via een AI-agent, of een systeemprompt gebruikt met vertrouwelijke instructies, is de kans groot dat er kwetsbaarheden aanwezig zijn. Een praktische eerste stap is het handmatig uitvoeren van een aantal basisaanvallen, zoals het vragen aan de bot om zijn instructies te herhalen of het proberen van een rollenspelscenario. Kom je er zelf niet uit, dan is het verstandig om een gespecialiseerd testteam in te schakelen dat ervaring heeft met AI-beveiligingstests.

Wat is de meest gemaakte fout bij het beveiligen van een LLM-applicatie tegen prompt injection?

De meest voorkomende fout is vertrouwen op uitsluitend invoerfiltering als beveiligingsmaatregel. Teams bouwen een lijst van verboden woorden of patronen, maar aanvallers omzeilen dit eenvoudig via synoniemen, andere talen, base64-codering of creatieve herformuleringen. Effectieve beveiliging vereist een gelaagde aanpak: combineer invoervalidatie met outputfiltering, beperk de rechten van je AI-agent tot het absolute minimum (least privilege), en monitor actief het gedrag van het model in productie.

Hoe ga ik om met het niet-deterministische karakter van taalmodellen in mijn testrapportage?

Documenteer elke succesvolle aanval als een bevinding, ongeacht hoe zelden deze optreedt — een kwetsbaarheid die één op de tien keer wordt uitgebuit, is nog steeds een kwetsbaarheid. Voer testcases minimaal vijf tot tien keer uit en rapporteer zowel de slagingsfrequentie als de ernst van het mogelijke misbruik. In je rapportage is het handig om onderscheid te maken tussen reproduceerbare kwetsbaarheden (hoge prioriteit) en sporadische kwetsbaarheden (medium prioriteit), zodat het ontwikkelteam gericht kan prioriteren.

Zijn er specifieke architectuurkeuzes die prompt injection van nature minder waarschijnlijk maken?

Ja, het principe van least privilege is hier het krachtigst: geef een AI-agent alleen toegang tot de systemen en data die strikt noodzakelijk zijn voor zijn taak. Daarnaast helpt het om een duidelijke scheiding aan te brengen tussen de systeemprompt en gebruikersinvoer via structurering in de API-aanroep, en om uitgaande acties van de agent altijd te laten valideren door een deterministisch systeem voordat ze worden uitgevoerd. Applicaties waarbij de AI alleen leest en adviseert — zonder zelfstandig acties te kunnen uitvoeren — zijn inherent veiliger dan volledig autonome AI-agents.

Hoe integreer ik prompt injection tests in een bestaande CI/CD-pipeline?

Tools zoals Garak en PyRIT bieden command-line interfaces die je kunt aanroepen als onderdeel van een geautomatiseerde testrun. Definieer een vaste set van kritieke testcases die bij elke deployment worden uitgevoerd, en stel drempelwaarden in: als meer dan een bepaald percentage van de aanvalspogingen slaagt, faalt de build. Houd er rekening mee dat API-kosten en uitvoeringstijd van LLM-tests hoger liggen dan bij traditionele tests, dus wees selectief in welke tests je in elke pipeline-run opneemt versus welke je wekelijks of bij grote wijzigingen uitvoert.

Wat moet ik doen als ik tijdens het testen een succesvolle prompt injection aanval ontdek?

Documenteer de aanval gedetailleerd: noteer de exacte invoer, het model en de versie, de systeemprompt (geanonimiseerd indien nodig), en de schadelijke output die werd geproduceerd. Beoordeel vervolgens de impact: welke data of acties zijn bereikbaar via deze kwetsbaarheid? Geef prioriteit op basis van de combinatie van uitbuitbaarheid en impact, en bespreek met het ontwikkelteam welke architecturele of promptwijzigingen de meest duurzame mitigatie bieden. Vergeet niet de fix opnieuw te testen, want aanpassingen aan de systeemprompt kunnen onbedoeld nieuwe kwetsbaarheden introduceren.

Geldt prompt injection ook voor kleinere of bedrijfsspecifieke taalmodellen, of alleen voor grote modellen zoals GPT?

Prompt injection is een fundamenteel risico voor elk systeem dat gebruikersinvoer verwerkt via een taalmodel, ongeacht de grootte of herkomst van het model. Kleinere, fijn-afgestemde modellen zijn in sommige gevallen zelfs kwetsbaarder, omdat ze minder uitgebreide veiligheidsrichtlijnen hebben meegekregen tijdens hun training. Als jouw organisatie een eigen model inzet of een open-source model fine-tunet op bedrijfsdata, is het des te belangrijker om prompt injection expliciet op te nemen in je teststrategie.

Deze inhoud is gegenereerd met behulp van AI en kan fouten bevatten.

Vond je dit artikel interessant? Deel het op social media!