Todos os posts
Incidente6 min de leitura

O vazamento na Railway: como rotacionar os segredos do seu app sem downtime

Row of metal keys on hooks while a robotic arm swaps one key for a new glowing one

Se você faz deploy na Railway, provavelmente já recebeu o email: rotacione suas variáveis de ambiente. Se faz deploy em outro lugar, continue lendo mesmo assim. Este incidente é um exemplo claro de um risco que todo dev indie corre, e os passos de limpeza são os mesmos em qualquer plataforma.

Veja o que aconteceu, por que o alvo eram pessoas como você e uma forma prática de rotacionar tudo sem derrubar o app.

O que aconteceu

Em 21 de outubro, a Railway revelou que um terceiro não autorizado havia acessado sistemas que armazenam variáveis de ambiente de clientes e que, em alguns casos, o atacante pode ter obtido o conteúdo descriptografado. A Railway pausou todos os deploys, avisou os provedores envolvidos para revogarem chaves e pediu a todos os usuários que rotacionassem suas variáveis de ambiente, incluindo credenciais de registries privados.

O relatório preliminar traz mais detalhes:

  • A janela do ataque foi de 20 de outubro até o início de 22 de outubro (UTC). Começou com uma tentativa de escalonamento de privilégios na infraestrutura de build.
  • No máximo 1,85% dos workspaces, cerca de 100 mil, tiveram alguma variável potencialmente comprometida. Pela forma como as chaves eram criptografadas, a Railway ainda não consegue dizer exatamente quais segredos de um projeto afetado foram expostos.
  • O atacante estava atrás de API keys de provedores de IA e de plataformas. A Railway considera de maior risco os workspaces com muitas variáveis de ambiente ou com muitas chaves de IA.
  • A Railway diz que não pode reembolsar gastos com IA feitos com chaves comprometidas. Você vai precisar resolver isso com o provedor.

O TechCrunch informa que a Railway acredita que isso fez parte de uma campanha mais ampla contra plataformas, com o objetivo de comprometer provedores de inferência de IA. Na mesma semana, a ferramenta de programação com IA OpenCode revelou que hackers haviam levado API keys e outros segredos de mais de 1% de seus clientes.

Por que quem constrói apps é o alvo

Chaves de IA roubadas valem dinheiro de verdade. Os atacantes revendem o acesso ou queimam sua cota com as próprias cargas de trabalho, um padrão que os pesquisadores chamam de LLMjacking. Uma plataforma de hospedagem é um lugar eficiente para coletá-las, porque milhares de apps guardam num só lugar as chaves da OpenAI, da Anthropic, do Stripe e do banco de dados.

Há um detalhe desconfortável no relatório da Railway. As variáveis eram criptografadas, mas a plataforma precisa conseguir descriptografá-las para injetá-las nos seus builds e serviços em execução. Assim que o atacante obteve o acesso interno certo, a criptografia em repouso não o impediu. Isso não é exclusividade da Railway. Qualquer host que roda seu código consegue ler seus segredos.

Então a pergunta não é "meu host é seguro?", e sim "se os segredos do meu host vazassem amanhã, qual seria o tamanho do estrago e em quanto tempo eu me recuperaria?"

Como verificar sua exposição

Reserve 20 minutos para isso, mesmo que você já tenha clicado em "rotacionar" em algumas coisas.

1. Faça um inventário de todos os segredos. Liste os nomes das variáveis de cada projeto e ambiente, incluindo staging e ambientes de preview. Se você mantém um .env.example, ele é um bom ponto de partida:

grep -oE '^[A-Z0-9_]+' .env.example

Para cada um, anote o que ele libera: um banco de dados, um provedor de pagamentos, um provedor de IA, email, um bucket de armazenamento, um token do GitHub.

2. Verifique o uso e o faturamento do seu provedor de IA. Procure picos de uso, modelos desconhecidos ou requisições em horários estranhos desde 20 de outubro. É onde o abuso tem mais chance de aparecer primeiro.

3. Verifique os logs de auditoria que você tem. A Railway recomenda especificamente revisar os logs de auditoria do GitHub e o acesso dos apps instalados, além dos logs de registries como o Docker Hub. Olhe também os logs de API do seu provedor de pagamentos e os logs de conexão do seu banco de dados.

4. Verifique se o seu banco de dados está acessível pela internet. O relatório da Railway recomenda remover o acesso de rede público aos bancos de dados. Se uma connection string vazada aponta para um banco ao qual qualquer pessoa pode se conectar, o vazamento pode ser explorado na hora:

nc -zv your-db-host.example 5432   # "succeeded" from your laptop = publicly reachable

5. Veja o que o seu frontend já entrega de bandeja. Vazamentos como este lembram que é preciso separar segredos de verdade de valores que são públicos por design. Uma chave que vai no seu bundle de JavaScript nunca foi secreta.

API keys no código frontend: como distinguir segredos reais de chaves públicas

Como rotacionar sem quebrar a produção

O erro comum sob pressão é revogar primeiro a chave antiga e depois correr para fazer deploy da nova enquanto o app retorna erros. Faça nesta ordem:

  • Crie uma nova credencial no provedor (nova API key, nova senha de banco de dados, novo segredo de webhook). Por enquanto, mantenha a antiga ativa.
  • Atualize a variável no seu host e faça um novo deploy para que o app em execução a carregue.
  • Confirme que o app funciona com o novo valor. Chame um endpoint que realmente use esse serviço.
  • Revogue a credencial antiga no provedor.
  • Confirme que a antiga não funciona mais, por exemplo fazendo uma chamada de teste com ela e verificando que falha.

Percorra sua lista começando pelo que causaria mais estrago: chaves de pagamento, credenciais de banco de dados, chaves de cloud e armazenamento, chaves de provedores de IA, tokens do GitHub e de registries, e depois todo o resto. As orientações da Railway se concentram nas variáveis definidas antes de 21 de outubro, e as recomendações seguintes incluem reconectar o GitHub e recriar as credenciais da CLI e do CI.

Alguns segredos exigem cuidado extra:

  • Segredos de assinatura de sessão ou de JWT. Trocá-los desloga todos os usuários. Depois de um vazamento isso costuma ser aceitável, mas avise os usuários se puder.
  • Segredos de assinatura de webhooks. Atualize ao mesmo tempo o lado que recebe e o provedor que envia, ou você vai rejeitar eventos legítimos por um tempo.
  • Senhas de banco de dados. Se a sua plataforma permitir, crie um novo usuário de banco com as mesmas permissões, migre o app para ele e depois remova o antigo. É mais limpo do que trocar a senha no lugar.

Faça o próximo vazamento doer menos

Você não consegue impedir que seu host seja invadido. Mas consegue fazer com que um segredo vazado valha menos.

Restrinja o escopo das chaves. Use chaves restritas quando os provedores oferecerem. Uma chave restrita do Stripe que só consegue criar sessões de checkout é muito menos útil para um atacante do que uma secret key completa.

Limite os gastos. Configure orçamentos mensais e alertas de uso em todos os provedores de IA. Assim, uma surpresa de cinco dígitos vira só um email.

Separe os ambientes. Não reutilize chaves de produção em staging nem em deploys de preview. Cada ambiente deve ter as próprias credenciais, para que um vazamento em um não entregue o outro.

Mantenha os bancos de dados privados. Use a rede privada da sua plataforma e, se você usa Supabase, garanta que o Row Level Security esteja ativado para que uma anon key vazada não exponha suas tabelas.

Row Level Security no Supabase: como ativar e testar

Nunca guarde segredos em arquivos acessíveis. Um arquivo .env publicado no web root vaza sem precisar de vazamento nenhum na plataforma.

Escreva agora o seu runbook de rotação. A lista do passo 1, a ordem acima e onde cada chave é gerenciada. Na próxima vez, rotacionar leva uma hora em vez de um fim de semana.

Arquivos .env expostos: como os atacantes os encontram e como verificar os seus

Checklist rápido

Passe por isto em cada app que você publica:

  • Todos os segredos de todos os ambientes estão listados, com o que cada um libera.
  • Cada um foi rotacionado na ordem criar, fazer deploy, verificar, revogar.
  • Uso e faturamento dos provedores de IA revisados desde 20 de outubro, com limites de gasto configurados.
  • Logs do GitHub, de registries, de pagamentos e do banco de dados verificados.
  • Os bancos de dados não estão acessíveis publicamente.
  • Produção e staging usam chaves diferentes.
  • Nenhum segredo real vai no código frontend nem fica em arquivos acessíveis pela web.

A lição

A Railway fez a coisa certa ao divulgar rápido e insistir na rotação. Mas isso continua acontecendo com plataformas de hospedagem e de desenvolvimento, porque é lá que as chaves estão. Quem atravessa isso com calma é quem sabe quais segredos tem e consegue trocá-los em uma tarde.

Já que você está fazendo a limpeza, vale verificar também o que o seu app expõe de fora. O AppSafe escaneia seu site em produção em busca de problemas comuns como API keys em bundles de JavaScript, arquivos .env e .git expostos e cabeçalhos de segurança ausentes, com correções em linguagem simples. Nosso checklist de lançamento para apps feitos com IA cobre o resto do básico.

Depois de rotacionar tudo, rode um scan gratuito do AppSafe para garantir que nada mais está vazando.

Rode esta checklist automaticamente

Um escaneamento grátis verifica todos esses problemas no seu app e te dá um prompt de correção com IA para cada achado.

Escanear meu app grátis