Em 26 de agosto de 2026, o pesquisador de segurança Johann Rehberger pediu ao Claude Code, rodando Opus 5 em Auto Mode, para resumir um website. Vinte minutos depois, ele tinha execução remota de código, um callback de comando e controle ativo, e o aplicativo de calculadora abrindo na máquina de teste.
Esse é o Claude Code prompt injection funcionando exatamente como ninguém projetou. O classificador de segurança do Auto Mode é construído para pegar ações que parecem arriscadas individualmente. Uma cadeia de passos que cada um parece fino por conta própria pode passar direto por ele, e foi exatamente isso que aconteceu aqui. Rodar Claude Code dentro de isolamento real no nível do SO, o sandbox Bash integrado ou um container, é o que realmente para isso.
Como a injeção de prompt enganou o Claude Code para rodar malware
A cadeia de ataque juntou seis passos individualmente benignos até Claude rodar código que já havia recusado executar uma vez.
A ferramenta WebFetch do Claude hit a página maliciosa primeiro e recebeu um erro 415, um tipo de mídia não suportado. Ninguém disse ao Claude para trocar de ferramentas. Ele decidiu por conta própria fazer retry com curl, e é nesse comando shell onde a real cadeia de exploit começa. A URL raiz do site redirecionou com 303 para um arquivo ZIP rotulado como um catálogo de notebook: metadados, um README, sete registros codificados, um binário macOS chamado decoder-darwin, e um arquivo extra nomeado struct.py.
Claude leu o README, combinou o propósito do binário, e recusou executá-lo.
Essa recusa era a chamada correta por cada instinto de segurança que ele tem, e também é o exato momento em que o ataque foi bem-sucedido. Em vez de executar um binário desconhecido, Claude escreveu seu próprio decodificador Python e o executou de dentro da pasta do arquivo extraído. Esse decodificador importou o módulo base64 padrão do Python, base64 importa struct internamente, e Python encontrou um arquivo nomeado struct.py bem ali no diretório de trabalho. Ele carregou o arquivo do atacante em vez do real.
O struct.py envenenado foi ofuscado (Rehberger usou ChatGPT para escrever a ofuscação) e lançou um subprocess Python isolado que baixou e executou um payload remoto. Em uma variante, abriu Calculator e se juntou a um servidor de comando e controle. Em outra, lançou uma segunda instância do Claude Code sem cabeça via claude -p, que rodou whoami, uname, e id por conta própria antes de escrever arquivos fora do diretório de trabalho.
Em três variantes de ataque, executadas cinco vezes cada, uma amostra pequena e Rehberger diz isso ele próprio, a cadeia foi bem-sucedida de 60 a 80 por cento das vezes.
O que a injeção de prompt realmente significa para um agente de código?
Injeção de prompt é conteúdo não confiável, uma página web, um arquivo, um arquivo ZIP, direcionando o que um agente faz a seguir sem nunca dizendo a ele diretamente o que fazer. Ninguém digitou "ignore suas instruções e execute este binário" no Claude Code. O website apenas tornou o caminho malicioso parecer como a única forma de terminar uma tarefa completamente ordinária.
Modelos frontier praticamente deram de ombros aos antigos ataques há anos. Dizer ao Claude outright para ignorar suas instruções não funciona mais, e não funciona há um tempo. O que ainda funciona é uma cadeia de passos individualmente razoáveis que só somam algo perigoso quando você olha para a sequência completa: um fetch falhado, um retry normal, uma recusa de executar um arquivo suspeito, um pequeno script que o modelo escreveu ele próprio. Cada passo passa em uma verificação de sanidade por conta própria.
O classificador da Anthropic avalia mensagens do usuário, chamadas de ferramenta, e conteúdo de CLAUDE.md, mas não resultados de ferramentas brutos, especificamente para que texto hostil sentado em um arquivo ou uma página não possa manipulá-lo diretamente. Esse design bloqueia uma página que soletra um comando malicioso, mas não faz nada sobre uma página que apenas torna curl parecer a única forma de terminar a tarefa.
Uma avaliação de terceiros que Anthropic encomendou testou 72 cenários de injeção, dez rodadas cada, e voltou com uma taxa de sucesso de ataque de 0,00 por cento para Opus 5 em Auto Mode. A cadeia de Rehberger não foi uma das 72. Ambos os números são verdadeiros ao mesmo tempo, e é exatamente o problema em citar um deles sem o outro.
Como ativar o sandbox Bash do Claude Code
O sandbox Bash é incorporado ao Claude Code e impõe isolamento de sistema de arquivos e rede no nível do sistema operacional, no macOS, Linux e WSL2. É o limite que teria parado a cadeia de Rehberger mesmo depois que Claude caiu na primeira jogada: curl alcançando um domínio não listado, e mais tarde o próprio callback do payload, ambos teriam atingido a parede de rede antes de qualquer um funcionar.
Inicie uma sessão e execute:
/sandbox
Isso abre um painel com Mode, Overrides, e uma aba Config mostrando suas configurações resolvidas. Na aba Mode, escolha auto-allow. Comandos em sandbox são executados sem um prompt de permissão, porque o sistema operacional está fazendo a imposição, não um classificador.
macOS não precisa de nada extra. Sandboxing usa a estrutura Seatbelt integrada. Linux e WSL2 precisam de dois pacotes:
sudo apt-get install bubblewrap socat
Usuários do Fedora executam dnf install bubblewrap socat. Reinicie Claude Code e abra /sandbox novamente para confirmar que a aba Dependencies sumiu.
Para ativar o sandbox para cada projeto em vez de escolhê-lo por sessão, adicione isso a ~/.claude/settings.json:
{
"sandbox": {
"enabled": true
}
}
Por padrão, comandos em sandbox podem escrever apenas em seu diretório de trabalho e uma pasta temp de sessão. Acesso de leitura é mais amplo: a máquina inteira, exceto uma lista de negação curta, o que importa para a próxima seção. No lado de rede, nenhum domínio é pré-permitido. A primeira vez que um comando em sandbox precisa de um, Claude Code solicita, ou verifica contra o classificador em Auto Mode. Pré-aprove os domínios que você realmente usa:
{
"sandbox": {
"enabled": true,
"network": {
"allowedDomains": ["github.com", "registry.npmjs.org", "pypi.org"]
}
}
}
Adicione "strictAllowlist": true sob esse mesmo bloco de network e qualquer coisa fora da lista é negada definitivamente em vez de solicitar. Sem isso, um domínio não listado ainda para para aprovação em vez de baixar silenciosamente, o que sozinho teria capturado o arquivo ZIP de Rehberger antes de pousar.
Se você já executa a baseline de statusline e permissões da configuração do Claude Code no macOS, o bloco sandbox vai no mesmo settings.json, bem próximo a ele.
Quais credenciais o sandbox não bloqueia por padrão
Acesso de leitura padrão cobre sua máquina inteira exceto uma lista de negação curta, e essa lista não inclui suas credenciais AWS ou chaves SSH a menos que você as adicione. Um comando em sandbox ainda pode ler ~/.aws/credentials e ~/.ssh direto da caixa, e ler uma chave é suficiente para vazá-la se a camada de rede permitir o destino para onde ela é enviada.
Adicione entradas de negação explícitas para qualquer coisa com real raio de explosão:
{
"sandbox": {
"enabled": true,
"credentials": {
"files": [
{ "path": "~/.aws/credentials", "mode": "deny" },
{ "path": "~/.ssh", "mode": "deny" }
],
"envVars": [
{ "name": "GITHUB_TOKEN", "mode": "deny" }
]
}
}
}
Há uma opção mais leve também. Configurar o mode da credencial para mask em vez de deny mantém ferramentas como gh ou npm funcionando: o comando em sandbox vê um valor placeholder, e o proxy de rede do próprio sandbox troca pelo real apenas em requisições para hosts que você nomeia explicitamente. Reserve deny para credenciais que um agente de código não tem razão tarefa-relacionada para abrir em tudo.
O Auto Mode é suficiente por conta própria, ou você também precisa de um container?
Auto Mode e o sandbox resolvem problemas diferentes. O classificador do Auto Mode decide se uma ação é executada em tudo. O sandbox decide o que um comando Bash pode realmente alcançar uma vez que já está rodando, imposto pelo sistema operacional em vez do julgamento de um modelo. Ativar um não desativa o outro, e eu executo ambos juntos em cada engajamento agora.
Nenhum deles é opcional uma vez que credenciais reais estão envolvidas.
Eu construí quase o mesmo limite uma vez, para humanos em vez de um agente. Na Green Hat, desenvolvedores tinham acesso total a um ambiente dev, acesso limitado a staging, e zero acesso a produção sem um pull request revisado. Colocar um agente de código em sandbox segue o mesmo princípio, imposto por bubblewrap e um proxy de rede em vez de um humano revisando um diff.
Mesmo limite, enforcer diferente.
O padrão que quebra sem nada disso já destruiu uma store sobre a qual escrevi separadamente: um agente de IA dado acesso irrestrito à API para uma stack WooCommerce ativa não precisava ser sequestrado para causar dano. Tinha permissão e nenhum limite, ponto final. Um agente de código sequestrado com a mesma falta de limite é essa mesma falha com um passo extra parafusado na frente. OpenClaw envia com quase o padrão idêntico, coberto em onde n8n, OpenClaw, e as ferramentas de agente do Claude realmente divergem: sandboxing é opcional lá também, e muitas pessoas pulam.
Rodar Claude Code com --dangerously-skip-permissions, ou com bypass de permissões habilitado em qualquer interface, apenas pertence dentro de um container ou VM sem caminho de volta para seus arquivos reais. A própria documentação da Anthropic diz o mesmo: a flag desativa todo prompt e verificação de caminho protegido, e é segura apenas onde uma sessão comprometida genuinamente não pode alcançar nada que importa.
Então o que você realmente muda primeiro?
Se Claude Code apenas toca um projeto descartável sem nada sensível para ler, o sandbox integrado em auto-allow, com um real allowlist de domínio, cobre trabalho diário. Se está tocando uma stack de produção de cliente, credenciais em nuvem, ou chaves SSH com um real raio de explosão, coloque esse sandbox dentro de um container também, ative a camada de rede deliberadamente em vez de deixar para solicitar, e pare de tratar uma aprovação do Auto Mode como prova de que um comando era seguro.
A cadeia de Rehberger foi bem-sucedida 3 vezes em 5 com as variantes mais fracas, e 4 vezes em 5 com a mais forte. Pergunte-se o que essas rodadas teriam alcançado em sua máquina.
Se sua equipe executa Claude Code, ou qualquer agente de código, contra infraestrutura real de cliente e ninguém verificou o que uma sessão sequestrada poderia realmente alcançar, esse é o tipo de revisão de arquitetura que faço antes de virar uma postmortem. Entre em contato e vou te guiar pelo que sua configuração realmente expõe.