Como colocar um app de vibe coding no ar sem vazar dado de cliente
Equipe Rampex
O vazamento típico de app gerado por IA tem uma causa dominante: a tabela do banco aceita consulta direta do navegador sem regra de permissão, e a chave pública que fica no código do front basta para ler tudo. Antes de publicar, ligue Row Level Security em toda tabela e mova qualquer checagem de permissão para o servidor. Validação que roda só na tela é decoração, porque o atacante não usa a sua tela.
O projeto funciona. Você testou, o login entra, cada usuário vê os próprios dados na tela. Parece pronto para receber gente de verdade.
O problema é que o atacante não abre a sua tela. Ele fala direto com o seu banco, pelo mesmo endereço que o seu front usa, com a mesma chave que está no código que qualquer pessoa baixa ao abrir o site.
Este artigo é o que revisar antes desse dia.
Qual é o tamanho real do problema?
Três levantamentos públicos, com métodos diferentes, chegam ao mesmo lugar.
Um estudo sistemático publicado em junho de 2026, Understanding the (In)Security of Vibe-Coded Applications, coletou 9.041 aplicações open-source feitas com Claude Code e Lovable e auditou 200 delas já publicadas. Encontrou 1.186 vulnerabilidades. O número que importa: 91,0% das aplicações auditadas tinham pelo menos uma, e 65,77% das falhas foram classificadas como crítica ou alta. Elas se concentram em três famílias, e a primeira é a que este artigo trata: controle de acesso quebrado, injeção e falha de autenticação.
A Escape.tech escaneou mais de 5.600 aplicações públicas feitas com ferramentas de vibe coding e confirmou mais de 2.000 vulnerabilidades, 400 segredos expostos e 175 casos de dado pessoal à vista, incluindo prontuário, IBAN e telefone. A equipe descreve o recorte como conservador: só entrou na conta o que foi confirmado com alta confiança, então o número real é maior.
E o padrão já virou registro formal. O CVE-2025-48757, publicado em maio de 2025, descreve política de Row Level Security insuficiente no Lovable até 15/04/2025. A descrição oficial não deixa margem: permite que atacante remoto não autenticado leia ou escreva em tabelas arbitrárias dos sites gerados. Nota 9,3 de 10 na escala CVSS, classificado como CWE-863, autorização incorreta.
Nenhum desses três é sobre uma ferramenta ruim. É sobre o que o gerador entrega por padrão quando ninguém pede o contrário.
Por onde o dado escapa
| Onde | O que acontece | Quanto tempo leva para explorar |
|---|---|---|
| Tabela sem Row Level Security | Qualquer pessoa com a chave pública lê a tabela inteira pela API | Segundos |
| Política de RLS permissiva | RLS está ligada, mas a regra é true. Usuário logado lê a linha de qualquer outro |
Segundos |
| Chave de serviço no front | A chave service_role ignora RLS por definição. No navegador, ela é pública |
Segundos |
| Permissão checada só na tela | O botão some, a rota da API continua respondendo | Minutos |
| Bucket de arquivo público | Documento e foto enviados por um cliente ficam legíveis por URL | Minutos |
.env versionado |
Chave de API, token de pagamento e senha de banco no histórico do Git | Minutos |
| Sem limite de requisição | Enumeração de registro e força bruta no login rodam sem freio | Horas |
As três primeiras linhas explicam a maior parte dos casos, e todas são a mesma falha vista de ângulos diferentes: o banco confia em quem pergunta.
Como saber se você já está exposto
Faça isto no seu próprio projeto, agora. Leva menos de dez minutos e não depende de ferramenta paga.
-
Abra o site publicado e o DevTools do navegador. Na aba de rede, recarregue a página e procure a chamada ao seu banco. O endereço do projeto e a chave
anonvão estar ali, em texto puro. Isso é esperado: essa chave é pública por desenho. O que não pode é ela ser suficiente. -
Saia da conta. Apague o cookie e o
localStorage. Você agora é um visitante qualquer. -
Chame a API direto, sem passar pela sua interface. Troque
SEU-PROJETO,SUA_CHAVE_ANONe o nome da tabela:curl "https://SEU-PROJETO.supabase.co/rest/v1/usuarios?select=*" \ -H "apikey: SUA_CHAVE_ANON" -
Leia a resposta. Se voltar
[]ou um erro de permissão, essa tabela está protegida. Se voltar linha com dado dentro, a sua base está aberta para a internet. Repita para cada tabela que guarda algo sensível: usuário, pedido, pagamento, mensagem, arquivo. -
Teste a escrita também. Leitura aberta é ruim. Escrita aberta é pior, porque permite adulterar registro sem deixar rastro óbvio.
-
Procure segredo no que você publicou. No bundle do front, busque por
service_role,sk_live,SECRETePRIVATE. Qualquer achado precisa ser rotacionado, não só removido: o que foi publicado já foi visto. -
Verifique o histórico do Git. Tirar o
.envdo último commit não apaga o anterior. Usegit log -p --all -- .enve rotacione tudo que aparecer.
Se o passo 4 devolveu dado, pare de ler e vá para a última seção.
O checklist antes de publicar
Banco
- Row Level Security ligada em toda tabela, sem exceção. Tabela nova nasce desligada, então isso é revisão de cada migração, não tarefa de uma vez só.
- Política que nomeia o dono da linha. Uma regra que devolve
truepara todo mundo tem RLS ligada e protege nada. - A chave
service_rolenunca sai do servidor. Ela existe justamente para ignorar RLS. - Coluna sensível fora do
select *. Hash de senha, documento e token não precisam trafegar para a tela.
Autenticação e permissão
- Toda checagem de permissão roda no servidor. Esconder o botão de administrador não fecha a rota do administrador.
- Confirmação de e-mail ligada, senão qualquer endereço inventado vira conta.
- Limite de tentativa no login e nas rotas de escrita.
Segredos
.envno.gitignoreantes do primeiro commit, e chave de produção só na variável de ambiente da hospedagem.- Chave de terceiro com escopo mínimo. Chave de pagamento que só cobra não deve poder estornar.
- Rotação de tudo que já apareceu em código publicado.
Arquivo e dado pessoal
- Bucket privado por padrão, com acesso por URL assinada de validade curta.
- Nome de arquivo não sequencial.
contrato-1.pdfconvida a tentar ocontrato-2.pdf. - Só colete o que você usa. Dado que não existe na base não vaza.
Depois de publicar
- Log de acesso guardado e um lugar onde alguém olha para ele.
- Backup testado. Backup que nunca foi restaurado é uma suposição.
E se o dado já vazou?
No Brasil isso tem prazo em regulamento, e ele é curto.
A Resolução CD/ANPD nº 15/2024 regulamenta o artigo 48 da LGPD. O artigo 6º estabelece que a comunicação do incidente à ANPD deve ser feita pelo controlador no prazo de três dias úteis, contado de quando ele toma conhecimento de que o incidente afetou dado pessoal. Para agente de tratamento de pequeno porte, o prazo conta em dobro.
A comunicação exige conteúdo específico, entre outros itens: natureza e categoria do dado afetado, número de titulares atingidos, medidas de segurança em uso antes e depois, riscos e impactos, a causa raiz, as datas de ocorrência e de descoberta, e as medidas de correção.
Duas consequências práticas disso, e nenhuma é intuitiva:
O relógio começa na descoberta, não no vazamento. Adiar a investigação não adia o prazo, porque a data de ocorrência também entra no formulário.
O regulamento pede a causa raiz. Quem descobre o vazamento e conserta sem registrar o que aconteceu perde a informação que a comunicação exige.
Se você chegou aqui com dado exposto, a ordem é: feche o acesso, rotacione as chaves, levante o que foi acessado nos logs, e só então comunique. As quatro coisas cabem em três dias úteis. Nenhuma delas cabe em três dias úteis se você começar no terceiro.
O que este checklist não resolve
Ele fecha a porta mais usada, e não audita o seu código.
Duas das três famílias de falha do estudo citado acima continuam de fora: injeção e falha de autenticação pedem revisão de código, não configuração. E o próprio estudo registra que melhorar o prompt e o ambiente do agente reduz a incidência de vulnerabilidade sem eliminar o risco de fundo.
Serve de piso. Um projeto que passa nos sete testes da seção anterior não está seguro; está fora da faixa que qualquer pessoa explora com um curl.
Nota de transparência. Os números deste artigo vêm dos três levantamentos citados, todos públicos e linkados. A Rampex não publicou estatística própria sobre projetos auditados, e este texto não apresenta nenhuma como se fosse. Quando essa base estiver consolidada, ela entra aqui e a data de atualização muda.