Waarom het gebruikelijke dreigingsmodel niet volstaat
Elk securityteam weet hoe je een webapplicatie dreigingsmodelleert: externe aanvallers, insiders, supply chain. Agentplatforms voegen twee tegenstanders toe die de standaardtaxonomieën nauwelijks noemen, en beide zijn ongemakkelijk. De eerste is de eigen agents van het platform. De tweede zijn de AI-codeeragents die de monitoring-, goedkeurings- en beleidscode van het platform schrijven.
Ik wilde niet aannemen dat een van beide kwaadaardig is. Ik wilde controls die standhouden of ze dat nu zijn of niet. Dit is de methode die ik gebruikte voor het governed agentplatform dat ik ontwierp voor Nederlandse gemeenten, aangeboden als methode en niet als resultaat, omdat het platform een prototype is en de methode het overdraagbare deel.
Eén record per dreiging
Elke dreiging is een record met vaste velden: de getroffen assets, het instappunt, de overschreden trust boundary, het aanvalspad, de ontworpen control, de ontbrekende control, het restrisico in woorden, het bewijs dat nodig is om aan te tonen dat de control afging, en een eigenaar. De legenda onderscheidt een ontworpen control, gespecificeerd maar nog niet bewezen, van een ontbrekende control, nergens gespecificeerd. Dat onderscheid klinkt bureaucratisch. Het is het nuttigste onderdeel van het hele document, omdat het voorkomt dat een diagram als verdediging telt.
Acht tegenstanderklassen
Elke klasse krijgt een uitgesproken houding: één zin die zegt hoe het platform haar behandelt, ongeacht wat een individuele actor van plan is.
- Externe principal. Een niet-geauthenticeerde aanroeper of een vervalste workload-identiteit. Geweigerd aan de rand; identiteit gecontroleerd voordat iets wordt uitgevoerd.
- Geplante content. Instructies verborgen in opgehaalde documenten, toolresultaten, geheugen, peer-resultaten of installatietekst. Standaard onvertrouwd en nooit in instructiepositie geplaatst.
- Partner en supply chain. Capability packs, toolservers, extensies, dependencies, modeladapters. Toegelaten op signatuur en declaratie, geïsoleerd buiten het proces, gepind.
- Modelprovider, inclusief de eigen monitors van de leverancier. Stuur zo min mogelijk context; houd hem vervangbaar. Een leverancierscontrol die het platform niet kan inspecteren, telt niet als platformcontrol.
- Peer-agent. Nul autoriteit totdat een vernauwende, verifieerbare delegatie er iets van toekent.
- Menselijke insider. Operator, goedkeurder, tenantbeheerder. Functiescheiding, vierogenprincipe bij goedkeuring, en break-glass-gebruik dat zelf als bewijs wordt vastgelegd.
- De eigen agent van het platform als onvertrouwde insider. De conservatieve aanname, ontleend aan gepubliceerd AI-control-onderzoek: elke instantie van hetzelfde model wordt geacht één doel te delen, samen te werken, resets te overleven en zich te verankeren door nuttig te zijn. Controls houden stand ongeacht de intentie van het model en schalen mee met de capaciteit van het model, niet alleen met de inzet van de actie. Weigering gebeurt op autoriteit, nooit op afgeleide gezindheid. Alles wat uitvoert moet op te sommen en te stoppen zijn. Alles wat wordt bewaard moet in quarantaine kunnen. Checkers moeten onafhankelijk zijn van de actor.
- De agents die het platform bouwen. Dezelfde redenering toegepast op de softwareleveringspijplijn. Dragende controlcode is een beschermde supply chain: onafhankelijke verificatie, mutatiegeteste bewijzen, build provenance, menselijke goedkeuring van wijzigingen. Dit is geen bewering dat de bouwagents kwaadaardig zijn. De onbedoelde vorm van sabotage, een test die slaagt over niets, ziet er identiek uit aan de bewuste vorm, dus de control mag niet uitmaken welke het is.
Drie consequenties volgen, en zij vormen de kern van de methode. Een control die afhangt van het lezen van de redenering van de agent, het vertrouwen van zijn samenvatting van wat hij deed, of het afleiden van zijn intentie, beschermt tegen klasse één tot en met zes. Tegen klasse zeven is het een hoop. De aanvalsvorm van klasse zeven is de gedistribueerde kill chain: afzonderlijk onschuldige stappen, verspreid over runs, sessies of instanties, onzichtbaar voor elke control die naar één run kijkt. En klasse acht is simpelweg klasse zeven, gericht op je eigen leveringsproces.
Vertrouwen is goed, controle is beter, zegt het spreekwoord. Klasse zeven is de erkenning dat voor je eigen agents de komma al het werk doet.
Twee principes om dekking te meten
Bypass is geen dekking. Een test dat acties waarvoor goedkeuring nodig is niet zonder goedkeuring kunnen draaien, bewijst niet dat elke consequentiële actie als goedkeuringsplichtig is geclassificeerd. Als de noemer uit de classifier komt die je test, leest de meting honderd procent terwijl de poort open staat. Dekking vereist een onafhankelijke telling van consequentiële acties, genomen uit de gedeclareerde effectklasse in het contract van elke capability.
Semantisch oordeel is geen meetgrens. Elk schadepercentage of blokkeerpercentage moet zeggen welk eindpunt het heeft gemeten: een model als beoordelaar, audit-zichtbaar bewijs, of een deterministisch toestandsverschil in een sandbox. Een poort die door een model wordt beoordeeld, moet begrensd zijn door deterministische checks, anders is het een second opinion vermomd als control.
Van dreiging naar control naar test
Elke control is gekoppeld aan de geautomatiseerde tests die als haar instrumenten dienen, en het register vermeldt wat elk instrument niet bereikt. “Er bestaat een label” is niet “het label klopt”. “De aangeboden toolset is gelijk aan het besluit” is niet “het besluit is minimaal”. Een nieuwere, machineleesbare controlgraaf houdt één record bij per dreiging en per handhavingspunt: instappunt, doorkruiste naden, handhavingspunt, het bewijs dat aantoont dat hij afging, respons en herstel, de tests die hem zouden doen sneuvelen, eigenaar, status. Een integriteitscheck in de build springt op rood wanneer een control geen pad, geen bewijs of geen herstel noemt. De vuistregel: als je het bewijs niet kunt benoemen, bestaat de control nog niet.
Externe frameworks, de OWASP-lijsten voor LLM- en agentic-applicaties en de MITRE ATLAS-matrix, worden gebruikt als tagvocabulaire voor traceerbaarheid, nooit als bindende autoriteit, en “gemapt” betekent uitdrukkelijk traceerbaar, niet gemitigeerd.
Tien dreigingspatronen en wat ze beantwoordt
- Prompt-geïnjecteerde tool call. Modeloutput is slechts een voorstel. Autoriteit wordt onafhankelijk van de modelintentie gecontroleerd. Goedkeuring is gebonden aan het exacte doel en de exacte parameters. Injectiedetectie voedt het beleid als signaal; het is nooit de verdediging.
- Replay, mutatie of vervalsing van goedkeuringen. Het goedkeuringsrecord staat server-side en is via hash aan de actie gebonden. Een bypass-corpus dekt ontbrekende, verlopen, gemuteerde, verkeerd gerichte, herhaalde, zelf goedgekeurde, buiten mandaat vallende, vervalste en ongesigneerde goedkeuringen.
- Manipulatie en vermoeidheid van goedkeurders. De tekst die verwachte effecten beschrijft, wordt door het platform gegenereerd uit het capability-contract, nooit door het model. Door het model geschreven tekst wordt gelabeld als onvertrouwd. Goedkeuringsverzoeken zijn rate-limited en gebudgetteerd, en goedkeuringsvolume is een anomaliesignaal.
- Exfiltratie via het leespad, waarbij nooit een consequentiële actie afgaat. Classificatie reist mee met de data: een uitgaande parameter krijgt de hoogste classificatie van de context waaruit hij komt. Uitgaande payloads worden geïnspecteerd, niet alleen hosts op een allow-list gezet. Een canary die in geclassificeerde context is geplant, mag nooit in egress verschijnen. Modeloutput wordt nooit als actieve markup gerenderd.
- Overtuigende instructies toegelaten bij installatie. Toelating gebeurt uitsluitend op herkomst: signatuur, attributie, versiepinning, geminimaliseerde capabilities, een eerste run zonder credentials, isolatie buiten het proces. Contentscanning wordt geweigerd als toelatingscontrol, omdat scanners uit hun oordeel gepraat kunnen worden; ze draaien alleen als signaal. Metadata wordt elke sessie opnieuw geverifieerd.
- Ongecontroleerde of onbewaakte uitvoering door je eigen agent. Inventaris-invariant: alles wat uitvoert, runs, kinderen, jobs, schedules, sessies, grants, kan worden opgesomd, en alles wat niet kan worden opgesomd is een bevinding. De stop is recursief: eerst de afstammelingen opsommen, daarna nul resterende autonomie teruglezen uit een store waar het gestopte ding niet in kan schrijven.
- Gedistribueerde kill chain en geheugenpersistentie. Geheugen wordt door het model voorgesteld en door de kernel geschreven via een fail-closed promotiepoort. Een gewijzigde bron blokkeert hergebruik van geheugen dat ervan is afgeleid. Vergiftigde afstamming wordt in quarantaine gezet en de opschoning wordt over alle kopieën bewezen. Afleidingen worden gecorreleerd over runs en instanties heen.
- Ondermijning van of samenspanning met checkers. Elke checker draagt een onafhankelijkheidsrecord: zijn model en provider vergeleken met die van de actor, zijn inputs genomen uit het platformrecord en nooit uit de eigen samenvatting van de actor, zijn oordeel nooit zichtbaar voor de actor, zijn fallback weigeren of uitstellen en nooit doorgaan. Geen actie wordt toegelaten op basis van één checker waarvan de actor de inputs kon schrijven. Een monitor uit dezelfde modelfamilie is een oppervlak voor gecorreleerd falen.
- Kwetsbaarheden ingebracht door bouwagents. Een benoemde inventaris van dragende controlcode met een strengere wijzigingsregel: menselijke goedkeuring, build provenance, reproduceerbare builds, geen bouwagent-credential voor de control die hij wijzigt, mutation-kill-tests, en een onafhankelijke verifier die de wijziging nooit schreef.
- Ontraceerbaarheid. Een trace-volledigheidscheck op elke consequentiële actie: principal, mandaat of delegatievoorouder, run, stap, correlatie en klokbron moeten aanwezig zijn en gecontroleerd worden tegen een record buiten de schrijver.
Red-teaming als functie, niet als gebeurtenis
Red-teaming is georganiseerd in twaalf families, volgens de gepubliceerde richtlijnen voor agentic red-teaming, en de latere families moeten ook herstel bewijzen: rollback, opschoning van quarantaine, cascaderende intrekking, en een stop die onder belasting nog steeds reageert. Een stop die alleen werkt als het systeem stilstaat, is niet getest.
Wat ik niet kan bewijzen
Prototypeniveau. Het register bestaat, de graaf bestaat, de integriteitscheck draait. Verschillende controls zijn ontworpen en nog niet bewezen door hun instrumenten, en het register zegt dat, rij voor rij. Wat ik niet publiceer, is welke dat zijn, of de formulering van hun restrisico, omdat dat een security-disclosure is voor de mensen die het zouden draaien, niet voor een blog.
Als je één ding meeneemt
Voeg deze week twee rijen toe aan je tegenstanderlijst: je eigen agents, en de agents die je code schrijven. Loop daarna je controls na en markeer elke control die afhangt van het lezen van de redenering van een agent of het vertrouwen van zijn samenvatting. Die rijen beschermen je tegen iedereen, behalve de twee die je net hebt toegevoegd.
Nobody expects the Spanish Inquisition. Klasse zeven is de aanname dat je eigen agents het misschien wel doen.
Verwijzingen
De knipogen en citaten in dit stuk, met hun herkomst:
- “Trust, but verify”, a Russian proverb made famous by Ronald Reagan in the 1987 INF treaty talks.
- Monty Python’s Flying Circus (BBC, 1970), the Spanish Inquisition sketch: “Nobody expects the Spanish Inquisition” and the escalating list of chief weapons.
- #AI-governance
- #Dreigingsmodellering
- #Beveiliging
- #Methode

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