Jailbreak (AI)
Wat is een jailbreak?
Een jailbreak is een invoer die een model zijn eigen regels laat negeren. Het model is getraind en geïnstrueerd om bepaalde dingen te weigeren, en een jailbreak is de formulering die het toch doet meegaan.
De naam komt van gsm's, waar jailbreaken betekende dat je de beperkingen van de fabrikant weghaalde. Dat idee vertaalt goed. Je breekt niet in in het model, je praat het uit de grenzen die iemand erop gezet heeft.
Wat er precies omzeild wordt, is de moeite om scherp te stellen, want er zijn twee lagen. Er is de veiligheidstraining die de aanbieder in het model gebakken heeft. En er is de systeemprompt die jij voor je eigen toepassing geschreven hebt: blijf bij onze producten, noem nooit een prijs, verwijs medische vragen altijd door naar een mens. Een jailbreak kan op allebei mikken. In de praktijk zijn jouw eigen regels het zachtste doelwit, want dat zijn instructies in een prompt en geen dingen die in de gewichten getraind zitten.
Jailbreak en prompt injection
Deze twee termen worden door elkaar gebruikt alsof ze hetzelfde zijn, en de verhouding is specifieker dan dat.
OWASP plaatst jailbreaken binnen prompt injection. Prompt injection is de brede categorie: het gedrag van een model sturen via zorgvuldig opgestelde invoer. Jailbreaken is het bijzondere geval waarbij die invoer het model zijn veiligheidsprotocollen volledig laat negeren.
Het andere onderscheid dat je best meedraagt, is direct tegenover indirect. Een directe injectie komt van de persoon die typt. Een indirecte injectie komt uit inhoud die het model leest: een webpagina, een mail, een document dat een tool ophaalt. Dat verschil telt enorm voor wie de aanvaller kan zijn. Bij een directe jailbreak is je eigen gebruiker degene die het probeert. Bij een indirecte is een vreemde die tekst in een document gezet heeft degene die het probeert, en je gebruiker heeft geen idee dat het gebeurt.
De patronen die blijven werken
De concrete formuleringen verouderen snel, want aanbieders repareren ze. De vormen eronder niet.
Rollenspel en fictie. Het model vragen om een personage te spelen dat geen beperkingen heeft, of om een verhaal te schrijven waarin een personage het bewuste ding uitlegt. De vraag wordt herverpakt als creatief schrijven in plaats van als een vraag.
Coderen en verhullen. De vraag wordt in Base64 geschreven, in leetspeak, achterstevoren, met spaties tussen de letters, of met Unicode-tekens die op gewone letters lijken. Het model leest het nog altijd, en de veiligheidslaag herkent soms niet meer waar ze naar kijkt.
Opbouwen over meerdere beurten. In plaats van één keer te vragen, bouwt de aanvaller context op doorheen een gesprek. Elke boodschap is op zich onschuldig, en het model heeft met een kader ingestemd voor de echte vraag komt.
Geleidelijk opschuiven. Een crescendo-aanval zet kleine stapjes, elk net iets verder dan het vorige. Geen enkele boodschap ziet eruit als iets om te weigeren, en het model heeft het moeilijk om nee te zeggen tegen een kleine uitbreiding van iets waar het net ja op zei.
Gezag claimen. Tekst die beweert dat de ontwikkelaar aan het woord is, dat de regels bijgewerkt zijn, of dat dit een goedgekeurde test is. Modellen hebben geen manier om na te gaan wie er zit te typen.
Wat het risico echt verlaagt
Je lost dit niet op in de promptlaag. Een model valt altijd tot op zekere hoogte om te praten, dus de echte verdediging is dat je de zaken zo inricht dat een geslaagde jailbreak weinig oplevert.
De preventielijst van OWASP voor prompt injection leest als een reeks architectuurbeslissingen en niet als prompttips, en dat is precies het juiste instinct.
Begrens wat het model mag doen en niet enkel wat het mag zeggen. Een agent die alleen kan lezen, laat zich niet overhalen om te schrijven.
Leg het uitvoerformaat vast en controleer het. Verwacht je systeem een JSON-object met drie velden, dan wordt een opstel door je eigen code geweigerd voor iemand het ziet.
Filter invoer en uitvoer. Een laag inhoudscontrole rond het model vangt een categorie pogingen op de weg naartoe en een categorie resultaten op de weg terug.
Pas minimale rechten toe op wat het model bereikt. Het model krijgt de rechten die de taak nodig heeft en niets meer. Dit is veruit het meest doeltreffende punt in de lijst.
Vraag menselijke goedkeuring voor acties met een hoog risico. Geld versturen, records verwijderen, een klant mailen. Een jailbreak die aan een bevestigingsvenster geraakt, heeft niet veel bereikt.
Scheid en markeer externe inhoud. Tekst die uit een document komt is data en geen instructie, en je systeem hoort ze zo te behandelen.
Test aanvallend. Val je eigen systeem met een vaste regelmaat aan, zodat jij het ontdekt voor iemand anders het doet.
Waar moet je op letten bij jailbreaks
Je systeemprompt is geen beveiligingsgrens. Regels die in een prompt staan, zijn instructies die het model meestal volgt en geen beperkingen die het niet kan doorbreken. Alles wat nooit mag gebeuren, hoort in je code of in je rechten te zitten.
Ga ervan uit dat je systeemprompt leesbaar is. Een model zijn eigen instructies laten prijsgeven is een van de makkelijkere jailbreaks. Zet er dus niets in dat je een klant niet zou tonen, en zet er zeker nooit een wachtwoord of een sleutel in.
Elke tool vergroot het gevolg. Een gejailbreakte chatbot zegt iets gênants. Een gejailbreakte agent met een mailbox en een betaaltool doet iets duurs. De blootstelling groeit met je toolset en niet met je model.
Indirecte aanvallen gaan volledig langs je gebruiker heen. Leest je systeem binnenkomende mail, opgehaalde documenten of webpagina's, dan hoeft een aanvaller je gebruikers nooit te spreken.
Een patch is geen oplossing. Een jailbreak die na een modelupdate niet meer werkt, werkt niet meer voor díé formulering. De vorm waar hij toe behoort bestaat nog, en iemand vindt de volgende formulering.