Se usas o Claude Code, há um ficheiro no teu projeto que merece uma vista de olhos hoje. Investigadores da Apiiro encontraram mais de mil cópias públicas no GitHub do ficheiro de definições local da ferramenta da Anthropic com palavras-passe, tokens e chaves lá dentro. O caso ganhou força esta semana com o artigo da Ars Technica de segunda-feira, e a equipa do Claude Code já admitiu que está a estudar o problema.

Como o Claude Code guarda os segredos sem querer

O Claude Code pede autorização antes de correr a maioria dos comandos. Se escolhermos «Yes, and don’t ask again», a ferramenta grava uma regra no ficheiro .claude/settings.local.json, como explica a documentação de permissões da Anthropic. Às vezes essa regra é um padrão, como npm test *, mas outras vezes é o comando exato. E se o comando tiver uma palavra-passe ou um token escrito, fica tudo guardado em texto simples.

A Anthropic tenta manter este ficheiro fora do Git: segundo a página de definições, o Claude Code adiciona-o às exclusões globais do Git na primeira vez que o escreve. O problema é que essa proteção fica só no computador de quem a criou e não viaja com o projeto. Um clone noutra máquina ou uma pasta que só depois passa a repositório chegam para o ficheiro ir parar ao GitHub.

Pedido de autorização do Claude Code para um comando Bash, com a opção Yes, and don't ask again
Imagem: Anthropic

Os números da Apiiro

Segundo a investigação da Apiiro, citada pelo The Hacker News, há 104.185 cópias deste ficheiro em repositórios públicos. Cerca de 1,1%, ou 1.122 cópias, têm pelo menos um segredo, num total de 1.379 credenciais diferentes. Mais de um terço abre diretamente bases de dados, com 379 palavras-passe, e há ainda 43 acessos SSH, 42 tokens do GitHub, GitLab e npm e 23 chaves da AWS.

Há mais dois pormenores preocupantes. Em 539 dos 1.105 repositórios analisados, foi um commit com o Claude como coautor a mexer no ficheiro, o que sugere que a própria ferramenta o envia muitas vezes. E apagar o ficheiro não resolve, porque as versões antigas ficam no histórico e nos forks. Os investigadores contaram 734 segredos só em versões antigas e dizem que 215 das credenciais escaparam a dois detetores populares, o gitleaks e o TruffleHog.

Logótipo do GitHub
Imagem: Wikimedia Commons (domínio público)

O que diz a Anthropic e o que fazer já

Boris Cherny, da equipa do Claude Code, disse no Hacker News que a equipa está a ver «o que podemos fazer para evitar isto» e sugeriu o modo automático, embora tenha reconhecido que também aí os comandos podem ficar gravados. A ideia de incluir um detetor de segredos no próprio Claude Code está a ser estudada.

Até lá, a recomendação dos investigadores é clara: procurar .claude/settings.local.json e .claude/settings.json nos repositórios e no histórico, mudar primeiro todas as palavras-passe, tokens e chaves que lá tenham estado e só depois limpar. Eu acrescento uma regra simples: nunca escrever segredos diretamente nos comandos e usar variáveis de ambiente. E adicionar o ficheiro ao .gitignore do próprio projeto custa dez segundos.

Não é o primeiro susto com agentes de programação, como vimos quando um agente com Claude Opus 5 apagou uma base de dados. E com o Claude Code a tornar-se essencial para muitos programadores, estes descuidos multiplicam-se depressa.

Dúvidas4 perguntas

Perguntas frequentes

Que ficheiro do Claude Code está em causa?

O .claude/settings.local.json, onde a ferramenta grava as regras aprovadas com «Yes, and don't ask again». O .claude/settings.json partilhado também tinha alguns segredos.

Quantos segredos foram encontrados?

A Apiiro encontrou 1.379 credenciais diferentes em 1.122 ficheiros atuais e 2.539 segredos no total, somando histórico, definições partilhadas e registos.

A Anthropic já corrigiu o problema?

Ainda não há correção anunciada. Boris Cherny, da equipa do Claude Code, disse que estão a estudar formas de evitar isto, incluindo um detetor de segredos.

O que devo fazer se uso o Claude Code?

Procurar o ficheiro nos repositórios e no histórico, mudar todas as credenciais que lá estiveram, usar variáveis de ambiente e adicioná-lo ao .gitignore do projeto.