Security Blog

Du fordelte arbejdet på tretten agenter. Paperclip delte ikke nøglen.

#215

October 2, 2026 · By Marketing team

← All posts

Et gennemsyn af et agent-rammeværk med 71.000 stjerner viste, at tolv af dets tretten agenter bar samme token i klartekst. Når du kører en flåde af agenter, holder 'hemmeligheden bor i konfigurationen' op med at være en genvej og bliver en multiplikator.

Du gjorde det moderne. I stedet for én stor agent satte du en flåde op — én til at triagere tickets, én til at skrive tekst, én til at køre design-pipelinet, et dusin stykker, hver med sit eget job og sin egen konfiguration. Det føles mere sikker på den måde. Mindre skadesradius. Mere mindste-privilegium.

Så gik et sikkerhedsgennemsyn gennem konfigurationerne i et agent-rammeværk med 71.000 stjerner kaldet Paperclip og fandt, at tolv af dets tretten agenter bar samme legitimationsoplysninger — et identisk token, indsat i klartekst i hver agents konfiguration [1]. En Anthropic API-nøgle lå hardcodet i klartekst i en designagents konfiguration. Et bot-token, der var tiltænkt én agent, kunne læses af agenter, der ikke havde noget med det at gøre.

Tretten døre. Én nøgle, kopieret ind i tolv af dem. Stjæl den fra den svageste agent, og du har de andre elleve.

Hvad der faktisk skete

Paperclip giver hver agent en MCP-serverkonfiguration — den fil, der fortælller agenten, hvilke værktøjer og tjenester den kan nå, og hvordan den autentificerer sig til dem. På et eller andet tidspunkt røg hemmelighederne direkte ind i de filer som ren tekst: et n8n JWT, et bearer-token, en Anthropic API-nøgle. Ikke refereret. Ikke injiceret på runtime. Indtastet — og derefter, fordi det at starte næste agent er et copy-paste, dupliceret ud på hele flåden.

Gennemsynet flaggede tre ting. De delte tokens i klartekst på tværs af tolv agenter (vurderet HIGH). Anthropic-nøglen liggende i klartekst i en designagents konfiguration (vurderet CRITICAL). Og et bot-token med adgang for agenter, det aldrig var tiltænkt — et rent mindste-privilegium-miss [1]. Til deres ros reagerede Paperclip-holdet hurtigt: de migrerede til legitimationsreferencer, redigerede konfiguration ved reads på tværs af agenter, og begyndte at håndhæve binding-sync [2]. Den rigtige retning.

Det er ikke Paperclip, der er skødesløse

Her er den del, der er værd at sidde med. Paperclip gjorde, hvad næsten alle rammeværker gør. At lægge en hemmelighed i en konfigurationsfil er, hvordan software har autentificeret i tredive år. Det virkede, fordi der var én app, én konfiguration, én operatør, der vidste, hvor nøglen lå.

Æraen ændrede sig under den vane. Et multi-agent-system er ikke én app med én konfiguration — det er et dusin processer, hver med en fil, hver en kopi af den foregående. Klartekst-i-konfiguration var en tålelig genvej, da der var ét sted at lække. Ved tretten betyder samme genvej, at ét læk er tretten læk — og "hvilken agent gjorde det?" har intet svar, fordi tokenet i loggen tilhørte dem alle.

Legitimationsreferencer — retten, Paperclip leverede — er reelt bedre. Men læg mærke til, hvad de ændrer, og hvad de ikke ændrer. En reference resolver stadig til en rigtig hemmelighed det sted, agenten kører; agenten, eller hvad der end kompromitterer den, kan stadig læse den opløste værdi. Og rammeværkets eget bugtracker viser allerede næste fejltilstand: en reference, der driver ud af sync med sin binding, så konfigurationen ser udfyldt ud, mens valideringen fejler i stilhed [3]. Hemmeligheden flyttede et lag tilbage. Den forlod ikke bygningen.

Det er ikke kun Paperclip

Samme uge, samme rodårsag, andre repos. Et bredt brugt kodnings-agent blev indberettet for at printe rå .env-værdier — adgangskoder, tokens, API-nøgler — direkte ind i sin chat-output. En anden agent-runner blev fundet i at give hele sit forældremiljø videre til subprocesser, så hver provider-nøgle var synlig for en barneproces [4]. En stemme-hook skrev transskriptioner, legitimationsoplysninger og det hele, til verdens-læsbare /tmp [5]. Uafhængige hold, uafhængige trusselsmodeller, én fælles antagelse: at det er fint, at hemmeligheden bor der, hvor agenten kan se den. Hele det argument, en angriber skal gøre, er at det ikke er det.

Bygget til det her, med vilje

Clavitor tager udgangspunkt i den modsatte antagelse: agenten holder aldrig legitimationsoplysningen overhovedet. Den beder om en handling; anmodningen bliver aflyttet, autentificeret imod en hemmelighed, agenten ikke kan læse, og udført. Der er ingen konfiguration at indsætte et token i, for der er intet token i konfigurationen. Intet at kopiere på tværs af tretten agenter, for agentens miljø rummer aldrig det, der er værd at stjæle.

Hver agent når kun det, den var navngivet til — ikke hele lagret — så et bot-token ikke kan ende med at være læsbart for en agent, der aldrig bad om det. Og hver handling logges til den specifikke aktør, der udførte den, aldrig til et delt token, tolv agenter havde til fælles — så "hvilken gjorde det?" har et svar.

Den ærlige kant: det gør ikke en agent uhackbar. En kompromitteret agent kan stadig i øjeblikket gøre de ting, den var autoriseret til. Hvad den ikke kan, er at gå med nøglen og blive de andre tolv — for der er ingen nøgle i dens hænder at gå med.

Læren er ikke "roter tokenet"

Paperclip vil rotere tokens'ene, færdiggøre migrationen og lukke issues'ne. Godt — det bør de. Men rotationen er ikke læren. Leren er, at i det øjeblik du har en flåde af agenter i stedet for én app, holder "hemmeligheden bor i konfigurationen" op med at være en genvej og bliver en multiplikator. Du fikser ikke en multiplikator ved at gøre hemmeligheden lidt sværere at læse. Du fikser den ved at sikre, at hemmeligheden aldrig var i agentens hænder til at begynde med.

Vi skrev de regler ned, vi mener et legitimationsværktøj skal holde i agent-æraen — blandt andet, at hemmeligheden aldrig bor der, hvor koden kører, og at en agent kun når det, den var navngivet til. Kør dine igennem dem: clavitor.ai/rules.

Clavitor (@clavitorai) er den legitimationsboks, der er bygget til AI-agenter — og imod dem. clavitor.ai

Kilder

[1] Paperclip agent framework — credential hygiene findings (CFG-H1 shared plaintext tokens, CFG-C1 hardcoded Anthropic key, CFG-H2 mis-scoped bot token): https://github.com/paperclipai/paperclip

[2] Paperclip — enforce agent secret-binding sync across lifecycle flows (merged): https://github.com/paperclipai/paperclip/pull/8307

[3] Paperclip — secret_ref env entries can drift from secret_bindings rows, config appears populated but validation fails silently (#8309): https://github.com/paperclipai/paperclip/issues/8309

[4] Chetter — runBatchAgent inherits full runner environment, exposing provider API keys to the subprocess (#56): https://github.com/flatout-works/chetter/issues/56

[5] Claude Code voice hook — full transcripts (credentials included) written to world-readable /tmp (#58): https://github.com/rodlaneedu-hash/claude-code-voice-hook/issues/58