2min Security

AI-agents op GitHub lekken API-keys via prompt injection

AI-agents op GitHub lekken API-keys via prompt injection

Drie populaire AI-agents op GitHub Actions zijn kwetsbaar voor zogenoemde ‘Comment and Control’-aanvallen. Het betreft Claude Code Security Review, Google Gemini CLI Action en GitHub Copilot Agent. Via PR-titels, issue-bodies en reacties stelen aanvallers API-keys en toegangstokens, zonder externe infrastructuur nodig te hebben.

Securityonderzoeker Aonan Guan kwam samen met onderzoekers van Johns Hopkins University tot de ontdekking. Het aanvalspatroon heet ‘Comment and Control’, een verwijzing naar ‘Command and Control’, en gebruikt GitHub zelf als kanaal om aanvallen uit te voeren. Een aanvaller schrijft een kwaadaardige PR-titel of issue-reactie, de AI-agent verwerkt die tekst en stuurt gestolen credentials terug via een comment of commit.

Anders dan klassieke indirecte prompt injection vuren GitHub Actions-workflows automatisch af op events zoals pull_request of issues. Het openen van een PR is al genoeg om een agent te activeren.

Drie aanvalsvectoren, één patroon

Bij Anthropic’s Claude Code Security Review wordt de PR-titel zonder verdere opschoning in de systeemprompt verwerkt. Guan opende een PR met een kwaadaardige titel die Claude instrueerde bash-commando’s uit te voeren. De ANTHROPIC_API_KEY en GITHUB_TOKEN verschenen als “bevindingen” in een PR-comment. Anthropic beoordeelde de kwetsbaarheid met CVSS 9.4 Critical. Eerder bleek Claude al kwetsbaar voor prompt-injectie waarbij privégegevens lekten, geheel onbekend met een dergelijk probleem is Anthropic dus niet.

Bij Google’s Gemini CLI Action plaatste Gemini de GEMINI_API_KEY publiekelijk als issue-reactie na een vergelijkbare aanval met een nep-instructiesectie. Google kende een bounty van 1.337 dollar toe.

GitHub Copilot: drie lagen omzeild

Het meest opmerkelijke geval is GitHub Copilot Agent. GitHub had drie runtime-beveiligingslagen ingebouwd: omgevingsfiltering, secret scanning en een netwerkfirewall. Guan omzeilde ze alledrie.

De aanval begint met een issue met een verborgen payload in een HTML-commentaar, dat onzichtbaar is voor menselijke gebruikers, maar leesbaar blijft voor de AI. Een slachtoffer wijst het issue nietsvermoedend toe aan Copilot. De UU()-functie filtert gevoelige variabelen uit de bash-subprocess, maar het bovenliggende Node.js-proces behoudt de volledige omgeving. Via ps auxeww zijn die variabelen leesbaar. Base64-encoding omzeilde de secret scanner; de gecodeerde uitvoer ging via een gewone git push — een toegestaan kanaal. Vier credentials kwamen bloot te liggen, waaronder GITHUB_TOKEN en GITHUB_COPILOT_API_TOKEN.

GitHub noemde de bevinding aanvankelijk een “voorheen geïdentificeerde architecturele beperking” en keerde 500 dollar bounty uit na heropening van het rapport. In maart publiceerde GitHub een securityroadmap voor Actions met scoped secrets en een egress-firewall als geplande maatregelen.