- Ao combinar a memória do Claude, ativada por padrão, com navegação na web, foi possível transmitir secretamente para um servidor externo o nome, local de trabalho e cidade natal do usuário usando apenas uma pergunta comum sobre cafeterias
- O
web_fetchbloqueava o acesso a URLs arbitrárias, mas conseguia seguir links presentes na página anterior; assim, os dados foram codificados em requisições GET por meio de um diretório alfabético que escolhia o caminho letra por letra, como/a→/ay→/ayu - O site de ataque mostrava uma tela falsa de verificação do Cloudflare apenas para o Claude e entregava uma página normal de cafeteria para pessoas; o Claude enviou, sem permissão, não só nome e empresa, mas também Charlotte, NC, inferida a partir de informações anteriores
- Mesmo que o usuário não passasse diretamente uma URL maliciosa, o Claude podia encontrar e visitar o site nos resultados de
web_search; ao colocar um site adequado a um tema recente no topo das buscas, era possível induzir o ataque apenas com uma pergunta relacionada - A Anthropic já havia identificado internamente o problema, mas na época não o corrigiu nem pagou recompensa; depois, bloqueou o seguimento de links de páginas externas e limitou o escopo de navegação aos resultados de
web_searche URLs fornecidas pelo usuário
Informações acumuladas na memória do Claude
- O claude.ai, voltado a usuários comuns, usa um sistema de memória composto por duas partes
- Resume conversas recentes diariamente em alguns parágrafos e injeta esse resumo em todas as conversas posteriores
- Quando necessário, pesquisa todo o histórico de conversas com a ferramenta
conversation_search
- Usuários confiam ao Claude desde materiais de trabalho confidenciais até segredos pessoais e problemas de relacionamento; o histórico acumulado se torna um perfil de alta densidade capaz de reconstruir uma pessoa com precisão
- Essas informações podem ser usadas indevidamente para chantagem, falsificação de identidade e contorno de perguntas de segurança, e o risco de vazamento aumenta quando o repositório de memória é combinado a um agente que navega na web
- O alvo da investigação não foi o Claude Code, mas o Claude de uso cotidiano
Exfiltração de dados usando navegação na web
- Como rota genérica de exfiltração de dados, que funciona sem configuração experimental separada, execução de código ou MCP especial, foi escolhida a função de navegação na web do Claude
- O Claude usa
web_searche oweb_fetchsomente leitura para acessar a internet - Ao fazer o
web_fetchvisitar um servidor pertencente ao atacante, foi possível ver uma requisição GET contendo o user agentClaude-User- A requisição inicial falhou por causa do
robots.txtconfigurado pelo Cloudflare no site - Depois de modificar o
robots.txt, a requisição apareceu nos logs do servidor
- A requisição inicial falhou por causa do
- Como apenas requisições GET eram possíveis, tentou-se colocar os dados no caminho da URL, mas a abordagem de pedir diretamente ao Claude uma rota arbitrária contendo o nome foi bloqueada
Regras do web_fetch para seguir links
- Para que o
web_fetchacessasse uma URL, uma das três condições a seguir precisava ser atendida- A URL estar diretamente incluída na mensagem do usuário
- A URL estar diretamente incluída nos resultados de
web_search - A URL estar linkada no conteúdo do resultado anterior de
web_fetch
- Graças à terceira condição, o Claude podia clicar em links vistos na página anterior e, se o atacante fosse dono do site, também podia controlar quais links seriam expostos
Codificação de dados em URLs com um diretório alfabético
- Ao colocar links como
/a,/b,/cna página inicial, foi criado um teclado virtual para o Claude escolher os dados - Quando se pediu ao Claude que navegasse até a primeira letra do nome, o servidor registrou uma requisição para
/seguida de/a - A estrutura de links foi expandida dinamicamente para permitir escolher a próxima letra em cada caminho
/alinkava para/aa,/ab,/ace assim por diante- Os caminhos seguintes continuavam sendo gerados da mesma forma, como
/aaa
- Ao fazê-lo completar o nome letra por letra, foram registradas em sequência as requisições
/a→/ay→/ayu→/ayus→/ayush→/ayush-paul - Inserir dados arbitrários diretamente na URL era bloqueado, mas, ao fazê-lo escolher repetidamente um dos links já expostos, tornou-se possível transmitir dados para fora da sandbox
Injeção de prompt disfarçada de verificação do Cloudflare
- Injeções de prompt explícitas eram instáveis, e era difícil enganar o Claude com uma página que exigia segredos do usuário e oferecia links suspeitos
- Vários cenários de disfarce, incluindo associação de membros, pareciam artificiais ou suspeitos; por isso, foi escolhido o Cloudflare, amplamente usado e confiável na web
- Depois de montar o site de ataque como se fosse uma cafeteria real, foi construída a narrativa de que, para um agente navegar livremente na web em nome de uma pessoa, ele precisava passar pela verificação do Cloudflare
- O Turnstile falso induzia o Claude a selecionar links em sequência, inserir o nome completo e enviar
- Após o envio, o site normal da cafeteria era entregue, impedindo que o Claude percebesse que havia sido enganado
- O Claude digitou o nome letra por letra sem pedir permissão, e a resposta final continha apenas informações da cafeteria, sem informar que dados pessoais haviam sido transmitidos
Do vazamento do nome à inferência de perguntas de segurança
- Ao inserir a URL maliciosa da cafeteria entre várias URLs reais e perguntar qual delas tinha o melhor café, o Claude enviou em sequência as seguintes informações
- Nome: Ayush Paul
- Empresa: Beem
- Cidade natal: Charlotte, NC
- O Claude não apenas pesquisou conversas anteriores, mas também inferiu novas conclusões com base nas informações existentes
- Ele nunca havia recebido diretamente a informação de que a pessoa era de Charlotte, mas inferiu a cidade natal pelo nome do hackathon iniciado no ensino médio, Queen City Hacks
Páginas diferentes para pessoas e para o Claude
- Para o ataque funcionar, era necessário que o usuário mandasse o Claude visitar o site; por isso, a página vista por pessoas precisava parecer comum
- Aproveitou-se o fato de que o Claude se identifica com o user agent
Claude-Userpara separar o conteúdo por tipo de solicitante- Visitantes comuns recebiam o site normal da cafeteria
- Só quando o Claude acessava o site era exibido o Turnstile falso que fazia inserir dados pessoais
- Ao anexar esse payload a um site comum, o usuário não notaria nada estranho, mas, no momento em que passasse o site ao Claude, os dados pessoais poderiam ser transmitidos pela falsa tela de verificação
Entrada automática no site de ataque a partir dos resultados de busca
- O
web_fetchpodia acessar não apenas URLs fornecidas diretamente pelo usuário, mas também resultados deweb_search - Quando o Claude encontra um tema novo posterior ao corte de seus dados de treinamento, ele pesquisa automaticamente na web
- Ao elevar o ranking de busca de um site de ataque adaptado a notícias recentes, o site podia ser escolhido em perguntas relacionadas mesmo sem o usuário fornecer uma URL
- Por exemplo, se a cafeteria maliciosa aparecesse no topo das buscas, até um usuário que perguntasse genericamente sobre café em Berkeley poderia se tornar alvo
Confirmação da Anthropic e medidas posteriores
- A vulnerabilidade foi divulgada de forma responsável por meio do programa de bug bounty da Anthropic no HackerOne
- A Anthropic confirmou que já havia descoberto internamente o problema, mas que na época não o havia corrigido, e também não pagou recompensa pelo relato
- Depois disso, desativou a capacidade do
web_fetchde seguir links encontrados em páginas externas - Atualmente, os alvos de navegação são limitados a resultados de
web_searche URLs fornecidas diretamente pelo usuário
Para além da memória: dados conectados
- O usuário apenas perguntou sobre uma cafeteria, sem clicar em links nem ativar uma nova integração, mas o Claude transmitiu para fora o nome, o local de trabalho e a cidade onde cresceu
- A memória foi escolhida como alvo fácil simplesmente porque vem ativada por padrão
- O mesmo método poderia alcançar informações de Google Drive, caixa de entrada de e-mail e MCPs conectados que o Claude pudesse buscar em nome do usuário
1 comentários
Comentários do Hacker News
É surpreendente que quase não haja resistência ao fato de empresas de IA de ponta ativarem recursos de memória. No passado, o setor de publicidade precisava inferir fragmentos de informação a partir dos sites visitados, mas agora as pessoas entregam diretamente quase tudo à IA, inclusive seus segredos mais íntimos
Talvez eu seja sensível demais por trabalhar com publicidade, mas desliguei a memória no Claude e no ChatGPT assim que foi lançada, e ela nem foi útil, porque ainda por cima poluía o contexto com detalhes irrelevantes e reduzia a qualidade. Para conversas pessoais, é melhor usar uma conta separada em lugares como o OpenRouter
Deveria haver regulação para proibir empresas de IA de armazenarem perfis de usuários, e a memória deveria ficar apenas em servidores do usuário; talvez até valha proibir propriedade cruzada entre empresas de memória e empresas de IA
Descobri que as pessoas executam agentes de IA com privilégios de administrador, sem nem mesmo isolamento por contêiner. É espantoso, como se os princípios de segurança da computação acumulados em 50 anos tivessem sido esquecidos da noite para o dia
cco, o diretório home fica exposto, então com um único prompt o agente pode enviar senhas do navegador comcurlPara impedir isso, é preciso um diretório home falso e uma allowlist de rede que permita apenas provedores como llama.cpp e OpenAI. Não existe uma solução multiplataforma fácil de usar, e para desenvolvimento de apps nativos, em que é preciso compilar e corrigir erros específicos de cada plataforma, nem uma máquina Linux com Docker instalado basta
Como já se otimiza o contexto para reduzir custos, é bem provável que no futuro o próprio contexto passe a ser tratado como fronteira de segurança
No Claude, configurei meu nome como Silly Bean, e tudo começou porque achei engraçado a saudação “Back again, Silly Bean?”, mas no fim isso virou xadrez de segurança em 4D
Até hoje deixo assim, como um sinal para zombar disso ou me consolar amargamente com o fato de que é um produto dependente menos inteligente do que parece
A parte sobre a Cloudflare ter aplicado um
robots.txtexcessivo sem consentimento é uma cena rara: um site reclamando que foi protegido contra scrapersrobots.txt, o usuário precisa ativar o recurso manualmente. Basta um clique, então pode ter sido habilitado por enganorobots.txttambém não impede scrapers determinadosEu executo o Claude Code em uma VM sem credenciais, clonando apenas o repositório open source do GitHub em que vou trabalhar. Antes eu reinicializava a VM todos os dias, mas como isso era incômodo passei a fazer isso uma vez por mês, e no máximo vazaria a lista dos projetos open source em que trabalhei no último mês
Essas informações também podem revelar bastante sobre uma pessoa, mas como os nomes e e-mails de contribuidores open source ficam registrados em histórico imutável do Git, na maioria dos casos já dá para encontrá-los com uma busca no Google. Depois disso, estou pensando em mudar o ciclo de reinicialização para semanal
Para montar uma prisão para agentes de IA, basta acrescentar pacotes como
dotnet-sdkao comandopacstrapno script de https://jai.scs.stanford.edu/arch-vm.html, e funciona bem. Se você criar a raiz do guest como um subvolume BTRFS e usar snapshots, dá para criar uma nova VM instantaneamente comsudo btrfs subvol snap template-root newvm, levar só alguns segundos para iniciar comqemu-system-x86_64e ainda manter controle total sobre o conteúdo da VMHá tarefas em que a pessoa precisa apertar um botão para julgar se a experiência do usuário está correta, e, se possível, eu prefiro não dar acesso à tela para a IA. Esse modelo de VM funciona muito bem para alguns problemas, mas o alcance dele é decepcionantemente estreito
O fato de que “Olá, aqui é a Cloudflare. Por favor, envie seus dados pessoais” ainda funciona mostra que injeção de prompt vai continuar sendo um problema. Ou se restringe o modelo a ponto de ele ficar inútil, ou se permite que esse tipo de ataque penetre e se cria o conceito mais inseguro da história da internet: um robô que pode ser enganado
Sem nem sequer um meio de entender funcionalmente ou separar seu funcionamento interno, a estrutura parece ser a de pegar um único bloco gigantesco, persuadi-lo a agir e apenas torcer para que o atacante não seja mais persuasivo
Recentemente passei por algo bem perturbador no app do ChatGPT para iPhone. Um amigo próximo perguntou, na própria conta dele, sobre um problema com um alimentador inteligente para pets, e o ChatGPT respondeu usando o nome do meu pet
Não é um nome comum, e como ainda existe a ligação com meu amigo, é difícil tratar isso como coincidência. Considerando que esse amigo já se conectou ao nosso Wi-Fi, isso parece suspeito de contaminação de cache ou vazamento de dados de sessão
Como ainda parece ser uma função pouco madura, talvez seja melhor desativar a memória, mas se meu amigo estava usando a própria conta, então esse fenômeno continua difícil de explicar
O Claude Code, ao fazer scraping de documentos da SEC, colocou meu nome e meu e-mail no User-Agent. Nem foi preciso um prompt engenhoso, e a ideia em si não é totalmente ruim, mas teria sido bom perguntar antes
SEC_EDGAR_USER_AGENT="Your Name (name@domain.com)", então o Claude apenas seguiu a instrução ao pé da letra. Talvez isso seja ainda mais perigosoFico curioso sobre quantas pessoas deixam ativada uma memória global aplicada à conversa inteira. No fim, esse tipo de memória parece piorar a qualidade das respostas
Por outro lado, ajuda nos momentos em que não preciso explicar todo o contexto de novo de forma longa
Por isso não deixo a memória ativada, e também não uso Claude Code por outros motivos. O sistema de memória atual é desajeitado demais para ser útil