# Adversariële code review: wat de term weglaat

> Vier heel verschillende praktijken gaan inmiddels onder deze naam. Ze bekijken allemaal uw code zoals een aanvaller dat zou doen. Geen ervan geeft u op zichzelf zowel een ondertekend rapport van reviewers buiten uw organisatie als een duidelijke vermelding van hoe ver elke bevinding is bewezen. Hieronder: wat wij leveren, wat een tweede AI-model niet kan, en de grenzen die we noemen voordat u koopt.

Source: https://counterproof.io/nl/adversariele-code-review/ · Published 14 September 2026 · CounterProof is een praktijk van Clavestra Capital Limited (Malta, C 113987).


**Adversariële code review is broncode lezen met de vraag van een aanvaller in het achterhoofd (hoe kan dit ertoe worden gebracht iets te doen wat het niet hoort te doen) in plaats van met de vraag van een maintainer, namelijk of de code correct en netjes is.** Die invalshoek verandert waar een reviewer kijkt. Wat ze op zichzelf niet aantoont, is dat een vermoede fout echt is, dat twee reviewers niet dezelfde vergissing hebben gemaakt, of wie verantwoordelijk is voor de conclusie.

Wat wij onder die naam leveren, is een ondertekend dossier van bevindingen. Elke bevestigde bevinding wordt ingedeeld naar het bewijs dat ze werkelijk heeft bereikt, en elk deel van het aanvalsoppervlak dat zonder bevinding is onderzocht, wordt opgeschreven met de methode waarmee het is onderzocht. De reviewers zijn onafhankelijk van de auteur van uw code, en een persoon met naam en toenaam toetst de bevindingen, zodat uw overnemende partij, verzekeraar of klant het resultaat kan citeren. Een bevinding die de toets niet doorstaat, wordt schriftelijk ingetrokken. Deze pagina zegt wat dat toevoegt aan de andere dingen die de term nu betekent, en wat het kost.

## Wat de term vandaag betekent

In onze lezing van de markt (een zoektocht in september 2026, geen volledige inventarisatie) dragen vier praktijken deze naam. Elk ervan doet iets echts. De eerste twee zijn tools die we zelf gebruiken.

**De criticusprompt.** Eén agent schrijft een wijziging; een tweede, in een nieuwe context en vaak uit een andere modelfamilie, leest de diff door een vijandige bril. Dat neemt de zelfbeoordeling weg, en dat is van belang waar die speelt. Gemeten over acht beoordelende modellen was de voorkeur voor eigen output groot bij één, matig bij twee, vrijwel nul bij twee en licht omgekeerd bij drie ([vertekening door voorkeur voor eigen output](https://counterproof.io/notes/the-illusion-of-the-score/), arXiv:2410.21819). Als praktijk levert dit de invalshoek van de aanvaller. Op zichzelf levert het geen bewaard dossier, geen maat voor hoe sterk de twee lezingen gecorreleerd waren, en geen handtekening.

**De orchestrator met twee reviewers.** Twee modelfamilies reviewen dezelfde wijziging onafhankelijk van elkaar, soms zonder elkaars werk te zien, en bekritiseren daarna elkaars resultaat. Een van beide voegt het resultaat samen en voert vaak ook de fix door. De blinde fase klopt. Maar in deze opzet blijft het reviewende model rechter over zijn eigen bevindingen en ook degene die ze repareert, en op zichzelf levert deze opzet geen ground truth en geen maat voor correlatie op.

**Het platformensemble.** Een reviewproduct laat binnen zijn eigen pipeline meerdere modellen draaien en levert opmerkingen bij pull requests op, met vermelding van de ernst. Het draagt de naam vooral omdat het er dicht bij ligt, want de overgrote meerderheid van degenen die de term voor zichzelf gebruiken, valt onder de eerste twee praktijken. Het gebruik van meerdere modellen is hier een ontwerpkeuze van de leverancier, en zoals het wordt verkocht, laat deze opzet niet zien welk model wat zei, op grond van welk bewijs, of hoe vaak ze het eens zijn als ze ongelijk hebben. Het levert volume en integratie. Een reeks opmerkingen is geen audit.

**Menselijke reviewers die denken als een aanvaller.** Lezers met een offensieve achtergrond beoordelen de broncode zoals een aanvaller dat zou doen, als bedrijf of als crowd. Hier wordt een aanval bedacht die niemand vooraf had geformuleerd, en het is de praktijk waarvoor de onze is gebouwd: om haar te voeden, niet om haar te vervangen. Als vorm scheidt deze praktijk op zichzelf haar bewijs niet van haar vonnis, en de onafhankelijkheid van haar reviewers ten opzichte van elkaar is niet gemeten, net als bij iedereen.

## Drie eigenschappen, één woord

In *adversarieel* worden drie eigenschappen samengebundeld: de **vraagstelling** (de vraag van de aanvaller), de **onafhankelijkheid van fouten** tussen reviewers en de **organisatorische onafhankelijkheid** van wie tekent. Een review kan één eigenschap hebben zonder de andere aan te tonen.

| Praktijk | Vraagstelling | Onafhankelijkheid van fouten | Organisatorische onafhankelijkheid |
|---|---|---|---|
| Criticusprompt | ja | niet op zichzelf, één briefing, één rechter | nee |
| Orchestrator met twee reviewers | ja | een blinde fase, niet gemeten; de reviewer is scheidsrechter | nee |
| Platformensemble | ja | intern bij de leverancier, niet inzichtelijk | nee, een tool kan niet tekenen |
| Menselijke reviewers | ja | één team | ja |
| **CounterProof** | ja | **begrensd en vastgelegd, niet gemeten**: afzonderlijke modelfamilies, de briefing in het dossier, gecorreleerde of mislukte AI-reviewers niet meegeteld | **ja**: een ondertekenaar met naam en toenaam, onafhankelijk van de auteur van de code; belangen in de sector schriftelijk bekendgemaakt |

Een tweede model, door u gekozen, gericht op wat u het laat zien en door u beoordeeld, is geen tegenstander. Het is een tweede trekking uit een verdeling waar u al middenin staat. Daaruit volgen drie gaten, en geen daarvan is een kwestie van modelkwaliteit.

## Gat één: een andere leverancier is geen onafhankelijke getuige

Twee modellen van verschillende bedrijven hebben verschillende trainingsdata, dus is overeenstemming een bevestiging en stilte een geruststelling; zo luidt de redenering.

Een studie naar meer dan 350 modellen vond dat twee modellen die allebei iets fout hebben, het veel vaker dan op grond van toeval te verwachten is eens zijn over *hetzelfde* foute antwoord: gemiddeld 60 procent op de ene ranglijst en 42 procent op de andere. Paren van modellen van verschillende aanbieders waren daarbij steeds meegenomen. De uitspraak van de studie over verschillende aanbieders is een afleiding uit haar regressiemodel, geen analyse van uitsluitend paren van verschillende aanbieders (Kim et al., ICML 2025, [arXiv:2506.07962](https://arxiv.org/abs/2506.07962)).

Ze mat benchmarks en het screenen van cv's, geen review op kwetsbaarheden, en geeft dus niemand het overlapcijfer voor code. Wat ze wel aantoont, is dat verschillende leveranciers niet automatisch onafhankelijk zijn. Dat dit iets moet veranderen aan hoe u de instemming van een tweede reviewer over uw code leest, is onze gevolgtrekking.

Tekstfilologen maakten van hetzelfde punt vijf eeuwen geleden een regel: een afschrift waarvan is aangetoond dat het afstamt van een ander bewaard gebleven afschrift, wordt uit de telling geschrapt, niet omdat het fout is, maar omdat het geen getuigenis toevoegt.

Het correlatiekanaal dat men over het hoofd ziet, is niet de leverancier. Het is **de briefing**: prompt, tools, bewijspakket en rolomschrijving brengen correlatie aan tussen reviewers van verschillende leveranciers, en twee modellen die hetzelfde samengestelde pakket krijgen, delen alles wat dat pakket weglaat. Wij behandelen de briefing als onderdeel van de opzet van de review en bewaren haar bij de review. Dat is een voorzorg tegen een aannemelijke bron van afhankelijkheid, geen meting van de omvang ervan en geen bewijs dat onze werkwijze die wegneemt. [*The attacker can run any model*](https://counterproof.io/notes/the-attacker-can-run-any-model/) werkt uit wat dit wel en niet rechtvaardigt.

## Gat twee: niemand beslist wanneer er geen mening gevraagd moet worden

Sommige beweringen hebben een **orakel**: iets wat ze beantwoordt zonder dat iemands mening nodig is. *Wordt dit pad uitgevoerd?* Voer het uit. *Staat de specificatie deze waarde toe?* Lees die na. Waar een orakel bestaat, weegt een test die is gedraaid zwaarder dan een model dat heeft geredeneerd, en ook zwaarder dan een mens die heeft geredeneerd.

Gevraagd of een regex een pad matcht, produceert een reviewagent een vloeiende mening over de vraag of de regex het pad matcht. Die vraag in plaats daarvan naar een uitvoering sturen is een technische keuze, en in onze lezing heeft de meeste reviewtooling die keuze niet gemaakt, omdat de categorie wordt gekocht op bevindingen per pull request, en een bevinding die een script van twee minuten blijkt te zijn, is geen bevinding. We kennen de moeilijkheid van binnenuit: we bouwden een controle om deze routering af te dwingen en leverden die uit met een zelftest die wel was gedefinieerd maar nooit werd aangeroepen. [*What settles a finding*](https://counterproof.io/notes/what-settles-a-finding/) is de autopsie.

De beweringen zonder orakel (hoe ernstig, is deze vertrouwensaanname aanvaardbaar, zou een aanvaller de moeite nemen) zijn een kwestie van oordeel, en geen hoeveelheid modeloutput maakt van een oordeel een feit.

## Gat drie: niemand heeft getekend

Een interne run met agents (hoeveel modellen ook, hoe geïsoleerd hun contexten ook) levert uw eigen woord over uw eigen code op, zonder dat iemand buiten uw organisatie voor ook maar één zin ervan verantwoordelijk is. In onze ervaring is dat de eigenschap waar de juridisch adviseur van een overnemende partij, de acceptant van een cyberverzekeraar en het securityteam van een grootzakelijke klant als eerste om vragen, omdat het de eigenschap is die uw team niet over zijn eigen werk kan leveren.

Onder de Cyber Resilience Act (officieel: de Verordening cyberweerbaarheid) mogen de meeste fabrikanten de conformiteit zelf beoordelen, en worden zij daarna gehouden aan elk document dat onder die beoordeling ligt: verslagen van de tests die zijn uitgevoerd, opgenomen in de technische documentatie (bijlage VII, punt 6), als bewijs voor de testplicht (bijlage I, deel II, punt 3), bewaard gedurende tien jaar of gedurende de ondersteuningsperiode indien die langer is (artikel 13, lid 13). De meldingsplicht voor actief uitgebuite kwetsbaarheden geldt sinds 11 september 2026; de verordening is volledig van toepassing vanaf 11 december 2027. Een externe beoordeling ondersteunt het dossier dat u samenstelt; ze is niet het dossier, en wij zijn geen aangemelde instantie. [*The standards slipped, the deadline did not*](https://counterproof.io/notes/the-standards-slipped-the-deadline-did-not/) behandelt de tijdlijn.

## Wat u van ons krijgt

Niets van het onderstaande is geheim. Een goed geleid team zou elk onderdeel ervan afzonderlijk kunnen invoeren. Wat u koopt, is dat ze allemaal worden gedaan, opgeschreven en ondertekend, als een dossier dat u kunt overhandigen aan iemand die er niet bij was.

1. **Eerst het orakel.** Een beslisbare bewering gaat naar uitvoering, compilatie of de specificatie voordat er ook maar één mening over wordt gevraagd. Onze tooling voor reviewpakketten weigert een briefing samen te stellen zonder het bijbehorende bewijspakket, en de briefing vermeldt wat dat pakket niet kan laten zien, zodat de stilte van een reviewer over iets wat hij nooit heeft gekregen, wordt gelezen als stilte en niet als afwezigheid.
2. **Reviewers komen uit afzonderlijke modelfamilies, en de briefing zit in het dossier.** Reviewers met toegang tot bestanden stellen hun eigen bewijs samen uit de broncode; reviewers zonder die toegang lezen alleen wat de briefing bevat. De briefing, de tools en het pakket die elk van hen kreeg, maken deel uit van het dossier. Een reviewer die geen bruikbare output opleverde, wordt vastgelegd als *afwezig*, nooit als instemming; een reviewer die context blijkt te delen met een andere, wordt gemarkeerd en niet meegeteld, ook die keer dat een van onze reviewers ons eigen bevindingendocument in zijn context bleek te hebben.
3. **Blinde output wordt vastgelegd voordat er sprake is van toetsing.** Wat elke reviewer zei, woordelijk, met de gegevens van de run (model, de software die het draaide, datum, geopende bestanden), wordt opgeschreven voordat iemand ze vergelijkt.
4. **Een telling stelt nooit iets vast.** Bevindingen worden niet bij stemming afgesloten. Waar reviewers het oneens zijn over wat de code doet, beslist de broncode; waar een afwijzing berust op “onzeker”, gaat de bewering naar een bewaarde wachtrij met een eigenaar, een vervaldatum en een criterium voor heropening, en wordt ze opnieuw voorgelegd aan een modelfamilie die haar nog niet heeft beoordeeld.

   De bevestiging klimt op langs de [bewijsniveaus](https://counterproof.io/glossary/#evidence-rung): broncodetrace, compileerbewijs, test, live reproductie, en voor elke probabilistische bewering een proportie met een interval, waarbij de logs per poging bewaard blijven. Alles wat geen bewijsniveau haalt, is [alleen aannemelijk](https://counterproof.io/glossary/#plausible-only): de andere uitkomst, geen zwakker bewijsniveau. Een deel van het aanvalsoppervlak dat zonder bevinding is onderzocht, wordt vastgelegd met de methode die het onderzocht en de controle die aantoonde dat de methode kan vinden waarnaar ze zocht.
5. **Een persoon met naam en toenaam tekent, en trekt schriftelijk in.** Onder een kenmerk dat uw maintainers en uw overnemende partij kunnen citeren, [ook als de bevinding van onszelf was](https://counterproof.io/notes/we-withdrew-our-own-number/). We publiceren de gevallen waarin onze eigen instrumenten faalden, want een reviewbureau dat u niet kan laten zien waar het ongelijk had, heeft geen gezag waar het zegt gelijk te hebben.

Meerdere modellen raadplegen en de meerderheid volgen is een ensemble; zoals het wordt verkocht, maakt het niets hiervan zichtbaar voor de koper. Toen we in september 2026 zochten, vonden we geen enkele praktijk die dit pakket aanbiedt als een protocol dat een koper kan inzien. Dat is een uitspraak over de vorm, niet over de detectiegraad: daarover gaat wat we u hieronder vertellen voordat u koopt.

## Waar dit past in uw kwetsbaarhedenbeheer

Met vinden verdienen wij ons honorarium niet. Scanners, fuzzers, reviewplatforms en uw eigen engineers leveren al sneller kandidaat-bevindingen op dan iemand ze kan toetsen, en onze opdrachten vinden ook dingen; dat is het bijproduct. Waarvoor we worden betaald, zit op de plek waar de levenscyclus breekt:

- **Toetsing.** Een kandidaat-bevinding gaat eerst naar haar orakel en wordt daarna ingedeeld naar het bewijsniveau dat ze heeft bereikt, zodat de ernst volgt uit het bewijs en niet uit het zelfvertrouwen van een model.
- **Afsluiting.** Onenigheid wordt beslecht door de broncode, niet door een stemming, en “onzeker” wordt aangehouden in een bewaarde wachtrij met een eigenaar in plaats van stilletjes “geaccepteerd” te worden.
- **Zekerheid.** De uitkomst is een dossier dat een persoon met naam en toenaam buiten uw organisatie heeft ondertekend en kan intrekken: het deel van de technische documentatie, een due-diligencepakket of een acceptatieaanvraag bij een verzekeraar dat u over uw eigen werk niet kunt leveren.

Zet ons in bij de identificatie, en we concurreren op volume met uw scanner, een race die wij niet lopen. Zet ons op de plek waar een bevinding een beslissing wordt die iemand later moet kunnen verantwoorden, en het dossier is het product. [*Een bevinding is geen vonnis*](https://counterproof.io/nl/notes/een-bevinding-is-geen-vonnis/) behandelt de eerste fase en [*What settles a finding*](https://counterproof.io/notes/what-settles-a-finding/) de beslechtende helft van de tweede; de bewaarde wachtrij is hierboven beschreven. [*Kwetsbaarhedenbeheer onder de Cyber Resilience Act*](https://counterproof.io/nl/kwetsbaarhedenbeheer/) loopt elke fase door, met bij elke fase de plicht die de CRA oplegt.

## Wat we u vertellen voordat u koopt

Deze punten beschermen u, en daarom staan ze op de pagina in plaats van in het contract.

- **Wij verkopen een dossier, geen detectiegraad.** We hebben niet aangetoond dat een panel meer echte fouten vindt dan één goede reviewer, en dat beweren we ook niet. We hebben onze volledige review met meerdere modellen gemeten tegen één goedkope ronde, vooraf geregistreerd en blind gescoord, en die won op geen van beide codebases zonder meer: op de ene verloor ze, en op de andere haalde ze haar eigen precisiedrempel alleen door de bevindingen te schrappen die de auditor als echt had aangemerkt. [*We measured our own method, and it did not earn its cost*](https://counterproof.io/notes/we-measured-our-own-method/). Het casusrapport waarvan we uitgaan, zegt dat een eenvoudigere doctrine bij hetzelfde bewijs past: één onafhankelijke externe review van alles waarop u gaat handelen, geschillen beslecht door de broncode te lezen, geen ongemeten getal de deur uit. Als u alleen dat van deze pagina meeneemt, neem het dan mee. Wat wij verkopen, is het dossier waaruit blijkt dat het is gedaan, onder een handtekening. De onafhankelijkheid tussen onze AI-reviewers is begrensd door de werkwijze en vastgelegd, niet gemeten voor code review; niemand heeft die gemeten. Elke bevinding in het dossier heeft een benoemd bewijsniveau bereikt of is gemarkeerd als een bevinding die dat niet heeft gedaan.
- **Waar de auteur zelf betrokken is.** Onze regel is dat wie een betwiste bewering heeft ingebracht, die niet als enige toetst. Ons reviewteam bestaat uit twee mensen, wat betekent: minder opdrachten, en werk buiten ons domein afwijzen. Het betekent ook dat er voor deze regel nog geen mechanisme is dat hem afdwingt; ons eigen casusrapport bestempelt dat gemis als zijn grootste onverholpen zwakte. In de praktijk gaat een betwiste bewering naar de broncode en naar een modelfamilie die haar nog niet heeft beoordeeld, voordat ze wordt afgesloten; de toetsing wordt vastgelegd en de ondertekenaar wordt bij naam genoemd, zodat u kunt zien welke bevindingen op die manier zijn afgesloten en ze zelf kunt wegen.
- **Geen methode bereikt een fout die geen getuige heeft aangedragen.** [Collatie](https://counterproof.io/glossary/#collation), het vergelijken van de output van reviewers met elkaar, kiest alleen uit wat is aangedragen. Tests, fuzzing, bewijzen en de lezing van een specialist zijn afzonderlijke routes naar dezelfde plek, en een serieus programma gebruikt die ook.
- **Wij zijn onafhankelijk van de auteur van uw code, niet belangeloos in elke sector.** CounterProof maakt deel uit van een groep die infrastructuur bouwt voor betalingen en voor de bewaring van digitale activa. Als u in die markten bouwt, kan een gelieerde onderneming in een aangrenzende markt actief zijn of met u concurreren. We vertellen u schriftelijk wat de groep bouwt en waar ze actief is, vóór elke opdracht en voordat er geld wordt overgemaakt. Wij geven geen beoordeling af over code die is geschreven door CounterProof of door een onderneming uit onze groep.

Het uitgebreide argument, met zijn eigen grenzen, is ons werkdocument, een preprint, niet peer-reviewed: [research.counterproof.io](https://research.counterproof.io/) ([doi:10.5281/zenodo.22030516](https://doi.org/10.5281/zenodo.22030516)).

## Vragen die we krijgen

**Is adversariële code review hetzelfde als een penetratietest?**
Nee. [Een penetratietest](https://counterproof.io/glossary/#secure-code-review) beproeft een draaiend systeem; adversariële code review leest broncode bij een vastgelegde revisie en stelt bevindingen vast aan de hand van de code. Beide werken vanuit het perspectief van een aanvaller, beantwoorden verschillende vragen, en een serieus programma gebruikt ze allebei.

**Kan ik niet gewoon twee AI-modellen over mijn eigen code laten lopen?**
Dat kan, en een tweede reviewer kan kandidaat-bevindingen aan het licht brengen die de eerste niet vond. Wat dat niet kan opleveren, is organisatorische onafhankelijkheid: uw team kiest wat de reviewers te zien krijgen, formuleert de vragen en beoordeelt de antwoorden, en niemand daarbuiten heeft getekend.

**Een reviewplatform laat al meerdere modellen draaien. Is dat geen panel?**
Nee. Een ensemble waarvan de leverancier de modellen kiest, waarvan u de afzonderlijke output niet kunt zien en waarvan de onenigheid binnen de pipeline wordt opgelost, is één instrument met meerdere onderdelen. Een panel bestaat uit meerdere instrumenten waarvan de output afzonderlijk wordt vastgelegd en waarvan de onenigheid door de broncode wordt beslecht.

**Geldt adversariële code review alleen voor door AI gegenereerde code?**
Nee. Voor de methode maakt het niet uit wie (of wat) de code heeft geschreven. Door machines geschreven code maakt het gat moeilijker te negeren, omdat het volume stijgt en vloeiendheid het giswerk verbergt.

**Waarin verschilt dit van een tool voor AI-code review?**
Die tools genereren bevindingen, en wij zetten tools uit die categorie in als instrumenten. Wat een tool niet kan, is verantwoording afleggen of tekenen.

---

*Als zodanig aangemerkte gevolgtrekkingen, hierboven en hier: dat de instemming van een tweede reviewer over code minder zwaar moet wegen (Kim et al. maten andere domeinen); dat de briefing reviewers onderling doet correleren; dat de vier praktijken de vorm van de markt zijn en dat reviewtooling concurreert op bevindingen per pull request (onze lezing, één zoekopdracht, september 2026); dat organisatorische onafhankelijkheid is waar overnemende partijen, verzekeraars en zakelijke kopers als eerste om vragen (onze ervaring, geen enquête). De verwijzingen naar de Cyber Resilience Act betreffen Verordening (EU) 2024/2847 en zijn gecontroleerd aan de hand van de officiële Nederlandse taalversie. Deze pagina is een vertaling van het Engelse origineel; bij verschillen geldt het origineel. Als we hier iets verkeerd hebben, corrigeren we het schriftelijk op deze pagina.*


## Questions this page answers

**Is adversariële code review hetzelfde als een penetratietest?**

Nee. Een penetratietest beproeft een draaiend systeem; adversariële code review leest broncode bij een vastgelegde revisie en stelt bevindingen vast aan de hand van de code. Beide werken vanuit het perspectief van een aanvaller, beantwoorden verschillende vragen, en een serieus programma gebruikt ze allebei.

**Kan ik niet gewoon twee AI-modellen over mijn eigen code laten lopen?**

Dat kan, en een tweede reviewer kan kandidaat-bevindingen aan het licht brengen die de eerste niet vond. Wat dat niet kan opleveren, is organisatorische onafhankelijkheid: uw team kiest wat de reviewers te zien krijgen, formuleert de vragen en beoordeelt de antwoorden, en niemand daarbuiten heeft getekend.

**Een reviewplatform laat al meerdere modellen draaien. Is dat geen panel?**

Nee. Een ensemble waarvan de leverancier de modellen kiest, waarvan u de afzonderlijke output niet kunt zien en waarvan de onenigheid binnen de pipeline wordt opgelost, is één instrument met meerdere onderdelen. Een panel bestaat uit meerdere instrumenten waarvan de output afzonderlijk wordt vastgelegd en waarvan de onenigheid door de broncode wordt beslecht.

**Geldt adversariële code review alleen voor door AI gegenereerde code?**

Nee. Voor de methode maakt het niet uit wie (of wat) de code heeft geschreven. Door machines geschreven code maakt het gat moeilijker te negeren, omdat het volume stijgt en vloeiendheid het giswerk verbergt.

**Waarin verschilt dit van een tool voor AI-code review?**

Die tools genereren bevindingen, en wij zetten tools uit die categorie in als instrumenten. Wat een tool niet kan, is verantwoording afleggen of tekenen.

