Marcio Cunha

Como achar e revogar secrets vazadas no GitHub com segurança

Descubra como identificar credenciais expostas no código, limpar o histórico do Git com ferramentas especializadas e automatizar varreduras para proteger seu repositório.

Marcio Cunha•7 min
Também disponível em:EnglishEspañol
Resumo
  • Credenciais esquecidas no código-fonte podem ser descobertas por robôs em questão de minutos após um commit público.
  • A simples remoção de um arquivo no commit atual não apaga dados confidenciais salvos no histórico profundo do Git.
  • Ferramentas especializadas de varredura conseguem escanear o código inteiro em busca de padrões conhecidos de chaves e senhas.
  • Revogar acessos comprometidos imediatamente reduz o tempo de exposição antes que invasores explorem os sistemas.
  • Automatizar verificações no fluxo de desenvolvimento evita que novos vazamentos ocorram em futuros deploys.

O perigo silencioso das credenciais expostas no código

Quando escrevemos software, é comum utilizarmos chaves de acesso, senhas de banco de dados e tokens de API para testes locais. O grande problema acontece quando esquecemos esses dados confidenciais, conhecidos como secrets, dentro do código-fonte e enviamos tudo para um repositório público no GitHub. Na prática, isso significa que qualquer robô malicioso vasculhando a internet pode encontrar essas chaves em questão de minutos e usá-las para invadir servidores, extrair dados ou realizar ações financeiras em seu nome. O prejuízo pode ser gigantesco, exigindo uma reação imediata da equipe de engenharia.

Mesmo que você perceba o erro rapidamente e delete o arquivo com a senha no commit seguinte, o estrago pode continuar feito. O Git, que é o sistema que usamos para controlar as versões do nosso código, guarda um histórico completo de tudo o que já foi enviado. Isso significa que a senha antiga continua gravada nas entranhas do repositório, acessível para quem souber onde procurar. Antes de pensar em qualquer limpeza complexa, o primeiro passo indispensável é garantir a integridade do restante do projeto e das outras ferramentas, tal como detalhamos em nosso artigo sobre como blindar branches no GitHub e evitar merges com erros.

O impacto de uma chave vazada não se restringe apenas à aplicação afetada. Muitas vezes, uma única chave de acesso à nuvem dá passe livre para toda a infraestrutura da empresa. É por essa razão que o gerenciamento adequado de credenciais deve caminhar junto com estratégias corporativas de segurança, alinhando-se a boas práticas de gerenciamento de segredos e credenciais em ciclos de deploy contínuo para evitar exposições futuras. Identificar o vazamento é apenas o começo; a resposta precisa ser cirúrgica e coordenada.

Como identificar chaves e senhas escondidas no código

O primeiro passo para resolver o problema é saber exatamente o que foi exposto. Fazer isso de forma manual, lendo arquivo por arquivo, é inviável em projetos médios ou grandes. Para automatizar essa caça aos tesouros perdidos, utilizamos ferramentas dedicadas à inspeção de código em busca de padrões específicos, como sequências alfanuméricas longas que parecem tokens de API da AWS, do GitHub ou de gateways de pagamento.

Uma das ferramentas mais populares e eficientes para essa tarefa é o TruffleHog ou o Gitleaks. Eles examinam tanto os arquivos atuais quanto todo o histórico de alterações do repositório, procurando por assinaturas conhecidas de credenciais. Na prática, você roda o programa apontando para a pasta do seu projeto local, e ele gera um relatório detalhado indicando exatamente em qual linha e em qual commit a chave vazada apareceu. Caso sua equipe utilize fluxos complexos de ramificação, vale a pena entender como usar o Git Rebase com segurança em equipe sem quebrar o código antes de aplicar correções profundas no histórico.

Abaixo, veja um exemplo prático de como executar uma varredura rápida usando o Gitleaks diretamente no seu terminal:

# Instale o Gitleaks via gerenciador de pacotes (exemplo no macOS)brew install gitleaks# Execute a varredura no repositório atual e salve o relatório em JSONgitleaks detect --source . --report-path report.json --verbose

Esse comando varre cada pedaço do histórico do Git e aponta onde estão os segredos. Com o relatório em mãos, a equipe sabe exatamente quais chaves foram comprometidas e precisa iniciar imediatamente o processo de revogação nos painéis dos respectivos serviços.

A estratégia correta para revogar acessos e invalidar tokens

Identificar o vazamento e varrer o código são etapas fundamentais, mas o coração da mitigação de riscos é a invalidação imediata da credencial exposta. Se um token de API da OpenAI ou da AWS caiu na rede, ele precisa ser neutralizado no painel do provedor antes que qualquer outra coisa seja feita. Na prática, revogar significa dizer ao sistema que aquela chave não tem mais validade, bloqueando qualquer tentativa futura de uso por terceiros.

Após revogar o acesso antigo, o desenvolvedor deve gerar uma nova credencial e injetá-la na aplicação utilizando variáveis de ambiente seguras ou cofres de senhas dedicados. Nunca armazene senhas diretamente no código-fonte ou em arquivos de configuração locais desprotegidos. O uso de arquivos .env que ficam de fora do controle de versão ajuda a manter o ambiente de desenvolvimento limpo, desde que esses arquivos nunca sejam enviados por engano.

Além de trocar a senha ou o token vazado, é vital verificar os logs de acesso do serviço afetado. Descubra se o invasor chegou a usar a chave durante o período em que ela esteve pública. Analise endereços IP desconhecidos, requisições fora do horário comercial ou picos anormais de consumo de recursos. Essa investigação forense garante que você compreenda o tamanho real do problema e possa tomar medidas adicionais, como notificar clientes caso dados sensíveis tenham sido acessados.

Limpando o histórico profundo do Git

Deletar o arquivo do commit atual não remove o segredo do banco de dados do Git. Para expurgar permanentemente dados confidenciais do histórico, precisamos reescrever o passado do repositório. Ferramentas como o BFG Repo-Cleaner ou o comando nativo git filter-repo são os padrões da indústria para essa cirurgia delicada. Na prática, essas ferramentas substituem a string secreta por asteriscos ou removem o arquivo de todos os commits anteriores.

É importante destacar que reescrever o histórico altera os identificadores (hashes) de todos os commits modificados. Isso significa que, se outras pessoas estiverem trabalhando no mesmo projeto, elas precisarão sincronizar seus ambientes de forma cuidadosa para não corromper o repositório remoto. Abaixo, veja um exemplo de como utilizar o utilitário git filter-repo para remover um arquivo inteiro que continha senhas:

# Certifique-se de ter o python e o git-filter-repo instalados# Remova o arquivo com credenciais de todo o histórico do repositório-git filter-repo --path config/secrets.yml --invert-paths# Force a atualização do repositório remoto para sobrescrever o histórico antigo-git push origin --force --all

Depois de executar esse comando, o arquivo problemático deixa de existir em qualquer versão anterior do projeto. Todos os colaboradores precisarão clonar o repositório novamente ou puxar as alterações de forma forçada para alinhar suas cópias locais com a nova realidade limpa.

Automatizando varreduras para evitar novos vazamentos

A melhor forma de lidar com secrets vazadas é impedir que elas cheguem a ser enviadas para o GitHub. Para alcançar esse patamar de maturidade operacional, implementamos ganchos de pré-confirmação (git hooks) e verificações automatizadas em pipelines de integração contínua (CI/CD). Na prática, isso cria uma barreira intransponível que bloqueia o comando git push caso qualquer padrão suspeito seja detectado nos arquivos modificados.

Ferramentas como o pre-commit permitem configurar verificações automáticas na máquina de cada desenvolvedor antes mesmo que o código saia do computador local. Se alguém tentar commitar um arquivo com uma chave de API acidentalmente, o terminal exibirá um erro claro e impedirá a ação. Essa abordagem educativa fortalece a cultura de segurança da equipe de forma contínua, transformando a prevenção em um hábito diário.

Integrar essas varreduras aos servidores de integração contínua adiciona uma segunda camada de defesa. Mesmo que um desenvolvedor ignore os alertas locais, o pipeline de build falhará automaticamente ao detectar qualquer credencial exposta no repositório remoto. Dessa forma, a segurança deixa de depender exclusivamente da atenção humana e passa a ser garantida por processos automatizados e resilientes.

Considerações finais

Vazar secrets no GitHub é um incidente estressante, mas perfeitamente tratável se a equipe agir com rapidez, método e organização. A combinação entre varreduras profundas no histórico do Git, revogação imediata de acessos nos provedores de nuvem e a adoção de automações de prevenção garante que o erro não se repita. Lembre-se de que a segurança da informação é uma jornada contínua de melhoria dos processos e das ferramentas que utilizamos diariamente no desenvolvimento de software.

Ao estabelecer rotinas rigorosas de revisão e investir na educação do time, transformamos vulnerabilidades em oportunidades de aprendizado e fortalecimento da infraestrutura. Mantenha seus ambientes monitorados, utilize cofres de senhas adequados e garanta que sua base de código permaneça sempre livre de surpresas indesejadas.