AIDive

Ele achou uma porta aberta no meu próprio site. Veja a correção

Por AIDive · Publicado em

Segurança e IAAgentes de código

Intro: aponte para você mesmo primeiro

Aponte o REA para o seu app antes que outra pessoa o desmonte. Nós o apontamos para o nosso próprio site no ar, a partir de um sandbox descartável na nuvem, corrigimos o que ele achou e enviamos o pull request.

O REA é a skill de engenharia reversa que uma onda de vídeos apontou para o software dos outros. No nosso site, ele precisou de menos de treze minutos e de nenhuma requisição de escrita para mostrar que qualquer site podia encher a nossa lista de e-mails. Ele também achou o limite diário do nosso bot de comentários dentro do JavaScript que você baixa do nosso site. Depois da correção, a requisição que antes passava é recusada.

O resultado são seis regras para rodar a mesma auditoria no seu app: o sandbox descartável, a URL exata, a classificação dos achados, a config no seu bundle, os freios dos endpoints e a prova da correção.

O que é o REA e como instalar

REA quer dizer Reverse Engineer Anything: um conjunto de ferramentas que deixa o Claude Code desmontar o app que você publica. Engenharia reversa é descobrir como algo foi construído a partir da coisa pronta, como um mecânico que lê um carro sem ter os desenhos da fábrica.

Em vez de ler o seu código-fonte, o REA lê o bundle, que é o JavaScript que o seu site realmente envia a cada visitante. Desse bundle ele lista as rotas, os endpoints que as suas páginas chamam e qualquer coisa que você deixou ali por engano. Ele não devolve o código-fonte, porque você só recebe evidências, e a própria documentação dele diz que ele também não é um sandbox.

Para instalar:

  1. Instale o REA pelo pacote oficial e fixe a versão, porque ele lançou seis releases em uma semana.
  2. Rode o setup dele para o Claude Code.
  3. Ative o perfil compact, já que ele carrega bem mais de cem ferramentas na sua sessão.
  4. Instale só pelo repositório oficial, porque já circulam cópias falsas com malware dentro.

Quando rodamos a instalação no nosso sandbox, o agente primeiro conferiu que o pacote apontava para o repositório oficial antes de mexer em qualquer coisa. O setup instalou a skill, mas nenhum servidor de ferramentas, então o Claude Code usou as versões de linha de comando das mesmas ferramentas do REA. Se as ferramentas não aparecerem depois do setup, você não precisa reiniciar nada: chame os mesmos passos pelo terminal.

Regra 1: rode onde não possa causar estrago

A primeira regra é sobre onde você roda. Você vai deixar um agente controlar um navegador e executar ferramentas baixadas contra o seu app em produção. No seu notebook, esse agente fica ao lado das suas chaves, dos seus outros projetos e de todas as contas em que você está logado. As próprias notas de segurança do REA dizem sem rodeios: isto não é um sandbox.

Um sandbox é uma máquina descartável: se algo der errado, fica lá dentro e você a apaga. Abra um sandbox descartável no seu repositório e rode a auditoria inteira nele, nunca na sua própria máquina.

Usamos o Kosuke, que roda o Claude Code na sua própria assinatura dentro de uma máquina descartável na nuvem. Você escolhe o repositório, diz ao agente de deploy como o app sobe e ele entrega um preview, um link onde o seu app em execução aparece. Cada chat também ganha a sua própria branch, ou seja, a sua própria cópia do código, e termina com um pull request. Quando importamos o nosso site, o agente instalou o gerenciador de pacotes e um navegador headless, mediu a memória e escolheu sozinho o tamanho da máquina. Poucos minutos depois, o nosso site de verdade estava rodando ao lado do chat, numa branch em que ninguém mais mexe.

Uma armadilha de um teste anterior: um app Next.js novo aparecia no preview, mas nada na página respondia. A correção é uma linha na config do Next que libera o endereço do preview, e a página ganha vida.

O limite é que isto é o mesmo Claude Code com uma caixa em volta, então uma máquina virtual local ou um contêiner faz o mesmo trabalho. O que importa é a caixa, não a marca.

Aviso: o Kosuke nos deu acesso grátis ao plano mais alto. Digite o código AIDIVE2026 no campo "Promo code" logo depois do cadastro e você ganha trinta dólares de créditos em vez dos dez de sempre.

Regra 2: uma URL exata, toda escrita bloqueada

A segunda regra é o que você de fato diz ao REA. Se você só disser "audite meu app", a skill do REA para e pergunta qual app.

O REA também nunca abre um navegador sozinho, então você inicia um com uma porta de depuração, uma porta que deixa uma ferramenta observar tudo o que a página faz. Monte nesta ordem:

  1. Mantenha a porta de depuração no loopback, o endereço que só a sua máquina alcança, e dê ao navegador um perfil novo.
  2. Bloqueie toda requisição de escrita antes de qualquer página carregar, para que a auditoria possa ler o seu site, mas não envie um formulário nem mude nada.
  3. Só então dê ao REA as páginas exatas que você quer que ele leia.

No nosso prompt, citamos duas páginas do nosso clube gratuito e escrevemos uma regra em palavras simples: nunca enviar uma escrita ao site no ar. Isso importava, porque o formulário dessas páginas alimenta uma lista de e-mails real, com gente de verdade. O agente levou a regra a sério e escreveu a sua própria guarda, pequena, que deixava as leituras passarem e barrava todo o resto. Durante a auditoria, essa guarda barrou seis tentativas do script de analytics, e nenhuma requisição chegou ao nosso formulário de inscrição.

Aí o REA fez a parte dele: inspecionou cada página, leu cada bundle, tirou screenshots e exportou os scripts para fora do repositório.

O limite é que o REA só observa o que carrega enquanto está conectado, então tudo o que aconteceu antes continua como desconhecido no relatório. Mesmo assim, você passa a ter um relatório do seu app no ar, escrito sem tocar em nenhum dado dele.

Regra 3: classifique cada achado antes de corrigir

A terceira regra é classificar antes de corrigir. Um relatório assim vem cheio de linhas alarmantes e você vai querer corrigir tudo de uma vez.

A skill do REA quer cada conclusão marcada como observação, inferência ou desconhecido, com um ID de evidência. Isso é o que ele viu, o que ele supôs e o que ele não conseguiu ver, e o ID de evidência é um recibo que você pode conferir. Classifique cada achado assim primeiro, usando só a visão de quem está de fora, e faça o commit dessa versão antes de abrir qualquer arquivo de código. Depois leia o seu código e marque cada linha como vazamento real, como intencional ou como falso positivo.

O nosso relatório teve quinze achados:

Achado O que o REA viu Nosso veredito
Endpoint de inscrição Sem limite e sem checagem de qual site estava chamando, então qualquer site podia fazer o navegador de um visitante inscrever qualquer e-mail na nossa lista Vazamento real, o pior
Trava de e-mail nos packs gratuitos O pack inteiro já está na página que você carrega; uma linha no console do navegador remove a trava, ou o modo leitura mostra o texto Intencional
Source maps, chaves, cookies Nenhum nos bundles, nenhum cookie em lugar nenhum Boa notícia

A trava é intencional porque os packs são gratuitos de propósito, e o nosso próprio código diz que um formulário quebrado nunca deve esconder uma página gratuita.

O limite é a coluna do desconhecido. O REA não enxerga o que o seu servidor faz, então você resolve essas linhas lendo o código do seu servidor.

Regra 4: seu bundle publica a sua config

A quarta regra é sobre o que o seu bundle carrega, porque um arquivo de configurações compartilhado pode viajar até cada visitante sem você perceber.

Veja como acontece. Você importa a sua config em um helper, e dois componentes interativos pequenos usam esse helper. O bundler, a ferramenta que empacota o seu código nos arquivos que o navegador baixa, não sabe quais chaves eles precisam, então envia todas.

Foi exatamente isso que o REA achou no nosso JavaScript. A config inteira do site estava num único arquivo, com o ID da nossa lista de e-mails, as nossas pastas de build e os limites do bot que responde aos comentários dos nossos vídeos. Ela até dizia quantas respostas o bot envia por dia, cem, e quantos erros acionam o interruptor de segurança. Os dois componentes que a importavam só liam o nome do site e a lista de idiomas.

A regra: procure no seu JavaScript publicado as suas próprias chaves de config e passe aos componentes de cliente só os campos que eles leem. No nosso sandbox, o agente dividiu a config numa versão minúscula para o navegador, só com esses campos, e o resto ficou no servidor. Ele também adicionou uma etapa de build que falha se uma chave de servidor voltar a aparecer num arquivo publicado, para você não regredir.

Nada disso era uma senha, mas tudo o que está nesse arquivo é público, então os seus segredos só vivem em variáveis de servidor.

Regra 5: todo endpoint aberto ganha um freio

A quinta regra corrigiu o nosso vazamento de verdade, e vale sempre que você tem um formulário público que chama um serviço pago: a sua lista de e-mails, o seu modelo de IA ou o seu gateway de SMS. Você o chama por uma função de servidor minúscula que escreveu numa tarde. A nossa recebia um e-mail e o repassava direto para a lista, e qualquer outro site podia fazer o navegador de um visitante enviar isso.

O checklist do próprio mundo da segurança diz sem rodeios: o seu controle de acesso só funciona em código que o atacante não consegue alterar, ou seja, o seu servidor. Então ponha freios em todo endpoint assim:

  • Checagem de Origin. O cabeçalho Origin é o carimbo que o navegador põe numa requisição para dizer qual site a enviou, então um formulário em outro site é recusado.
  • Rate limit. Um teto de quantas requisições um visitante pode enviar numa janela curta.
  • Consentimento checado no servidor. A caixa que você marca viaja de fato com a requisição.

No nosso sandbox, o agente escreveu tudo isso no nosso Worker, a pequena função que roda na frente das suas páginas quando você as visita. Depois testou contra um serviço de e-mail falso, nunca o de verdade, e cada requisição foi recusada exatamente onde devia. Enviar do site errado é recusado. A sua sexta requisição em um minuto também é recusada, e sem consentimento você é rejeitado.

O limite é que um script pode falsificar o carimbo de Origin, e o rate limit conta por localização, então a correção de verdade para isso é a dupla confirmação por e-mail.

Regra 6: rode de novo, confira à mão, envie o PR

A sexta e última regra é provar a correção, porque um muro de checks verdes é justamente quando você para de olhar. Um desenvolvedor que testou o REA num app desktop escreveu no HackerNoon que ele deixou passar pontos de entrada que o app realmente tinha.

Então rode de novo os mesmos passos do REA no build corrigido, confira cada correção à mão pelo terminal e só então abra o pull request.

No build corrigido, a requisição que antes passava pelo nosso formulário de inscrição é recusada. As nossas chaves de servidor sumiram de todos os arquivos publicados, os cabeçalhos de segurança estavam lá e os testes do Worker passaram de falhando para passando. A trava dos nossos packs gratuitos continuava aberta, que é o que decidimos, e o relatório diz isso ao lado de cada linha.

O agente então abriu o pull request. Os relatórios estão nele só porque pedimos no prompt. O checklist de testes que o Kosuke monta ficou dentro da sessão, sem nada publicado no próprio pull request. Se o seu revisor só lê o GitHub, ponha você mesmo os relatórios de antes e depois no pull request.

Depois trouxemos a mesma mudança para o nosso próprio código, e ela vai ao ar no próximo deploy do nosso site.

Veredito: quando apontar o REA para você mesmo

A execução inteira foi o REA apontado para o nosso próprio site no ar, a partir de um sandbox descartável, com cada achado classificado, os vazamentos reais corrigidos, auditados de novo e enviados como pull request. O achado que justificou tudo foi o primeiro: qualquer site podia encher o nosso formulário de inscrição com o e-mail de qualquer pessoa.

Rode esta auditoria antes de lançar qualquer coisa com um formulário público ou um serviço pago por trás, e de novo sempre que você mudar o que é publicado. Não a rode em software que não é seu, porque o próprio aviso do REA o limita a software que você possui ou tem autorização para examinar. E ela nunca substitui a leitura do código do seu servidor, porque é exatamente ali que moram os desconhecidos.

Se você guardar uma só regra, guarde esta: rode em você mesmo, numa caixa, e corrija só o que você classificou.

O prompt exato, a tabela de triagem e a correção do Worker que enviamos estão no kit gratuito deste vídeo.

Recursos gratuitos

Fontes

Perguntas frequentes

O que é o REA (Reverse Engineer Anything)?
O REA é um conjunto de ferramentas e uma skill que deixa o Claude Code desmontar o app que você publica. Ele lê o bundle de JavaScript que o seu site envia aos visitantes e lista rotas, endpoints e qualquer coisa deixada por engano, entregando evidências em vez do seu código-fonte.
É seguro rodar o REA no meu próprio site?
Só dentro de um sandbox descartável, porque as próprias notas de segurança do REA dizem que ele não é um sandbox. Use uma máquina descartável na nuvem, uma máquina virtual local ou um contêiner, mantenha a porta de depuração do navegador no loopback e bloqueie toda requisição de escrita antes de qualquer página carregar.
Como instalo o REA para o Claude Code?
Instale pelo pacote oficial e fixe a versão, já que ele lançou seis releases em uma semana, depois rode o setup para o Claude Code e ative o perfil compact, porque ele carrega bem mais de cem ferramentas. Use só o repositório oficial, pois já circularam cópias falsas com malware.
O que o REA achou num site de produção de verdade?
No nosso site, ele gerou quinze achados. O pior foi um endpoint de inscrição sem limite e sem checagem de qual site estava chamando, então qualquer site podia fazer um navegador inscrever qualquer endereço na lista de e-mails. Ele também achou um arquivo de config compartilhado, incluindo o teto de cem respostas por dia de um bot de comentários, publicado no JavaScript.
Como protejo um formulário público que chama um serviço pago?
Ponha três freios no endpoint: uma checagem do cabeçalho Origin, um rate limit e o consentimento verificado no servidor. Um script ainda pode falsificar o carimbo de Origin e o rate limit conta por localização, então a dupla confirmação por e-mail é a correção mais forte.
Posso usar o REA em software que não é meu?
Não. O próprio aviso do REA o limita a software que você possui ou tem autorização para examinar. Ele também não substitui a leitura do código do seu servidor, porque os desconhecidos do relatório moram ali.

Vídeos relacionados