CounterProof

Adversariell kodgranskning: vad termen utelämnar

Uttrycket täcker numera fyra praktiker, från kritikerprompten till huset av människor med angriparblick. Var och en ger angriparens frågeställning; ingen ger på egen hand en undertecknad akt från granskare som är oberoende av er kods författare, graderad efter den bevisnivå varje fynd nådde. Vad vi levererar, vad en andra modell inte kan, och vad vi säger er före köpet.

Adversariell kodgranskning är att läsa källkod med en angripares fråga i huvudet (hur skulle det här kunna fås att göra något det inte ska) i stället för med en förvaltares fråga om koden är korrekt och städad. Det vi levererar under det namnet är en undertecknad fyndakt: varje bekräftat fynd graderat efter den bevisnivå det faktiskt nådde, varje undersökt och sund befunnen yta nedtecknad tillsammans med metoden som undersökte den, framställd av granskare som är oberoende av er kods författare, bedömd av en namngiven person som er förvärvare, försäkringsgivare eller kund kan åberopa, och tillbakadragen skriftligt om den inte håller. Den här sidan säger vad det tillför de andra betydelser uttrycket fått, och vad det kostar.

Vad uttrycket betyder i dag

Enligt vår läsning av marknaden (en sökning i september 2026, ingen kartläggning) bär fyra praktiker namnet. Var och en gör något verkligt. De två första är instrument på vår egen bänk.

Kritikerprompten. En agent skriver en ändring; en andra läser diffen i färsk kontext och ofta från en annan modellfamilj, genom fientliga glasögon. Det tar bort självbedömningen, vilket spelar roll där det gäller: mätt över åtta bedömarmodeller var självpreferensen stor hos en, måttlig hos två, nära noll hos två och något omvänd hos tre (självpreferens, arXiv:2410.21819). Som praktik ger den angriparens frågeställning; den ger inte på egen hand en bevarad akt, ett mått på hur korrelerade de två läsningarna var, eller en underskrift.

Tvågranskarorkestreraren. Två modellfamiljer granskar samma ändring oberoende (ibland blint för varandra) och kritiserar sedan varandra, varpå den ena sammanfattar resultatet och ofta själv genomför rättningen. Den blinda fasen är rätt. Som form lämnar den den granskande modellen som domare över sina egna fynd och som deras reparatör, och den ger på egen hand varken en sanningsgrund eller ett korrelationsmått.

Plattformsensemblen. En granskningsprodukt kör flera modeller inne i sin egen kedja och returnerar kommentarer på pull-requesten med allvarlighetsgrader; namnet bär den mest genom grannskap, eftersom de som beskriver sig så i förkrossande grad bedriver de två första praktikerna. Modellmångfalden är här ett designbeslut hos leverantören; så som den säljs exponerar formen inte vilken modell som sade vad, på vilket underlag, eller hur ofta de är eniga när de har fel. Den ger volym och integration. En kommentarstråd är ingen revision.

Huset av människor med angriparblick. Läsare med offensiv bakgrund läser källkoden som en angripare skulle göra, vare sig som firma eller som folkmassa. Det är här en attack som ingen hade formulerat uppfinns, och det är den praktik vår är byggd att mata snarare än att ersätta. Som form skiljer den inte på egen hand sitt underlag från sin dom, och dess granskares oberoende av varandra är omätt, som allas.

Tre egenskaper, ett enda ord

Tre egenskaper packas ihop i adversariell: uppgiftens inramning (angriparens fråga), feloberoendet mellan granskare, och det organisatoriska oberoendet hos den som undertecknar.

Uppgiftens inramningFeloberoendeOrganisatoriskt oberoende
Kritikerpromptjainte på egen hand, ett uppdrag, en domarenej
Tvågranskarorkestrerarejaen blind fas, omätt; granskaren skiljernej
Plattformsensemblejaleverantörsintern, inte exponeradnej, ett verktyg kan inte underteckna
Mänskligt husjaett enda teamja
CounterProofjaavgränsat och noterat, inte uppmätt: skilda modellinjer, uppdraget i akten, korrelerade eller uteblivna instanser räknas inteja: namngiven undertecknare, oberoende av kodens författare; branschintressen redovisade skriftligt

En andra modell, vald av er, riktad mot det ni visar den, bedömd av er, är ingen motpart. Den är ett andra drag ur en fördelning ni redan står i. Tre glapp följer, och inget av dem är ett problem med modellkvalitet.

Glapp ett: en annan leverantör är inget oberoende vittne

Två modeller från olika företag har olika träningsdata, alltså är enighet en bekräftelse och tystnad ett lugnande besked; så lyder resonemanget. En studie över mer än 350 modeller fann att när två modeller båda har fel enas de om samma felaktiga svar långt oftare än slumpen (i genomsnitt 60 % på en rankning och 42 % på den andra), med par från olika leverantörer med hela vägen; dess uttalande över leverantörsgränser är en slutsats ur studiens regressionsmodell, inte en analys enbart av par över leverantörsgränser (Kim et al., ICML 2025, arXiv:2506.07962). Den mätte riktmärken och gallring av meritförteckningar, inte sårbarhetsgranskning, så den ger ingen överlappssiffra för kod; vad den fastställer är att olika leverantörer inte automatiskt är oberoende. Att detta bör ändra hur ni läser en andra granskares instämmande om er kod är vår slutsats. Textforskarna gjorde samma poäng till regel för fem sekler sedan: en avskrift som visas härstamma från en annan bevarad avskrift stryks ur räkningen, inte för att den är felaktig utan för att den inte tillför något vittnesmål.

Den korrelationskanal man missar är inte leverantören. Det är uppdraget: prompt, verktyg, underlagspaket och rollinramning korrelerar granskare tvärs över leverantörer, och två modeller som räcks samma kurerade paket delar allt det paketet utelämnar. Vi behandlar uppdraget som en del av apparaten och lägger det till akten. Angriparen kan köra vilken modell som helst arbetar igenom vad detta tillåter och inte.

Glapp två: ingen avgör när en åsikt inte bör efterfrågas

Vissa påståenden har ett orakel, något som besvarar dem utan någons åsikt. Körs den här vägen? Kör den. Tillåter specifikationen det här värdet? Läs den. Där ett orakel finns slår ett test som kört en modell som resonerat, och en människa som resonerat likaså.

Frågar man en granskaragent om ett reguljärt uttryck matchar en sökväg producerar den en flytande åsikt om huruvida det gör det. Att i stället skicka den frågan till en körning är ett tekniskt val, och enligt vår läsning har merparten av granskningsverktygen inte gjort det, eftersom kategorin köps på fynd per pull-request och ett fynd som visar sig vara ett tvåminutersskript inte är något fynd. Vi känner svårigheten inifrån: vi byggde en kontroll som skulle framtvinga just den vidarekopplingen och levererade den med sitt självtest definierat och aldrig anropat. Vad som avgör ett fynd är obduktionen.

Påståendena utan orakel (hur allvarligt, är det här tillitsantagandet godtagbart, skulle en angripare bry sig) är omdömesfrågor, och ingen mängd modellutdata förvandlar ett omdöme till ett faktum.

Glapp tre: ingen har undertecknat

En intern agentkörning (hur många modeller som helst, hur isolerade deras kontexter än är) ger ert eget ord om er egen kod, utan att någon utanför er organisation svarar för en enda mening av det. Enligt vår erfarenhet är det den egenskap som en förvärvares jurister, en cyberförsäkrares underwriter och en företagskunds säkerhetsteam frågar efter först, eftersom det är den ert team inte kan leverera om sitt eget arbete.

Enligt Cyber Resilience Act får de flesta tillverkare göra en självbedömning och hålls sedan till varje handling bakom den: rapporter om de provningar som utförts, i den tekniska dokumentationen (bilaga VII punkt 6), som styrker provningsskyldigheten (bilaga I del II punkt 3), bevarade i tio år eller under stödperioden om den är längre (artikel 13.13). Rapporteringen av aktivt utnyttjade sårbarheter började den 11 september 2026; förordningen tillämpas fullt ut från den 11 december 2027. En extern bedömning stöder den akt ni sätter samman; den är inte akten, och vi är inget anmält organ. Standarderna kan glida, rapporteringsdatumet inte behandlar tidplanen.

Vad ni får av oss

Inget av det följande är en hemlighet. Ett välskött team skulle kunna införa vilken som helst av punkterna. Det ni köper är att alla görs, skrivs ned och undertecknas, som en akt ni kan räcka till någon som inte var i rummet.

  1. Oraklet först. Ett avgörbart påstående skickas till körning, kompilering eller specifikation innan någon åsikt beställs om det. Vårt verktyg för granskningspaket vägrar bygga ett uppdrag utan sitt underlagspaket, och uppdraget anger vad det paketet inte kan visa, så att en instans tystnad om något den aldrig fick läses som tystnad och inte som frånvaro.
  2. Instanser är modellinjer, och uppdraget ligger i akten. Granskarna är skilda modellfamiljer; instanser med filåtkomst bygger sitt eget underlag ur källkoden, instanser utan läser bara det uppdraget bär med sig. Uppdraget, verktygen och paketet var och en fick är en del av akten. En instans som uteblev noteras som frånvarande, aldrig som instämmande; en instans som visar sig dela kontext med en annan flaggas och räknas inte, inbegripet den gång en av våra visade sig ha vårt eget fynddokument i sin kontext.
  3. Blinda svar fångas innan någon bedömning finns. Vad varje instans sade, ordagrant, med sitt kuvert (modell, körmiljö, datum, öppnade filer) skrivs ned innan någon jämför dem.
  4. En rösträkning fastställer aldrig något. Fynd stängs inte genom omröstning. Där granskare är oense om vad koden gör avgör källkoden; där ett avslag vilar på ”ovisst” går påståendet till en bevarad kö med en ansvarig, ett utgångsdatum och ett återupptagandekriterium, och exponeras på nytt för en färsk modellinje. Bekräftelsen klättrar på bevisnivån: spår i källkoden, kompileringsbevis, test, reproduktion i drift, och för varje sannolikhetspåstående en andel med intervall och bevarade loggar från varje enskilt försök; allt som stannar under en nivå är endast plausibelt, den andra bestämningen och inte en svagare nivå. En undersökt och sund befunnen yta noteras med metoden som undersökte den och med kontrollen som visade att metoden kan hitta det den letade efter.
  5. En namngiven person undertecknar, och drar tillbaka skriftligt. Under en beteckning era förvaltare och er förvärvare kan åberopa, även när fyndet var vårt eget. Vi publicerar de fall där våra egna instrument fallerade, eftersom en praktik som inte kan visa er var den hade fel inte har någon ställning där den säger sig ha rätt.

Att fråga flera modeller och ta majoriteten är en ensemble; så som den säljs exponerar den inget av detta för köparen. När vi sökte i september 2026 fann vi ingen praktik som erbjuder det här knippet som ett protokoll en köpare kan granska. Det är ett påstående om form, inte om träffandel: vad det handlar om står nedan, i vad vi säger er före köpet.

Var detta sitter i er sårbarhetshantering

Att hitta är inte där vi förtjänar vårt arvode. Skannrar, fuzzers, granskningsplattformar och era egna ingenjörer producerar redan kandidater snabbare än någon hinner bedöma dem, och våra uppdrag hittar också saker; det är biprodukten. Det vi får betalt för sitter där livscykeln brister: bedömningen: en kandidat skickas först till sitt orakel och graderas sedan efter den bevisnivå den nådde, så att allvarlighetsgraden följer beviset och inte en modells tillförsikt; avslutet: oenighet avgörs av källkoden och inte genom omröstning, och ”ovisst” hålls i en bevarad kö med en ansvarig i stället för att tyst bli ”accepterat”; och garantin: utfallet är en akt som en namngiven person utanför er organisation undertecknat och kan dra tillbaka, den del av en teknisk akt, ett due diligence-underlag eller en försäkringsansökan ni inte kan framställa om ert eget arbete. Placera oss i identifieringen så konkurrerar vi med er skanner om volym, ett lopp vi inte springer. Placera oss där ett fynd blir ett beslut någon senare ska försvara, och akten är produkten. Ett fynd är ingen dom täcker det första steget och Vad som avgör ett fynd den avgörande halvan av det andra; den bevarade kön beskrivs ovan. Sårbarhetshantering enligt Cyber Resilience Act går igenom varje steg med CRA:s skyldighet vid vart och ett.

Vad vi säger er före köpet

Detta skyddar er, därför står det på sidan och inte i avtalet.

  • Vi säljer en akt, inte en träffandel. Vi har inte visat att en panel hittar fler verkliga defekter än en enda god granskare, och vi påstår det inte; vi mätte vår fulla apparat mot en enda billig genomgång, förregistrerat och blindbedömt, och den vann ingen av de två målen rakt av: ett förlorade den, och på det andra utlöste den sin egen precisionströskel bara genom att radera de fynd revisorn hade bedömt som verkliga. Vi mätte vår egen metod, och den bar inte sin kostnad. Den fallrapport vi arbetar utifrån säger att en enklare doktrin (en oberoende extern granskning av allt ni kommer att handla på, tvister avgjorda genom att läsa källkoden, ingen omätt siffra publicerad) passar samma underlag; om det är allt ni tar med er från den här sidan, ta med er det. Det vi säljer är akten över att ha gjort det, under en underskrift. Oberoendet mellan våra instanser är avgränsat av förfarandet och noterat, men inte uppmätt för kodgranskning; ingen har mätt det. Varje fynd i akten nådde en namngiven nivå eller är märkt som att det inte gjorde det.
  • Där författaren är med i kretsen. Vår regel är att den som väckt ett omtvistat påstående inte bedömer det ensam. Vår granskande bänk är två personer, vilket betyder färre uppdrag, att vi tackar nej till arbete utanför vårt område, och att den här regeln ännu inte har någon mekanism som framtvingar den; vår egen fallrapport pekar ut den avsaknaden som sin största oåtgärdade svaghet. I praktiken går ett omtvistat påstående till källkoden och till en färsk modellinje innan det stängs, bedömningen noteras, och undertecknaren är namngiven, så att ni kan se vilka fynd som stängdes på det sättet och väga dem själva.
  • Ingen metod når en defekt som inget vittne väckt. Kollationen väljer bara bland det som yttrats. Tester, fuzzing, bevis och en specialists läsning är egna vägar till samma plats, och ett seriöst program använder dem också.
  • Vi är oberoende av er kods författare, inte ointresserade i varje bransch. CounterProof ingår i en koncern som bygger infrastruktur för betalningar och förvaring av digitala tillgångar. Bygger ni på de marknaderna kan vårt närstående bolag vara er granne eller er konkurrent. Vi säger skriftligt vad koncernen bygger och var den verkar före varje uppdrag och innan några pengar rör sig, och vi utfärdar ingen bedömning av kod skriven av CounterProof eller något bolag i vår koncern.

Den långa argumentationen, med sina egna gränser, är vårt arbetsdokument, ett preprint som inte är kollegialt granskat: research.counterproof.io (doi:10.5281/zenodo.22030516).

Frågor vi får

Är adversariell kodgranskning samma sak som ett penetrationstest? Nej. Ett penetrationstest prövar ett system i drift; detta läser källkod vid en fastnålad commit och grundar fynd mot koden. Båda tänker från angriparen, de besvarar olika frågor, och ett seriöst program använder båda.

Kan jag inte bara köra två AI-modeller över min egen kod? Det kan ni, och en andra granskare kan lyfta fram kandidater som den första inte hade. Vad det inte kan ge är organisatoriskt oberoende: ert team väljer vad granskarna får se, formulerar frågorna och bedömer svaren, och ingen utanför det har undertecknat.

En granskningsplattform kör redan flera modeller. Är inte det en panel? Nej. En ensemble vars modeller leverantören väljer, vars enskilda svar ni inte kan se och vars motsägelser löses inne i kedjan är ett instrument med flera delar. En panel är flera instrument vars svar noteras var för sig och vars motsägelser avgörs av källkoden.

Gäller adversariell kodgranskning bara AI-genererad kod? Nej. Metoden bryr sig inte om vem (eller vad) som skrev koden. Maskinskriven kod gör bara glappet svårare att ignorera, eftersom volymen stiger och flytet döljer gissningarna.

Hur skiljer sig detta från ett AI-verktyg för kodgranskning? Sådana verktyg genererar fynd, och vi använder verktyg i den klassen som instrument. Vad ett verktyg inte kan göra är att stå till svars eller underteckna.


De slutsatser som märkts ut som sådana ovan, och här: att en andra granskares instämmande om kod bör skrivas ned (Kim et al. mätte andra områden); att uppdraget korrelerar granskare; att de fyra praktikerna är marknadens form och att granskningsverktyg konkurrerar på fynd per pull-request (vår läsning, en sökning, september 2026); att organisatoriskt oberoende är det förvärvare, försäkringsgivare och företagsköpare frågar efter först (vår erfarenhet, ingen undersökning). Är något här fel rättar vi det skriftligt på den här sidan.