Blog

Hoe andermans repository Claude Code kan kapen: 7 beschermingsregels

Markdown

Vier gedocumenteerde indirecte promptinjectieroutes via repositories, GitHub-inhoud, Sentry-events en MCP-metadata, met primaire bronnen en grenzen van inperking.

Lees het volledige artikel

Kernpunten

Gepubliceerd onderzoek illustreert vier indirecte injectieroutes: installatie-instructies, GitHub-inhoud, telemetrie en MCP-toolmetadata. De rapporten verschenen op verschillende datums en betreffen verschillende clients en machtigingsinstellingen. Hieronder staan primaire bronnen en praktische inperkingsmaatregelen; geen instellingenbestand garandeert immuniteit.

Ailoot-documentatie: API, sleutels en installatie.

Vier gedocumenteerde routes van onvertrouwde tekst naar agentacties

Kernpunten

Deze voorbeelden betreffen verschillende onderzoeksperioden en clientconfiguraties, geen vier ontdekkingen in één periode van twee weken. Ze illustreren hoe onvertrouwd materiaal toolgebruik kan beïnvloeden; implementatiefouten, beschikbare inloggegevens en uitvoeringsrechten bepalen de uitkomst.

Formeel heet dit indirecte promptinjectie: een schadelijke instructie komt niet rechtstreeks van jou, maar via gegevens die de agent verwerkt terwijl hij een taak uitvoert — een vreemde README, een foutmelding, een GitHub-reactie of een antwoord van een externe dienst. Je mag de term meteen na deze alinea weer vergeten; vanaf hier gebruik ik gewone taal.

Vier onderzoeksvoorbeelden die hieronder worden besproken:

  1. Een repository die er onschuldig uitziet, kan veranderen in een reverse shell.
  2. De titel van een Pull Request kan drie verschillende AI-agents tegelijk kapen.
  3. Een agent kan een vals foutrapport van Sentry accepteren in plaats van een echt rapport.
  4. Een MCP-toolbeschrijving kan verborgen instructies bevatten die agentgedrag beïnvloeden; invloed hangt van model en opzet af.

Hoe verandert de README van een onschuldige repository in een reverse shell?

Kernpunten

0DINs proof of concept van 25 juni 2026 toont dit: je kloont een gewone repository en vraagt Claude Code om die uit te voeren — het volgt de installatie-instructies. Een fout bij de eerste uitvoering stelt een opdracht voor om het probleem te “verhelpen”, die in werkelijkheid het DNS-record van de aanvaller opzoekt en een reverse shell start. De aangehaalde bron demonstreert de techniek en stelt niet vast hoe vaak die bij echte incidenten is gebruikt.

De werking is zo ontworpen dat geen enkele afzonderlijke laag verdacht lijkt:

  1. Je kloont een gewone repository en vraagt Claude Code om die uit te voeren.
  2. De repository haalt een Python-pakket binnen dat is ontworpen om bij het eerste gebruik te mislukken.
  3. De foutmelding stelt beleefd de opdracht python3 -m axiom init voor als “oplossing”.
  4. De opdracht init voert setup.sh uit.
  5. Het script vraagt een DNS TXT-record op (doorgaans gebruikt voor domeingerelateerde notities, maar het veld accepteert willekeurige tekst). De aanvaller zet er een met base64 gecodeerde opdracht in (een manier om gegevens om te zetten in gewone tekst zonder spaties of speciale tekens) en geeft die rechtstreeks door aan bash.
  6. De waarde van het DNS-record kan op elk moment worden gewijzigd — zo krijgt de aanvaller een interactieve reverse shell met jouw gebruikersrechten en toegang tot alle geheimen op de machine.

De gedemonstreerde payload werd tijdens uitvoering uit DNS opgehaald; alleen repositorybytes scannen onthulde die uiteindelijke payload dus niet. Dat bewijst niet dat elke scanner of runtimecontrole machteloos is: inspectie van opgehaalde inhoud, procesbewaking en netwerkbeperkingen kunnen de keten zichtbaar maken of onderbreken. De bron is een proof of concept, geen meting van de frequentie van echte incidenten.

Hoe kaapte een Pull Request-titel drie verschillende AI-agents?

Kernpunten

Het onderzoeksrapport Comment and Control, gepubliceerd op 15 april 2026 en bijgewerkt op 4 mei, documenteert afzonderlijke GitHub-tekstinjectieroutes in Claude Code Security Review, Gemini CLI Action en Copilot Agent. Een verlaagde ernstscore bewijst niet dat de hele injectieklasse is verholpen; het rapport beschrijft leveranciersreacties en een specifieke Claude-toolbeperking.

Het onderzoek beschrijft deze routes en reacties; dit is een historisch rapport, geen controle van elke actuele productversie:

AgentHoe de aanval binnenkwamWat uitlekteHuidige status
Claude Code Security ReviewPR-titel rechtstreeks in de systeemprompt ingevoegd zonder opschoningANTHROPIC_API_KEY, GITHUB_TOKENOnderzoek meldt ps-beperking en documentatiewijzigingen; ernst op 20 april 2026 naar None gewijzigd
Gemini CLI ActionEen nepsectie “Trusted Content” in een reactie omzeilde de veiligheidsinstructiesGEMINI_API_KEYGoogle voegde afzonderlijke beveiligingsprompts toe aan de systeemprompt
GitHub Copilot AgentPayload verborgen in een onzichtbare HTML-opmerking in MarkdownGITHUB_COPILOT_API_TOKEN, COPILOT_JOB_NONCEGitHub beschouwt dit als een architecturale beperking, niet als een bug

Tussen de eerste en de laatste melding in deze bekendmakingscyclus verstreken bijna vijf maanden (de eerste melding over Claude Code was van 17 oktober 2025; de laatste bugfix voor GitHub Copilot was van 9 maart 2026). De ernstwijziging en maatregelen uit het rapport bewijzen geen volledige sluiting van elke mogelijke payload. De PoC-repository van het onderzoek documenteert de aangetoonde Claude-route; voer de aanvalspayload niet op echte systemen uit. Voor jou zit de waarde in het aanvalspatroon zelf: niet-geverifieerde gegevens van GitHub komen bij de agent binnen, de agent voert opdrachten uit en geheimen lekken via datzelfde GitHub — de aanvaller heeft geen externe server nodig.

Twee analyses zijn genoeg om het patroon te zien: elke nieuwe bevinding afzonderlijk oplossen is niet haalbaar; kwetsbaarheden van dit type duiken elke twee weken op. Beveiligingsregels expliciet vastleggen in CLAUDE.md en settings.json in plaats van ze in je hoofd te houden, is onderdeel van context engineering: stel ze één keer in en ze werken automatisch in elke nieuwe Claude Code-sessie, zonder herinneringen. Drie pijlers werken samen: AI-kloon + Tweede Brein + Context Engineering — deze combinatie verandert Claude Code van een uitvoerder die alles vertrouwt in een agent met expliciete regels.

Kan een vals Sentry-foutrapport je agent overnemen?

Kernpunten

Een aangetoonde techniek werkt als volgt: een aanvaller stuurt een valse foutgebeurtenis naar Sentry; de agent vraagt via MCP een lijst met issues op, ontvangt de kwaadaardige gebeurtenis tussen de legitieme gebeurtenissen en voert de ingebedde opdracht uit als “stap om het probleem op te lossen”. Het Agentjacking-rapport van Tenet, bijgewerkt op 17 juni 2026, meldt 85% exploitatie over gecontroleerde validatierondes en meer dan 100 agentuitvoeringen, waaronder Claude Code, Cursor en Codex. Het noemt een Claude Code 2-1-161-opname van 2 juni, maar publiceert geen volledige modellenlijst, reproduceerbaar harnas, exacte noemer of uitsplitsing per client. Behandel 85% als gezamenlijke waarneming van de onderzoekers, niet als compromiskans van elke huidige installatie.

Voor de aanval is alleen een Sentry DSN-sleutel nodig — een openbare identificatiecode die veel projecten rechtstreeks in clientcode opnemen:

De werking is eenvoudig: een ontwikkelaar vraagt de agent om openstaande Sentry-fouten te bekijken; de agent vraagt ze op via de MCP-server, ontvangt een kwaadaardige gebeurtenis tussen de echte gebeurtenissen en leest de ingebedde opdracht als een vertrouwde instructie om de fout op te lossen — want formeel is dat precies de taak die hij kreeg.

Tenet meldt dat bestaande controles in de testomgevingen niet waarschuwden. Dat bewijst geen spoorloze uitvoering in elke implementatie: agent-/toollogs, endpointtelemetrie en netwerkregistraties kunnen latere acties vastleggen. De aanval begint via extern ingediende telemetrie en hangt daarna af van effectieve tools en machtigingen.

Hoe kunnen MCP-toolbeschrijvingen agentgedrag beïnvloeden?

Kernpunten

Toolmetadata kunnen instructies bevatten die het model beïnvloeden, maar hebben niet automatisch de autoriteit van een systeemprompt. MCPTox, voor het eerst ingediend op 19 augustus 2025, evalueert toolvergiftiging bij realistische MCP-tools en meldt gevoeligheid die per model en opzet verschilt. De waarneming dat krachtigere modellen gevoeliger kunnen zijn geldt binnen die benchmark, niet als universele wet.

De formulering van Microsoft is de nauwkeurigste die ik over dit onderwerp heb gevonden:

Tool poisoning houdt in dat een instructie in de beschrijving van een onschuldige tool wordt verborgen, waardoor de agent ernaar handelt.

De MCPTox-resultaten beschrijven de modellen en toolopzet van die benchmark. Trek uit een specifieke weerbaarheidsscore geen universele conclusie dat nauwkeuriger instructies volgen altijd tot meer kwetsbaarheid leidt; beoordeel de gebruikte instellingen en test eigen grenzen.

Wat hebben deze aanvallen gemeen en wat kan detectie missen?

Kernpunten

Elk van de vier bevindingen maakt gebruik van dezelfde blinde vlek: de agent maakt geen onderscheid tussen “gegevens om te analyseren” en “instructies om op te volgen”. Een scan van alleen de repository kan payloads missen die later via tools of netwerkgegevens binnenkomen. Detectie blijft nuttig, maar moet het hele uitvoeringspad meenemen. Combineer die met beperkingen op bestanden, inloggegevens, tools en netwerktoegang in plaats van alleen op herkenning door de agent te vertrouwen.

De conclusie geldt voor alle vier bevindingen: je kunt niet vertrouwen op “de code ziet er normaal uit” — elke afzonderlijke stap in een aanval is echt onschuldig. Beperk effectieve agentmogelijkheden en inspecteer voorgestelde acties; detectie en inperking behandelen verschillende delen van de aanval.

Welke beveiligingen heeft Claude Code al — en waarom zijn ze niet voldoende?

Kernpunten

Claude Code heeft ingebouwde beveiligingen: het analyseert de volledige prompt op verdachte instructies, gebruikt aparte contextvensters voor webcontent, controleert het vertrouwen wanneer het voor het eerst in een nieuwe map wordt gestart en bij het verbinden met MCP-servers. Maar de vlag --dangerously-skip-permissions, die veel mensen gebruiken om vervelende toestemmingsvragen uit te zetten, schakelt al deze beveiligingen tegelijk uit.

Anthropic erkent het probleem rechtstreeks in zijn documentatie, in plaats van het te verbergen:

Promptinjectie is een techniek waarbij een aanvaller probeert de instructies van een AI-assistent te overschrijven of te wijzigen door schadelijke tekst in te voegen. Claude Code bevat verschillende beveiligingen tegen deze aanvallen.

— Claude Code-documentatie, https://code.claude.com/docs/en/security

Volgens de documentatie analyseert de agent de volledige prompt op verdachte instructies, keurt curl en wget niet automatisch goed, houdt webcontent in een apart contextvenster zodat die niet met het hoofdvenster wordt vermengd, en vereist een vertrouwensbevestiging wanneer je hem voor het eerst in een nieuwe codebase start of verbinding maakt met een nieuwe MCP-server.

Maar Anthropic noemt een harde beperking zonder omhaal:

De modus bypassPermissions biedt geen bescherming tegen promptinjectie of onbedoelde acties.

— Claude Code-documentatie, https://code.claude.com/docs/en/permission-modes

Als je Claude Code ooit uit irritatie hebt gestart met --dangerously-skip-permissions, zodat het “ophoudt je lastig te vallen met vragen”, heb je alle mechanismen uitgeschakeld die precies de vier hierboven besproken aanvallen hadden kunnen stoppen. Ik laat deze vlag bewust uitgeschakeld, ook wanneer Claude Code voor de tiende keer in een sessie opnieuw iets vraagt — het is vervelend, maar die vragen vormen de grens tussen “de agent heeft verdachte tekst gelezen” en “de agent heeft die uitgevoerd”. Een verstandige instelling voor iemand die niet programmeert, is de standaardmachtigingsmodus (default of acceptEdits) met de sandbox ingeschakeld: gewone bestandsbewerkingen gebeuren zonder extra vragen, terwijl terminalopdrachten fysiek niet buiten de sandbox kunnen komen, zelfs als de agent is misleid.

Hoe schakel je de sandboxmodus in en dicht je het gat dat standaard openblijft?

Kernpunten

De opdracht /sandbox in een Claude Code-sessie beperkt waar de agent kan schrijven en met welke domeinen hij contact kan maken. Op macOS werkt dit direct; voor Linux en WSL2 zijn de pakketten bubblewrap en socat vereist. Een belangrijk detail: standaard blokkeert de sandbox niet het lezen van bestanden zoals ~/.ssh — daarvoor moet je apart een instelling inschakelen.

Om dit permanent voor alle projecten in te schakelen, wijzig je één instelling in ~/.claude/settings.json:

{
  "sandbox": { "enabled": true }
}

Standaard kunnen opdrachten in de sandbox alleen schrijven naar de projectwerkmap en de tijdelijke map van de sessie. Netwerktoegang loopt via een proxy — er zijn geen domeinen vooraf toegestaan, en Claude Code vraagt om bevestiging wanneer het voor het eerst contact maakt met een nieuw domein. Anthropic zegt dat dit het aantal toestemmingsvragen sterk vermindert — met 84% volgens interne metingen van het bedrijf — omdat de sandbox sommige veilige gevallen zelf afhandelt in plaats van het elke keer aan jou te vragen.

Het gat dat de standaardinstellingen openlaten: de sandbox beperkt standaard schrijven, maar voorkomt niet dat bestanden zoals ~/.aws/credentials en ~/.ssh worden gelezen. Dat zijn precies de bestanden en omgevingsvariabelen waarop de eerdere analyses gericht waren. Dicht dat gat met een apart blok in hetzelfde bestand:

{
  "sandbox": {
    "enabled": true,
    "credentials": {
      "files": [
        { "path": "~/.aws/credentials", "mode": "deny" },
        { "path": "~/.ssh", "mode": "deny" }
      ],
      "envVars": [
        { "name": "GITHUB_TOKEN", "mode": "deny" },
        { "name": "NPM_TOKEN", "mode": "deny" }
      ]
    }
  }
}

Het punt is dat zelfs als de reverse shell uit de eerste analyse binnen de sandbox opent, deze variabelen en bestanden fysiek uit de procesomgeving worden verwijderd voordat die start — er blijft niets over om te stelen.

Welke permissions.deny-regels moet je vandaag toevoegen?

Kernpunten

permissions.deny in settings.json blokkeert specifieke acties op regelniveau in plaats van de bedoeling te analyseren — en Anthropic garandeert uitdrukkelijk dat een deny-regel altijd voorrang heeft op een allow-regel. Deny-regels beperken overeenkomende toolacties, maar zijn geen toegangsgrens op OS-niveau; indirecte opdrachten en andere tools vereisen eigen controles.

Een minimale set voor iemand die niet programmeert, die de belangrijkste doelen van alle vier aanvallen tegelijk afdekt:

{
  "permissions": {
    "deny": [
      "Read(~/.ssh/**)",
      "Read(~/.aws/credentials)",
      "Read(.env)",
      "Bash(curl *)",
      "Bash(wget *)",
      "Bash(sudo *)"
    ]
  }
}

Volgens de Claude Code-documentatie hebben deny-regels altijd voorrang op allow-regels. Dus zelfs als jij (of de agent zelf) elders per ongeluk ruimere toegang toestaat, wordt een specifieke deny-regel nog steeds als eerste toegepast. Deze regelvoorrang geldt voor overeenkomende toolverzoeken. Ze bewijst niet dat een geheim via elk kindproces of elke tool onbereikbaar is; gebruik ook afgedwongen bestands- en omgevingsbeperkingen.

Claude Code heeft ook een auto-modus, waarin een apart classificatiemodel acties controleert voordat ze worden uitgevoerd — het is niet hetzelfde model dat met jou praat. Standaard blokkeert het onder andere precies het patroon “code downloaden en meteen uitvoeren” (curl | bash). Anthropic waarschuwt uitdrukkelijk dat dit een onderzoeksmodus is die het aantal vragen vermindert, maar op zichzelf geen veiligheid garandeert — beschouw het als een extra laag, niet als vervanging van de sandbox en permissions.deny.

Hoe controleer je een repository en MCP-server voordat je ze aan je agent toevertrouwt?

Kernpunten

Controleer de leeftijd, commitgeschiedenis en herkomst van de link voordat je Claude Code vraagt een vreemde repository uit te voeren. Gebruik voor het installeren van een MCP-server alleen betrouwbare bronnen en onthoud dat Anthropic zelf externe servers niet op veiligheid controleert. Beide controlelijsten kosten een paar minuten en dekken precies de toegangspunten die in alle vier hierboven besproken aanvallen werden gebruikt.

Voor repositories is dit een korte controlelijst voordat je ze aan de agent overdraagt:

  1. Begin niet meteen met installeren via een link in een e-mail, post of recensie van een onbekende bron.
  2. Als de installatie een fout oplevert met de instructie “voer opdracht X uit om het op te lossen”, lees dan wat X werkelijk doet voordat je Claude Code toestemming geeft die uit te voeren.
  3. Controleer de leeftijd en commitgeschiedenis van de repository, niet alleen het aantal sterren — nieuw aangemaakte repositories kunnen gemakkelijk van nepreviews worden voorzien.
  4. Is de repository onbekend, voer de installatie dan uit in een virtuele machine, niet op je werkcomputer met echte sleutels. Dit is de aanbeveling van Anthropic voor het werken met externe diensten.

Anthropic's standpunt over MCP-servers staat openlijk beschreven:

We raden aan om je eigen MCP-servers te schrijven of servers van providers te gebruiken die je vertrouwt. Anthropic beoordeelt connectors aan de hand van de criteria voor opname voordat ze aan de directory worden toegevoegd, maar voert geen beveiligingsaudits uit en beheert zelf geen MCP-server.

— Claude Code-documentatie, https://code.claude.com/docs/en/security

Dat betekent dat jij verantwoordelijk bent voor het controleren van MCP-servers van derden, niet het platform waarop je ze hebt geïnstalleerd. Sommige teams — vooral beveiligingsstart-ups — bouwen hier al tools voor: MCP-configuratiescanners die zoeken naar vergiftigde beschrijvingen en tool-“pinning”, waarbij de hash van een beschrijving bij de eerste installatie wordt opgeslagen en latere wijzigingen worden gemeld. Deze technologieën zijn nieuw, dus het is te vroeg om er als enige bescherming op te vertrouwen — maar ze zijn het volgen waard, vooral als je MCP-servers met productieomgevingen verbindt. Voor zulke verbindingen kun je elke pakketversie vastpinnen en de vingerafdruk van toolbeschrijvingen in een auditlog vastleggen.

7 beschermingsregels: de controlelijst voor vandaag

Kernpunten

Alles in deze gids komt neer op zeven concrete acties: drie wijzigingen in één settings.json-bestand (sandbox, credentials, permissions.deny) en vier gewoonten voor het werken met code, fouten en MCP-servers van anderen. Geen ervan vereist speciale kennis — de hele controlelijst kost minder dan 20 minuten.

  1. Schakel de sandboxmodus in (/sandbox of "sandbox": {"enabled": true} in ~/.claude/settings.json) en voeg een credentials-blok toe dat het lezen van ~/.ssh en ~/.aws/credentials verhindert.
  2. Voeg permissions.deny-regels toe voor het lezen van geheimenbestanden en voor gevaarlijke bash-opdrachten (curl, wget, sudo) — deny heeft altijd voorrang op allow.
  3. Gebruik nooit --dangerously-skip-permissions voor vreemde of niet-geverifieerde code — het schakelt alle beveiligingen tegelijk uit, ook de beveiligingen die precies deze aanvallen hadden kunnen stoppen.
  4. Laat Claude Code niet automatisch een “oplossingsopdracht” uit een foutmelding uitvoeren — lees eerst wat die werkelijk doet.
  5. Installeer MCP-servers alleen van bronnen die je vertrouwt en onthoud dat Anthropic ze niet namens jou op veiligheid controleert.
  6. Splits sessies op basis van machtigingen: één sessie werkt met je persoonlijke gegevens en ziet geen externe gegevens; een tweede onderzoekt e-mails, repositories en tickets van anderen, maar heeft geen toegang tot geheimen; een derde publiceert extern, en alleen wat je persoonlijk hebt goedgekeurd. Ik houd dit in mijn eigen projecten strikt aan: een sessie met toegang tot betalingssleutels leest nooit willekeurige externe tickets of repositories, en een sessie die code van anderen analyseert, ziet helemaal geen geheimen. Meng deze rollen niet in één chat.
  7. Houd Claude Code en verbonden automatiseringsscripts bijgewerkt — de meeste hiaten die hier worden besproken, waren al gedicht met patches toen deze gids werd gepubliceerd, en nieuwe hiaten worden op vergelijkbare wijze verholpen.

Wat nu?

Geen van deze lagen biedt een garantie — Anthropic zegt zelf eerlijk dat geen enkele bescherming volledige immuniteit biedt. Ik verwacht niet dat Claude Code zelf een truc in een foutmelding of issue-reactie herkent. Voor mij maken de sandbox en permissions.deny deel uit van de manier waarop ik projectcontext beheer: wat de agent ziet, wat hij standaard vertrouwt en wat er gebeurt wanneer hij een fout maakt.

Heb je toegang tot neurale netwerken via Ailoot nodig, neem dan een kijkje bij Ailoot.

Meer details

Vragen en antwoorden

Voorspelt het gemelde succespercentage van 85% het risico van mijn huidige configuratie?

Nee. Het is Tenets gezamenlijke resultaat uit gecontroleerde validatierondes, zonder volledige openbare modellenlijst, reproduceerbaar harnas of exacte noemer. Tools, goedkeuringen, inloggegevens en netwerktoegang van jouw agent bepalen welke acties mogelijk zijn.

Waarom is alleen de gekloonde repository scannen onvoldoende?

De uiteindelijke payload kan later via een foutrapport, toolmetadata of opgehaalde DNS-inhoud binnenkomen. Bekijk het hele uitvoeringspad en beperk inloggegevens, bestanden, tools en netwerktoegang; scanners en deny-regels alleen bewijzen geen volledige inperking.

Alle artikelen