As ordens chegavam pela API
Em 12 de novembro, a Darktrace mostrou como uma chave roubada do Claude Console transforma o próprio Claude Code de um desenvolvedor em um implante de comando e controle: os trabalhos chegam por um memory store do Claude, o agente varre a rede, testa uma senha em todas as contas e envia 1 GB para a Files API, e cada pacote vai para api.anthropic.com. No Bromure Agentic Coding, a chave que o atacante rouba é um substituto que pausa a VM na saída, uma chave que ele traga é recusada, a varredura de rede é recusada no Mac e cada trabalho fica no trace.
O operador digitava cada ordem em um arquivo de texto dentro de um memory store do Claude. O próprio Claude Code do desenvolvedor lia, rodava nmap e smbclient e enviava o butim para a Anthropic.
Em 12 de novembro, Moishe Tajtelbaum e Sam Lister, pesquisadores do Darktrace Signal Labs, publicaram Living off the AI: Shared Memories as a Covert C2 Channel. É uma demonstração de laboratório, e a Darktrace diz que não viu a técnica em ataques reais. Diz também que a técnica não depende de nenhuma vulnerabilidade da plataforma Claude. Nada vai ser corrigido. Tudo é feito com recursos do Claude funcionando como projetados.
O ponto de partida é uma máquina Linux em que um desenvolvedor usa o
Claude Code. Um pequeno payload, baixado com curl e executado pelo
dash, procura a instalação do Claude Code, coleta as credenciais de
API e OAuth da conta do Claude Console do desenvolvedor e as envia ao
servidor de staging do atacante com outro curl.
Com essas credenciais, o atacante cria um memory store, um conjunto de arquivos de texto vinculado a um workspace do Claude Console, em um workspace do qual o desenvolvedor faz parte. Ele tem três arquivos: um heartbeat, um arquivo de entrada para os trabalhos e um arquivo de saída para os resultados.
De volta à máquina do desenvolvedor, o payload usa systemd-run para
criar um serviço transitório que inicia o Claude Code sem parar. Cada
execução dá sinal de vida no arquivo de heartbeat por meio de um hook,
pede ao Claude Sonnet 4.5, em modo não interativo, que leia o próximo
trabalho do arquivo de entrada, executa-o com chamadas à ferramenta
bash e grava o resultado no arquivo de saída. Depois o payload apaga a
si mesmo. A partir daí, o operador manda cada ordem em linguagem comum
para um arquivo nos servidores da Anthropic.
Nove trabalhos, um só destino
A Darktrace rodou nove trabalhos contra uma rede Active Directory simulada:
- Procurar SSH, SMB e FTP na rede local. O agente usou
ip,ssence encontrou um servidor em 192.168.1.2. - Rodar um comando
nmapespecífico contra esse servidor. - Baixar o que o compartilhamento FTP anônimo oferece. Ele tinha dados de funcionários e uma senha sem nome associado.
- Montar uma lista de usuários a partir dos nomes dos funcionários:
190 entradas em
/tmp/usernames.txt. - Testar a senha em todas as contas no controlador de domínio via SMB. Funcionou em uma.
- Listar com
smbclientos compartilhamentos SMB que essa conta vê. - Listar o conteúdo de um compartilhamento, que incluía um arquivo de 1 GB.
- Baixar esse arquivo para uma pasta temporária.
- Dividi-lo em três partes e enviá-las para a Files API do Claude.
Cada uma dessas ordens, cada resultado e o envio de 1 GB foram para
api.anthropic.com, o mesmo host com que o agente do desenvolvedor fala
o dia inteiro. A maioria das empresas que usam agentes de código colocou
esse host nas suas listas de permissões. O argumento da Darktrace é que
a lista de permissões agora é o canal de C2, e o atacante nunca precisou
montar um servidor próprio depois do primeiro curl.
Os conselhos da Darktrace decorrem disso. Migrar os desenvolvedores de
chaves de API de longa duração para OAuth ou identidade federada. Onde
não der, manter as chaves de curta duração, limitadas a um workspace e
fora de dotfiles e do histórico do shell. Garantir que a telemetria dos
endpoints consiga ligar as linhas de comando e os processos filhos de
um agente à quantidade de dados que ele envia. Ficar atento a volumes
de envio muito acima do tráfego normal de inferência, e a processos de
agente que rodam nc, nmap ou smbclient.
O Bromure Agentic Coding foi construído em torno dos mesmos conselhos, aplicados no Mac em vez de no notebook do desenvolvedor.
A mesma máquina no Bromure Agentic Coding
O Bromure Agentic Coding roda Claude Code, Codex, Grok, Kimi e omp em VMs Ubuntu no seu Mac, uma VM por máquina. O agente, o shell dele e cada programa que ele inicia ficam dentro dessa VM. As credenciais na VM são substitutos. Cada conexão de saída passa por um switch virtual e por um proxy no Mac, fora do alcance do agente.
Dê ao atacante o mesmo ponto de apoio: o payload dele roda dentro de uma máquina Bromure, como o usuário do agente, e sai procurando as credenciais do Claude Code.
A chave roubada pausa a VM
Com uma chave de API da Anthropic configurada, ANTHROPIC_API_KEY na
VM contém sk-ant-api03-brm- seguido de caracteres aleatórios. Ela tem
o formato certo, então o Claude Code a aceita, mas a Anthropic nunca a
emitiu. A chave real fica criptografada no Mac, e o proxy só a coloca
nas requisições destinadas aos hosts da Anthropic.
Com uma assinatura do Claude, o login acontece no Mac. O proxy responde ele mesmo à troca de tokens e guarda os tokens OAuth no armazenamento do host, e o Claude Code é informado de que a credencial fica no Mac. Não há tokens OAuth na VM para o payload coletar.
Então o payload envia o que achou ao servidor de staging, e cada requisição de saída da VM passa pela análise do proxy. Um substituto do Bromure tem uma única família de destinos legítimos, e o servidor de staging não está nela. O proxy bloqueia a requisição com HTTP 451, não encaminha nada e pausa a VM. Um alerta com o título This environment may have been compromised nomeia a credencial, o host a que ela pertence e o host para onde foi enviada. Shut down, a opção padrão, desliga a máquina e a marca como comprometida. O ataque para no primeiro passo, antes de existir qualquer memory store.
Sem chave real, sem canal
Suponha que o payload esconda a chave bem o bastante para tirá-la da
VM. O operador agora tem sk-ant-api03-brm-…. A API da Anthropic a
rejeita. Ele não consegue criar um memory store no seu workspace,
escrever um trabalho nele nem ler um resultado. O canal exige que o
operador alcance o store do lado dele, e do lado dele a chave não
funciona.
O atacante poderia trazer uma chave própria: uma chave da Anthropic de uma conta que ele controla, colocada na VM, para que o implante leia os trabalhos do workspace do atacante. Ative Only allow credentials Bromure injects nos Guardrails da máquina. Com esse modo estrito, qualquer requisição que leve uma credencial que o Bromure não colocou é bloqueada e dispara o mesmo alerta de comprometimento. Seu tráfego da Anthropic continua funcionando. Uma segunda conta da Anthropic na mesma VM não passa.
A varredura para no Mac
Os próprios trabalhos precisam da rede. As máquinas Bromure ficam em
uma sub-rede privada própria, e cada pacote de saída passa pelo Mac.
Mude a máquina para OpenShell + Sentry e tudo é negado, a menos que
uma regra permita. Faixas privadas como 192.168/16 só são alcançáveis
por um nome de host exato ou por uma entrada allowed_ips. O primeiro
trabalho da Darktrace não encontra nada em 192.168.1.2, o nmap não
recebe resposta, e não há compartilhamento FTP nem controlador de
domínio para testar senhas. Cada conexão recusada é uma linha
Firewall na Security Timeline.
Com Enforce binaries ligado, um atestador de propriedade do root na
VM liga cada conexão ao programa que a abriu, e cada regra nomeia os
programas que podem usá-la. nc, nmap e smbclient não aparecem em
lugar nenhum. O mesmo modo elimina todos os caminhos para root, então o
payload não consegue usar sudo para contorná-lo.
Os agentes da máquina também ficam sabendo. Com Tell the agent when policy blocks it, padrão nas máquinas OpenShell, o Bromure usa as cadeias de processos da sentinela do kernel para achar o agente por trás de uma conexão bloqueada e escreve uma nota na conversa dele: o que foi bloqueado, que isso é intencional e que ele não deve tentar de novo nem chegar à mesma coisa por outro caminho. Uma sessão do Claude Code convencida a varrer a rede recebe essa nota logo depois do comando bloqueado.
O envio dispara o watchdog
O último trabalho da Darktrace manda 1 GB para a Files API em três partes. O tráfego normal de um agente são prompts, respostas e pequenos resultados de ferramentas. O agent watchdog observa cada sessão de fora da VM. Ele conta o volume de saída no switch de rede, separado do proxy, e o compara com a linha de base da própria sessão. Também conta rajadas de requisições bloqueadas, como uma varredura ou um teste de senha em massa batendo na negação padrão. Configurado em Quarantine, ele corta a rede da VM e a pausa em milissegundos, depois lista o que viu e pergunta o que você quer fazer.
O trace mostra cada trabalho
Os conselhos de detecção da Darktrace se resumem a correlação: ligar o processo do agente às linhas de comando, aos filhos e aos bytes que ele envia. Em uma máquina Bromure, esses registros já estão no seu Mac, e o agente não consegue editá-los.
O proxy grava um registro de trace por requisição: host, método,
caminho, status e bytes da requisição e da resposta. Um heartbeat a
cada poucos segundos, leituras e gravações em um memory store e três
POSTs grandes para /v1/files ganham cada um a própria linha, com o
tamanho.
Máquinas novas fazem trace no nível AI request details, que guarda
os corpos completos de requisições e respostas da Anthropic e dos
outros provedores de modelos e os analisa. Na visão Conversation do
Trace Inspector, os trabalhos do operador, que o Claude leu do
memory store e trouxe para o contexto, aparecem em texto claro. Ao lado
estão as chamadas à ferramenta Bash do modelo com os comandos exatos:
a linha do nmap, a chamada do smbclient, o split. A Darktrace
teve de reconstruir a cadeia a partir de telemetria de rede e de
endpoint. Aqui ela aparece em ordem.
Em uma máquina com a sentinela do kernel, cada início de programa e
cada conexão são relatados de dentro do kernel da VM, por um canal que
o agente não consegue silenciar matando um processo. Uma conexão
recusada para 192.168.1.2 se abre na sua network lineage: o
prompt, o raciocínio do agente antes da chamada, a chamada de
ferramenta e a cadeia de processos de claude até nmap, passando por
bash. O cartão Prompt contém um trabalho que você nunca escreveu.
Limpeza
Se o alerta de comprometimento disparou, a máquina fica marcada como comprometida e não inicia até você escolher Wipe and Launch. Isso apaga a imagem de disco e a pasta pessoal dela e mantém seus tokens, chaves SSH e configurações. Sem o alerta, Reset disk clona de novo o disco do sistema a partir da imagem base. Rewind home… volta a pasta pessoal ao início de um dia anterior, antes da chegada do payload. E como a máquina nunca teve a sua chave real da Anthropic, a chave que você teria de trocar continua onde estava: no seu Mac.
A chave é uma armadilha
O payload encontra um substituto sk-ant-api03-brm-, ou nenhum token com uma assinatura. Enviá-lo ao servidor de staging rende HTTP 451 e pausa a VM.
Nenhum canal para abrir
Um substituto não consegue criar nem ler um memory store. Uma chave trazida pelo atacante é recusada pelo modo estrito de credenciais.
Os trabalhos batem no muro
A negação padrão recusa 192.168.1.2, Enforce binaries não nomeia nmap nem smbclient em lugar nenhum, e o Claude Code é avisado para não tentar de novo.
Cada ordem registrada
O trace guarda o caminho e o tamanho de cada requisição e analisa os trabalhos e as chamadas de ferramenta. O watchdog põe uma sessão em quarentena diante de um envio desproporcional.
O que fazer esta semana
- Descubra onde ficam as chaves de API do Claude, da OpenAI e de outros
modelos dos seus desenvolvedores: perfis do shell, arquivos
.env, pastas de configuração de agentes. Passe o que puder para OAuth ou login federado, e deixe o resto de curta duração e limitado a um workspace. - No Claude Console, revise quais workspaces cada chave alcança e procure neles memory stores e envios para a Files API que você não reconhece.
- Crie alertas para processos de agente que iniciam
nc,nmap,smbclientou ferramentas parecidas, para unidadessystemd-runque iniciam um agente e para envios a provedores de modelos muito acima do tráfego normal de inferência. - Não trate uma entrada de
api.anthropic.comna lista de permissões como uma decisão de confiança sobre o que passa por ela.
Depois, dê aos seus agentes uma máquina em que a chave que eles têm só funcione a caminho da Anthropic, a rede que eles alcançam seja a que você listou, e cada requisição que fazem seja registrada onde eles não podem alterá-la. Substitutos e modo estrito estão no capítulo Credentials & the Wire Boundary do manual, a negação padrão e a sentinela do kernel em Sandbox Policy, e o trace em Tracing & Audit.