Du delade upp arbetet på tretton agenter. Paperclip delade inte upp nyckeln.
En genomsökning av ett agentramverk med 71 000 stjärnor hittade tolv av dess tretton agenter med samma token i klartext. När du kör en flotta av agenter slutar "hemligheten bor i konfigurationen" vara en genväg och blir en multiplikator.
Du gjorde det moderna. Istället för en stor agent satte du upp en flotta — en som triagerar ärenden, en som skriver text, en som kör designpipelinen, ett dussin stycken, var och en med sitt eget jobb och sin egen konfiguration. Det känns säkrare så. Mindre skadeomfång. Mer minsta privilegium.
Sedan gick en säkerhetsgenomsökning igenom konfigurationerna i ett agentramverk med 71 000 stjärnor som heter Paperclip och hittade att tolv av dess tretton agenter bar samma autentiseringsuppgifter — en identisk token, inklistrad i klartext i varje agents konfiguration [1]. En Anthropic API-nyckel låg hårdkodad i en designagents konfiguration i klartext. En bottoken som var tänkt för en agent kunde läsas av agenter som inte hade något med den att göra.
Tretton dörrar. En nyckel, kopierad in i tolv av dem. Stjäl den från den svagaste agenten så har du de elva andra.
Vad som faktiskt hände
Paperclip ger varje agent en MCP-serverkonfiguration — filen som berättar för agenten vilka verktyg och tjänster den kan nå, och hur den autentiserar mot dem. Någonstans på vägen hamnade hemligheterna rakt in i de filerna som ren text: ett n8n JWT, en bearer-token, en Anthropic API-nyckel. Inte refererade. Inte injicerade vid körning. Inskrivna — och eftersom det att sätta upp nästa agent är en kopiera-klistra in, duplicerade över hela flottan.
Genomsökningen flaggade tre saker. De delade klartext-tokenarna på tolv agenter (betyg HIGH). Anthropic-nyckeln som låg i klartext i en designagents konfiguration (betyg CRITICAL). Och en bottoken med rättigheter för agenter den aldrig var tänkt för — ett enkelt missat minsta privilegium [1]. Till deras förtjänst agerade Paperclip-teamet snabbt: de migrerade till autentiseringsreferenser, redigerade konfiguration vid läsningar mellan agenter, och började tvinga fram synk av bindningar [2]. Rätt riktning.
Det här är inte att Paperclip är slarvigt
Här är delen värd att stanna vid. Paperclip gjorde det som nästan alla ramverk gör. Att lägga en hemlighet i en konfigurationsfil är hur programvara har autentiserat i trettio år. Det fungerade eftersom det fanns en app, en konfiguration, en operatör som visste var nyckeln bodde.
Eran ändrades under vanan. Ett multiagentsystem är inte en app med en konfiguration — det är ett dussin processer, var och en med en fil, var och en en kopia av den förra. Klartext-i-konfiguration var en tolererbar genväg när det fanns en plats att läcka från. Vid tretton betyder samma genväg att en läcka är tretton läckor — och "vilken agent gjorde det?" har inget svar, eftersom tokenen i loggen tillhörde dem alla.
Autentiseringsreferenser — lösningen som Paperclip levererade — är genuint bättre. Men lägg märke till vad de ändrar och vad de inte ändrar. En referens resolverar fortfarande till en riktig hemlighet på platsen där agenten körs; agenten, eller vad som än komprometterar den, kan fortfarande läsa det resolverade värdet. Och ramverkets egen buggspårare visar redan nästa felmod: en referens som glider ut ur synk med sin bindning, så att konfigurationen ser ifylld ut medan valideringen tyst misslyckas [3]. Hemligheten flyttades ett lager bakåt. Den lämnade inte byggnaden.
Det är inte bara Paperclip
Samma vecka, samma rotorsak, andra repos. En brett använd kodningsagent anmäldes för att skriva ut råa .env-värden — lösenord, tokens, API-nycklar — rakt in i sin chattutmatning. En annan agentkörare hittades ge hela sin föräldramiljö till underprocesser, så att varje leverantörsnyckel var synlig för en barnprocess [4]. En rösthook skrev utskrifter, autentiseringsuppgifter och allt, till världsläsbar /tmp [5]. Oberoende team, oberoende hotmodeller, ett gemensamt antagande: att det är okej för hemligheten att bo där agenten kan se den. Hela argumentet en angripare behöver föra är att det inte är det.
Byggt för det här, med flit
Clavitor utgår från motsatt antagande: agenten håller aldrig autentiseringsuppgiften. Den ber om en åtgärd; förfrågan fångas upp, autentiseras mot en hemlighet som agenten inte kan läsa, och utförs. Det finns ingen konfiguration att klistra in en token i, eftersom det inte finns någon token i konfigurationen. Inget att kopiera över tretton agenter, eftersom agentens miljö aldrig innehåller det som är värt att stjäla.
Varje agent når bara det den var namngiven för — inte hela lagret — så en bottoken kan inte hamna läsbar för en agent som aldrig bad om den. Och varje åtgärd loggas till den specifika aktör som utförde den, aldrig till en delad token som tolv agenter hade gemensam — så "vilken gjorde det?" har ett svar.
Den ärliga kanten: det här gör inte en agent ohackbar. En komprometterad agent kan fortfarande göra, i stunden, de saker den var auktoriserad att göra. Det den inte kan göra är att gå iväg med nyckeln och bli de tolv andra — eftersom det inte finns någon nyckel i dess händer att gå iväg med.
Läxan är inte "rotera tokenen"
Paperclip kommer att rotera tokenarna, slutföra migreringen och stänga ärendena. Bra — det borde de. Men rotationen är inte läxan. Läxan är att så fort du har en flotta av agenter istället för en app slutar "hemligheten bor i konfigurationen" vara en genväg och blir en multiplikator. Du fixar inte en multiplikator genom att göra hemligheten lite svårare att läsa. Du fixar den genom att se till att hemligheten aldrig var i agentens händer från början.
Vi skrev ner de regler vi tycker ett verktyg för autentiseringsuppgifter bör följa i agenternas era — bland annat att hemligheten aldrig bor där koden körs, och att en agent bara når det den är namngiven för. Kör dina mot dem: clavitor.ai/rules.
Clavitor (@clavitorai) är autentiseringsvalvet byggt för AI-agenter, och mot dem. clavitor.ai
Källor
[1] Paperclip agentramverk — fynd om autentiseringshygien (CFG-H1 delade klartext-tokens, CFG-C1 hårdkodad Anthropic-nyckel, CFG-H2 bottoken med fel rättigheter): https://github.com/paperclipai/paperclip
[2] Paperclip — tvinga fram synk av agenters hemlighetsbindningar genom livscykelflöden (sammanslagen): https://github.com/paperclipai/paperclip/pull/8307
[3] Paperclip — secret_ref-miljöposter kan glida ut ur synk med secret_bindings-rader, konfigurationen ser ifylld ut men valideringen misslyckas tyst (#8309): https://github.com/paperclipai/paperclip/issues/8309
[4] Chetter — runBatchAgent ärv hela körarens miljö och exponerar leverantörens API-nycklar för underprocessen (#56): https://github.com/flatout-works/chetter/issues/56
[5] Claude Code voice hook — hela utskrifter (autentiseringsuppgifter inkluderade) skrivna till världsläsbar /tmp (#58): https://github.com/rodlaneedu-hash/claude-code-voice-hook/issues/58