Falha no Claude Code: uma issue no GitHub chega aos segredos do CI

10.08.2026 8 min 4

Uma issue no GitHub aberta por alguém sem nenhum direito sobre o repositório bastou para chegar aos segredos da sua esteira de build. A Novee Security mostrou isso na Black Hat USA em 5 de agosto de 2026, em três agentes de código com IA ao mesmo tempo: Claude Code da Anthropic, Gemini CLI do Google e Codex da OpenAI. Nenhum dos ataques quebrou um modelo. Quebraram o arcabouço em volta dele, o código comum que decide quais comandos o modelo pode executar.

Como uma issue no GitHub chega aos segredos do CI

Os três agentes se conectam à integração contínua do mesmo jeito. Um evento do repositório, uma issue ou um pull request, dispara um workflow, o workflow sobe o agente num runner, e o agente lê o texto do evento como parte da tarefa. Esse texto é escrito por quem abriu a issue. Num repositório público, por qualquer pessoa.

Injeção de prompt por esse caminho é um problema conhecido, e cada uma dessas ferramentas tem uma camada de validação que deveria contê-la. A pesquisa trata da falha dessa camada, não da ingenuidade do modelo. Um runner guarda as credenciais de que a esteira precisa: tokens do repositório, chaves de nuvem, as próprias chaves de API do agente. Quem executa um comando no runner alcança tudo isso.

A falha do Claude Code: uma divergência de aspas e um contador de downloads

A cadeia contra o Claude Code começou numa divergência sobre aspas. O validador de comandos removia o texto entre aspas simples antes de aplicar suas vinte e três verificações de segurança, supondo que um shell trataria aquele conteúdo como dado inerte. Depois o arcabouço repassava o comando já sem essas aspas. Um valor enfiado na flag --receive-pack do git parecia então inofensivo na validação e era executado no runner.

O que veio depois é a parte interessante. A Anthropic corrigiu, e os pesquisadores acharam um segundo caminho com tac, um comando somente de leitura que inverte o conteúdo de um arquivo, para imprimir uma chave de API ao contrário num log público de build. Isso também foi corrigido. A terceira rodada, registrada como CVE-2026-54316, desistiu de imprimir qualquer coisa: a chave vazou um caractere por vez pelo contador público de downloads de um modelo no Hugging Face, com a resposta lida de fora. A nota é 9,1 no CVSS v3.1 e 6,0 no CVSS v4; a Anthropic classifica o caso como moderado porque o atacante precisa antes colocar conteúdo não confiável no contexto do agente. Estão afetadas as versões a partir da 0.2.54, a correção chegou na 2.1.163, aviso GHSA-fg94-h982-f3mm.

Importante: um canal encoberto não precisa de banda. Uma chave que escapa a um caractere por requisição por um contador público não aparece em log nenhum, porque nunca saiu nada num formato que valesse a pena inspecionar. Filtragem de saída não vê isso, e proxy também não.

Gemini CLI: a pior nota dos três

A ferramenta do Google levou a pior. A CVE-2026-12537 carrega nota CVSS 10,0: o lançador de contêiner analisava sua lista de ferramentas permitidas uma única vez, no registro, e não verificava nada em tempo de execução. Sob a flag --yolo, todo comando pedido pelo modelo era aprovado automaticamente, e uma injeção de comandos do sistema por um arquivo .gemini/.env preparado executava código no host de CI antes mesmo de o sandbox subir. São vulneráveis todas as versões até a 0.39.0 inclusive; a correção está na 0.39.1, com a action do GitHub atualizada para run-gemini-cli 0.1.22 e aviso GHSA-wpqr-6v78-jr5g.

Com o Codex foi diferente. Duas passagens do Codex dividiam um mesmo checkout dentro de um único job, então a primeira podia escrever um arquivo AGENTS.md que a segunda carregava como instruções. A posição da OpenAI é que o sandbox se comportou exatamente como documentado, então não houve correção de versão. O que mudou foram as recomendações de workflow: separar as passagens em jobs distintos e declarar explicitamente os arquivos de instrução do repositório como parte da superfície de entrada não confiável.

Por que o acesso roubado continua valendo

Uma pesquisa separada da Silverfort, publicada em 28 de julho de 2026, explica por que um único roubo vale tanto. No macOS, o Claude Code CLI grava seu pacote OAuth no chaveiro como senha genérica, sob o nome de serviço "Claude Code-credentials", criada via /usr/bin/security sem argumentos de controle de acesso. O item herda a lista de acesso padrão, que confia na ferramenta que o criou. Como essa ferramenta é um binário da Apple de uso geral que qualquer processo pode chamar, uma única linha de comando devolve o pacote inteiro, sem Touch ID e sem senha.

O pacote guarda um token de acesso de vida curta e um token de renovação de vida longa, além das credenciais dos servidores MCP conectados. O problema é o token de renovação: ele pode ser trocado por novos tokens de acesso até alguém revogá-lo, e não está preso nem a um aparelho nem a um endereço. A Anthropic não classifica isso como vulnerabilidade, argumentando que processos do mesmo usuário já são confiáveis, mas diz acompanhar um aperto no controle de acesso como melhoria de defesa em profundidade. Vale notar que o aplicativo de desktop da própria empresa faz o contrário: lá os tokens ficam cifrados com uma chave presa à assinatura de código, e qualquer tentativa externa de alcançá-la dispara pedido de senha.

O que fazer se você roda esses agentes

  • Atualizar primeiro: Claude Code 2.1.163 ou mais novo, Gemini CLI 0.39.1 junto com run-gemini-cli 0.1.22. Para o Codex não há nada a instalar, o que muda é o workflow.
  • Não deixar evento público disparar o agente: um workflow que começa em qualquer issue ou pull request de qualquer conta entrega a superfície de entrada a estranhos. Exija um rótulo, o comentário de um mantenedor ou uma checagem de fork.
  • Enxugar os segredos do runner: dê ao job o token mais estreito com que ele consiga trabalhar e mantenha chaves de nuvem de vida longa fora dos workflows que um agente alcança.
  • Separar as passagens: se duas execuções do agente dividem um checkout, a primeira pode escrever as instruções que a segunda vai obedecer. Jobs distintos, checkouts distintos.
  • Rotacionar por suspeita, não por prova: sair da conta, entrar de novo e depois trocar as chaves no console. Limpar a máquina não invalida um token de renovação que já saiu.
  • Vigiar a mesma sessão em duas máquinas: reuso de credencial a partir de hosts diferentes é justamente o sinal que esses tokens tornam possível, porque nada os prende ao aparelho.

Por que isso importa além dos desenvolvedores

O padrão se repete conforme os agentes ganham autonomia: o ataque não chega pela rede como tráfego que se possa inspecionar, chega como conteúdo e roda dentro de uma sessão que já é confiável. Escrevemos sobre a mesma forma quando um navegador com IA podia ser sequestrado por uma publicação em que o usuário nunca clicou, e é pelo mesmo motivo que é perigosa uma cadeia como a falha no formulário de login do WordPress que termina em código no servidor, mesmo precisando apenas que um administrador abra uma página. É aqui também que fica o limite honesto das ferramentas de privacidade de rede. Uma VPN esconde seu tráfego da rede em que você está e muda a localização aparente; ela não enxerga o que o seu próprio agente decide executar e não se coloca entre um processo e o chaveiro do mesmo notebook. Criptografia em trânsito nunca foi a fronteira que esses ataques cruzam.

Conclusão

Conclusão: três fornecedores, três falhas diferentes, uma forma em comum. O modelo não foi enganado por nada que não enganasse também uma pessoa atenta; quem falhou foi o código em volta do modelo, o que prometia impor limites. Como disse um dos pesquisadores, o arcabouço é o código entre o modelo e o mundo real. Nenhuma das falhas consta como explorada no mundo real e as correções existem, então a reação útil hoje é sem glamour: atualizar os agentes, parar de deixar eventos anônimos do repositório iniciá-los e tratar cada credencial que eles tocaram como algo a rotacionar, não a limpar.

claude codeanthropicgemini cligoogleopenaicodexgithubhugging facenovee securitysilverfortblack hatcve-2026-54316cve-2026-12537prompt injectionai agentmacosapplekeychaincybersecuritysecurityprivacyvpn

Leia também