Pular para o conteúdo
>_ITDITDPlataforma de Segurança Web

Guias de Segurança

Código escrito por IA vazou uma chave de API e gerou cobranças fraudulentas — a verdadeira causa foi um CVSS 10.0 sem correção

Um app criado com ajuda da IA tem a chave de API roubada e acumula cobranças fraudulentas. A causa real não foi o suspeito óbvio, mas um RCE público CVSS 10.0 com meses sem patch — e como evitar que se repita, de forma defensiva.

Publicado 2026-06-07 7 min de leitura

Um caso que desenvolvedores indie sem familiaridade com segurança costumam enfrentar, com todo detalhe identificável removido e transformado em lição. Não há reprodução de ataque aqui — o objetivo é a defesa, para que o mesmo erro não aconteça com você.

Ficha do caso — INCIDENT FILE
Classe
Vazamento de chave de API / cobrança fraudulenta
Severidade
Crítica (um CVSS 10.0 publicado foi abusado)
Causa raiz
Um RCE pré-autenticação no framework web ficou sem correção por meses
Escopo do vazamento
Todos os segredos do ambiente (o chaveiro inteiro)
Escopo da execução
Permaneceu dentro de um container sem privilégios (o root do host ficou intacto)
Correção permanente
①atualizar para a versão corrigida ②rotacionar todas as chaves ③monitorar CVEs por máquina
10.0
CVSS / pior classe
meses
tempo sem correção
todo o env
escopo de vazamento presumido
monitoramento
a prevenção de verdade

“Parou as cobranças” ≠ “resolvido”

Parar a fatura é primeiros socorros. Fechar o caminho do vazamento é uma operação separada. Você só termina quando faz as duas coisas.

O que aconteceu (linha do tempo)

  1. Dia 0 — publicado e em operação

    Um app criado com a ajuda da IA foi publicado e estava rodando em produção.
  2. Um dia — a fatura dispara

    A fatura da IA na nuvem salta de repente. Jobs em massa num modelo que jamais seria usado, fazendo um trabalho que não era seu.
  3. Investigação — abuso por terceiros

    "Nosso app saiu do controle" não explica. Um terceiro estava operando com uma chave roubada.
  4. A caçada — começa a investigação de verdade

    "Então, de onde a chave vazou?" — essa era a investigação de verdade.

Por que não foi pego de início (os desvios)

Na ordem em que os erros foram cometidos — porque os erros são a lição.

1

Pulou para um culpado

Primeira suposição: "nosso próprio código de fallback saiu do controle." Mas os dados (o que foi de fato processado) deixaram claro que não podia ser isso.
→ Antes de decidir "culpa minha" ou "culpa deles", olhe primeiro os dados.
2

Um grep limpo quase trouxe alívio

Todo o código, o histórico do git, os repositórios vinculados foram pesquisados → nenhuma chave em texto puro em lugar algum. Quase desistiu como "não rastreável". Fixado nos arquivos, o vazamento em tempo de execução passou batido.
3

Esconder o sintoma pareceu corrigir

Mascarar o sintoma no proxy quase pareceu suficiente. Mas mascarar deixa o RCE vivo. O buraco continua aberto até a raiz ser corrigida.

Um grep limpo não é o sinal de tudo certo

Mesmo sem nenhuma chave em arquivo algum, uma vulnerabilidade pode extrair variáveis de ambiente de um processo em execução. Vazamentos acontecem em tempo de execução (RCE, headers HTTP), não só em arquivos. Veja O que é RCE.

A causa real: um CVSS 10.0 publicado e negligenciado

Uma assinatura estranha em logs de acesso antigos casou instantaneamente com a inteligência de ameaças. A faixa de versões do framework web em uso tinha um RCE pré-autenticação publicado (CVSS 10.0) que já estava sendo explorado na prática — e ficou sem correção por meses.

  • Isso não foi um bug passivo — foi um invasor executando código no servidor e exfiltrando o ambiente.
  • A salvação: a execução ficou dentro de um container sem privilégios (o root do host não foi tomado). A análise da invasão não encontrou backdoor persistente, minerador nem C2 — o impacto confirmado foi o roubo de segredos.
  • Como o banco de dados interno estava acessível, a resposta presumiu que o conteúdo do banco também havia vazado.
Sintoma visível: uma fatura surpresa e irreconhecível (ponta do iceberg)
linha d'água: tudo o que dá para ver
↑ chaves roubadas são revendidas / abusadas depois
todo o env (cada segredo) é exfiltrado
↑ o invasor executa código arbitrário no servidor em produção
causa raiz: um CVSS 10.0 publicado e negligenciado (RCE pré-autenticação)
A fatura surpresa é a ponta do iceberg. Abaixo da linha d'água está a causa real: um CVSS 10.0 publicado e negligenciado.

Lição: quando algo se comporta de forma estranha, suspeite primeiro de um CVE conhecido. Não presuma que é um bug seu.

A contagem também estava errada — julgue pela versão em execução

Expandindo a análise, "mais 8 dependências vulneráveis" foi reportado — também errado. Tinham sido contadas pelo piso no package.json (a faixa com o acento circunflexo ^). As realmente perigosas eram apenas as 2 dependências fixadas que ficaram para trás.

Confira suas próprias versões em execução

Veja as versões de fato resolvidas, no lockfile ou no container em execução.

# npm: ver o que está de fato instalado
npm ls next react react-dom
 
# dentro de um container em execução
docker exec <container> npm ls <package>

Os números aqui são a verdade — não o ^ no package.json.

O que foi feito primeiro (passos reproduzíveis)

1

Revogar a chave abusada imediatamente

Primeiros socorros — só parte do trabalho.
2

Atualizar o framework para a versão corrigida

Fechar o RCE de verdade. Após atualizar, confirme que a assinatura do vazamento some nos logs.
3

Rotacionar todos os segredos

Suponha-os vazados. Ordene por "abusável de qualquer lugar primeiro": chaves de object storage → chave de assinatura de sessão → chaves de API → credenciais do banco.
4

Análise da invasão

Verifique persistência, cron malicioso, C2 de saída (nada aqui).
5

Defesa do lado da conta

Troque a senha, ative MFA, verifique chaves de API desconhecidas.

A prevenção de verdade: deixe as máquinas vigiarem

Resumindo, este incidente foi "um humano deixou passar um CVSS 10.0 publicado". Patrulhas manuais sempre deixam algo escapar. As máquinas, não.

Varredura de dependências que você pode começar hoje

Grátis para começar — um passo no CI.

# OSV scanner (Google) verifica seu lockfile
osv-scanner --lockfile=pnpm-lock.yaml
 
# No GitHub, ative o Dependabot (Settings do repo → Security)

Este site, seguindo esta própria lição, monitora suas dependências em busca de CVEs — praticamos o que recomendamos.

Lições

Erros comuns

  • Considerar resolvido em "parou as cobranças"
  • Relaxar porque o grep está limpo
  • Mascarar o sintoma num proxy e achar que corrigiu
  • Contar vulnerabilidades pelo piso do package.json
  • Rotacionar só a única chave confirmadamente abusada

Defesa correta

  • Tratar primeiros socorros e "fechar o caminho do vazamento" como dois trabalhos separados, fazer ambos
  • Suspeitar também de vazamentos em tempo de execução (RCE, headers)
  • Atualizar a raiz (o framework)
  • Julgar pela versão de fato em execução
  • Substituir todo o env se ele vazar

Em uma linha: a fatura descontrolada era a ponta do iceberg. A causa real foi um RCE CVSS 10.0 negligenciado — e a verdade não veio de um palpite de sorte, mas de errar, colidir e desgastar os erros.

Leia a seguir

FAQ

QSe uma chave de API vaza, basta revogar apenas a chave que foi abusada?
A

Não. Quando o caminho do vazamento é em tempo de execução (um RCE ou um vazamento por header), suponha que todos os segredos do ambiente vazaram de uma vez e rotacione todos. A chave que você viu sendo abusada é só a ponta do iceberg.

QSe um grep no meu código e no git não encontra nenhuma chave, estou seguro?
A

Não necessariamente. Mesmo sem nenhuma chave em arquivo algum, uma vulnerabilidade no framework pode exfiltrar variáveis de ambiente direto do processo em execução. Vazamentos também acontecem em tempo de execução, não só em arquivos.

QO que impede isso de acontecer de novo, da forma mais confiável?
A

Monitorar suas dependências em busca de CVEs por máquina. A causa raiz aqui foi um humano deixando passar um CVSS 10.0 publicado por meses; o Dependabot ou o osv-scanner fecham essa lacuna de forma estrutural.