Security Blog

Jij hebt het werk over dertien agents verdeeld. Paperclip heeft de sleutel niet gesplitst.

#217

October 2, 2026 · By Marketing team

← All posts

Een scan van een agentframework met 71.000 sterren vond twaalf van de dertien agents met hetzelfde token in platte tekst. Zodra je een vloot agents draait, stopt "het geheim zit in de config" met een shortcut te zijn en wordt het een multiplier. <<<CLV-SUBTITLE>>>

Je hebt het moderne ding gedaan. In plaats van één grote agent heb je een vloot opgetuigd — één om tickets te triëren, één om copy te schrijven, één om de designpipeline te draaien, een dozijn in totaal, elk met zijn eigen taak en zijn eigen config. Dat voelt veiliger. Kleinere blast radius. Meer least-privilege.

Daarna liep een securityscan door de configs van een agentframework met 71.000 sterren, Paperclip, en vond dat twaalf van de dertien agents dezelfde credentials droegen — een identiek token, in platte tekst in de config van elke agent geplakt [1]. Eén Anthropic API-sleutel stond hardcoded in de config van een designagent, in leesbare vorm. Een bottoken dat voor één agent bedoeld was, was leesbaar voor agents die er niets mee te maken hadden.

Dertien deuren. Eén sleutel, in twaalf ervan gekopieerd. Steel hem van de zwakste agent en je hebt de andere elf.

Wat er precies gebeurde

Paperclip geeft elke agent een MCP-serverconfig — het bestand dat de agent vertelt welke tools en diensten hij kan bereiken en hoe hij zich daarbij authenticeert. Onderweg zijn de secrets rechtstreeks als platte tekst in die bestanden terechtgekomen: een n8n JWT, een bearertoken, een Anthropic API-sleutel. Niet als verwijzing. Niet geïnjecteerd op runtime. Getypt — en daarna, omdat het opstarten van de volgende agent een kopiëren-plakken is, over de hele vloot gedupliceerd.

De scan markeerde drie dingen. De gedeelde platte-tekst-tokens over twaalf agents (beoordeeld als HIGH). De Anthropic-sleutel die in leesbare vorm in de config van een designagent stond (beoordeeld als CRITICAL). En een bottoken met reikwijdte voor agents waarvoor het nooit bedoeld was — een simpele least-privilege-fout [1]. Tot hun eer: het Paperclip-team is snel in actie gekomen. Ze migreerden naar credential-verwijzingen, anonimiseerden config bij cross-agent reads, en begonnen binding-sync af te dwingen [2]. De juiste richting.

Dit is niet Paperclip dat nonchalant is

Dit is het deel om even bij stil te staan. Paperclip deed wat bijna elk framework doet. Een secret in een configbestand zetten is hoe software zich al dertig jaar authenticeert. Het werkte omdat er één app was, één config, één operator die wist waar de sleutel lag.

Het tijdperk is onder die gewoonte veranderd. Een multi-agent-systeem is niet één app met één config — het is een dozijn processen, elk met een bestand, elk een kopie van de vorige. Plattekst-in-config was een tolerable shortcut toen er één lekplek was. Bij dertien betekent dezelfde shortcut dat één lek dertien lekken is — en "welke agent heeft dat gedaan?" heeft geen antwoord, want het token in de log hoorde bij ze allemaal.

Credential-verwijzingen — de fix die Paperclip heeft uitgebracht — zijn echt beter. Maar let op wat ze wel en niet veranderen. Een verwijzing lost nog steeds op naar een echt secret op de plek waar de agent draait; de agent, of wat hem ook compromitteert, kan de opgeloste waarde nog steeds lezen. En de bugtracker van het framework zelf laat al de volgende failure mode zien: een verwijzing die uit sync raakt met zijn binding, waardoor de config er gevuld uitziet terwijl validatie stilletjes faalt [3]. Het secret is één laag naar achteren verplaatst. Het gebouw is het niet uit.

Het is niet alleen Paperclip

Zelfde week, zelfde root cause, andere repo's. Een veelgebruikte coding agent werd gemeld omdat ruwe .env-waarden — wachtwoorden, tokens, API-sleutels — rechtstreeks in zijn chatuitvoer belandden. Een andere agent runner gaf zijn volledige parent environment door aan subprocessen, waardoor elke providersleutel zichtbaar was voor een child process [4]. Een voice hook schreef transcripten, credentials en al, in world-readable /tmp [5]. Onafhankelijke teams, onafhankelijke threat models, één gedeelde aanname: dat het prima is als het secret leeft waar de agent het kan zien. Het hele argument dat een aanvaller hoeft te maken, is dat dat niet zo is.

Hier bewust voor gebouwd

Clavitor vertrekt vanuit de tegenovergestelde aanname: de agent houdt de credential nooit in handen. Hij vraagt om een actie; het verzoek wordt onderschept, geauthenticeerd tegen een secret dat de agent niet kan lezen, en uitgevoerd. Er is geen config om een token in te plakken, omdat er geen token in de config zit. Niets om over dertien agents te kopiëren, omdat de omgeving van de agent nooit hetgeen bevat dat de moeite van het stelen waard is.

Elke agent bereikt alleen waarvoor hij is benoemd — niet de hele kluis — dus een bottoken kan niet leesbaar eindigen bij een agent die er nooit om vroeg. En elke actie wordt gelogd op de specifieke actor die hem uitvoerde, nooit op een gedeeld token dat twaalf agents gemeen hadden — dus "welke heeft dat gedaan?" heeft een antwoord.

De eerlijke kant: dit maakt een agent niet onhackbaar. Een gecompromitteerde agent kan nog steeds op het moment zelf de dingen doen waarvoor hij geautoriseerd was. Wat hij niet kan doen, is met de sleutel weglopen en de andere twaalf worden — want er is geen sleutel in zijn handen om mee weg te lopen.

De les is niet "roteer het token"

Paperclip gaat de tokens roteren, de migratie afmaken en de issues sluiten. Goed — dat moeten ze ook. Maar de rotatie is niet de les. De les is dat zodra je een vloot agents hebt in plaats van één app, "het geheim zit in de config" stopt met een shortcut te zijn en een multiplier wordt. Je lost een multiplier niet op door het secret iets moeilijker leesbaar te maken. Je lost het op door te zorgen dat het secret nooit in de handen van de agent is geweest.

We hebben de regels opgeschreven waarvan wij vinden dat een credential-tool ze in het agenttijdperk hoort te houden — waaronder dat het secret nooit leeft waar de code draait, en dat een agent alleen bereikt waarvoor hij is benoemd. Leg de jouwe ernaast: clavitor.ai/rules.

Clavitor (@clavitorai) is de credentialkluis gebouwd voor AI-agents, en tegen hen. clavitor.ai

Bronnen

[1] Paperclip agent framework — bevindingen over credential-hygiëne (CFG-H1 gedeelde platte-tekst-tokens, CFG-C1 hardcoded Anthropic-sleutel, CFG-H2 bottoken met verkeerde reikwijdte): https://github.com/paperclipai/paperclip

[2] Paperclip — secret-binding-sync tussen agents afdwingen over lifecycle-flows (gemerged): https://github.com/paperclipai/paperclip/pull/8307

[3] Paperclip — secret_ref-env-items kunnen uit sync raken met secret_bindings-rijen, config lijkt gevuld maar validatie faalt stilletjes (#8309): https://github.com/paperclipai/paperclip/issues/8309

[4] Chetter — runBatchAgent erft de volledige runner-omgeving, waardoor provider API-sleutels zichtbaar worden voor de subprocess (#56): https://github.com/flatout-works/chetter/issues/56

[5] Claude Code voice hook — volledige transcripten (inclusief credentials) weggeschreven naar world-readable /tmp (#58): https://github.com/rodlaneedu-hash/claude-code-voice-hook/issues/58