Skip to content
Rutger Hemrika
Menu
← Blog

Beslisrecords · 6/10

Content die het model binnenkomt is onvertrouwd bij elk toegangspunt

Rutger Hemrika5 min leestijd

Beslisrecords, zes van tien. Een architectuurbeslissing per stuk, uit een beheerst AI-agentplatform dat ik als prototype ontwierp en bouwde voor de Nederlandse lokale overheid.

De situatie

Een review van mijn eigen platform liet een scheef dreigingsmodel zien. Alles wat het model verliet was beheerst: tool calls gingen door beleid, outputs waren kandidaten tot promotie, goedkeuringen bonden mensen aan acties. Alles wat het model binnenkwam was, in vergelijking, standaard vertrouwd. Een opgehaald document, een toolresultaat, een geïnstalleerd instructiebestand, een systeemprompt die uit stukken was samengesteld: het landde allemaal in het contextvenster met ongeveer dezelfde status als de eigen instructies van het platform.

Dat is de verkeerde kant op. Het model is de component die het makkelijkst door zijn invoer te sturen is, en gepubliceerd red-team-onderzoek laat keer op keer zien dat contentgebaseerde aanvallen slagen met percentages waar niemand gerust op mag zijn. Als ik de handen van het model beheerste en niet zijn ogen, had ik de verkeerde kant beheerst.

De beslissing

modelcontextinstructiepositie: alleen platformlezen: trustlabels, afgeschermdschrijven: herkomst of quarantaineinstalleren: signatuur, geen scanaanbod: tools uit beleidroutering: verklaard, fallbackminimaliseren: maskeren voor lezen
Zes toegangspunten tot de modelcontext, elk met een benoemde control aan kernelzijde. Detectie informeert; het is nooit de poort.

Elk toegangspunt tot het model is een onvertrouwde grens, en elk toegangspunt heeft een benoemde control aan de kernelkant. Geen algemeen principe, een specifieke control per pad.

Lezen. Elk item dat in de context wordt geplaatst draagt een vertrouwenslabel: platform, principal, tool, opgehaald, onbekend. Alleen platforminstructies mogen de instructiepositie innemen. Elk ander fragment wordt structureel afgeschermd, geplaatst binnen een afgebakend gebied dat het model als data moet behandelen, en de afscherming wordt door een deterministische parser gecontroleerd voordat de prompt wordt verzonden. Een toolresultaat dat zijn gedeclareerde schema niet haalt, wordt geweigerd, niet doorgegeven met een waarschuwing.

Schrijven. Alles wat wordt geschreven naar opslag die het model later leest, draagt provenance per chunk. Een chunk waarvan de provenance onbekend is, gaat in quarantaine: opgeslagen, zichtbaar voor beheerders, niet ophaalbaar door het model.

Installeren. Instructieartefacten, de bestanden die een agent vertellen hoe hij zich moet gedragen, worden uitsluitend toegelaten op provenance en ondertekening. Waar het vandaan komt en wie het heeft ondertekend. Nooit op contentscanning. Een scanner die zegt “dit ziet er onschuldig uit” is geen grond voor toelating.

Aanbieden. De tools die een agent ziet, worden afgeleid uit hetzelfde beleid dat de uitvoering autoriseert. Er is geen aparte toollijst. Als beleid een aanroep zou weigeren, wordt de tool niet aangeboden, zodat het model niet overgehaald kan worden iets aan te roepen dat het nooit te zien kreeg.

Routing. De retrieval-strategie voor een run wordt vooraf gedeclareerd, en als die terugvalt op een andere strategie, wordt de terugval vastgelegd. Een stille overstap van een beheerste index naar een open zoekopdracht is zelf een aanval op een toegangspunt.

Minimalisatie. Geheimen en identificatoren worden gemaskeerd voordat het model ze leest. Het model krijgt een placeholder; de kernel bewaart de koppeling.

De wet van Postel leerde een generatie engineers om ruimhartig te zijn in wat ze accepteren. Voor content die een model binnenkomt is het het slechtste advies dat er is, en het is nog steeds de standaard in de meeste frameworks.

Wat ik afwees, en waarom

Per item beslissen. Elke bron bekijken, besluiten of je die vertrouwt, doorgaan. Dit is wat de meeste teams doen en het levert inconsistentie op: dezelfde soort content wordt op dinsdag vertrouwd en op donderdag afgeschermd, afhankelijk van wie ernaar keek. Een control per toegangspunt is consistent door constructie.

Een detector als poort. Een injectieclassifier op binnenkomende content draaien en blokkeren wat hij markeert. Detectie is onvolledig, en het gepubliceerde onderzoek is duidelijk dat dat zo blijft. Een detector mag informeren, en in het platform doet hij dat, als signaal naar beleid. Hij mag niet het ding zijn dat over toelating beslist.

Toelating op basis van scanners voor instructieartefacten. Zelfde reden, scherper: gepubliceerd onderzoek over het omzeilen van contentscanners voor instructiebestanden is niet bemoedigend, en een artefact dat voor elke toekomstige run in de instructiepositie zal staan, is niet iets wat je toelaat op het woord van een scanner.

Wat het kost

Een parser in het promptpad. Elke prompt wordt gecontroleerd voordat hij wordt verzonden, wat latentie is en een component die zelf bugs kan hebben. Een schema voor elk toolresultaat, bijgehouden naast de tool. Provenance op elke geschreven chunk, wat betekent dat elke schrijver moet worden aangepast. Een ondertekeningsproces voor instructieartefacten, met sleutels, rotatie en de menselijke workflow eromheen. En een maskeringslaag die in beide richtingen klopt, anders krijgt het model een echte identificator of krijgt de inwoner een placeholder.

Wat het niet doet

Drie grenzen, gewoon gezegd.

Afscherming beperkt hoe de prompt wordt opgebouwd. Het beperkt niet hoe het model denkt. Een model dat een afgeschermd fragment leest en zich toch door de inhoud laat overtuigen, heeft de afscherming niet doorbroken; het heeft gedaan wat modellen doen. De afscherming maakt de aanval moeilijker en het record duidelijker. Het maakt het model niet immuun.

Quarantaine kan een correct gelabelde leugen uit een vertrouwde bron niet vangen. Als een ondertekend document met provenance uit een vertrouwd systeem iets onwaars zegt, wordt het opgehaald en leest het model het. Provenance vertelt je wie het zei, niet of het waar is.

En er zijn geen drempels vastgesteld. Welke vertrouwenslabels samen mogen voorkomen, hoeveel content met onbekende provenance een run richting weigering duwt, welke score van de detector het waard is om op te handelen: dat zijn in het prototype open parameters gebleven. De controls bestaan. Hun afstelling niet.

Als je een ding meeneemt

Teken het contextvenster dat je agent daadwerkelijk verstuurt, en label elk fragment met waar het vandaan komt. Als meer dan een bron de instructiepositie kan innemen, begin daar.

Niet knipperen. Het opgehaalde document is alleen onschuldig zolang je ernaar kijkt, en daarom wordt het hek gecontroleerd door een parser die nooit wegkijkt.

Verwijzingen

De knipogen en citaten in dit stuk, met hun herkomst:

  • Jon Postel, RFC 761 (1980): “be conservative in what you do, be liberal in what you accept from others”, the robustness principle.
  • Doctor Who, “Blink” (BBC, 2007): “Don’t blink.”

Rutger Hemrika

AI-strategie en -governance voor sectorsoftware. Schrijft vanuit bouwen, niet vanuit slides; elke claim draagt een bewijsniveau.

Volledige ervaring · Over mij

De case achter deze reeksEen governed AI-agentplatform voor Nederlandse gemeentenVan de grond af ontworpen en gebouwd op de premisse dat agents alleen bestuurbaar zijn als elke grensoverschrijding wordt bestuurd.