NT-2026.09.26 DOSSIÊ

TRUFFLEHOG: ENCONTRANDO SEGREDOS VAZADOS EM REPOSITÓRIOS GIT

Como o TruffleHog percorre todo o histórico de commits de um repositório Git em busca de credenciais vazadas — de um dump de diretório .git exposto com git-dumper à verificação ao vivo de chaves AWS, issues e pull requests no GitHub.

Capa técnica do artigo TruffleHog: varredura de repositórios Git em busca de segredos vazados, com fluxo Coleta, Varredura e Verificação

O que é o TruffleHog

Cometer um arquivo .env no GitHub é um erro clássico de desenvolvimento — em um processo seletivo técnico, esse deslize sozinho já é motivo de reprovação. Se já aconteceu com você, aconteceu com muita gente. É por isso que ferramentas de varredura de segredos existem: o dado que ninguém quer publicar acaba publicado, e permanece acessível mesmo depois de removido.

O TruffleHog é a ferramenta de referência para esse problema. Ela examina repositórios Git e todo o seu histórico de commits procurando segredos que foram adicionados por acidente — chaves de API, tokens, senhas e outros dados sensíveis. A detecção combina duas frentes: verificação por alta entropia, que aponta strings com a aparência estatística de um segredo, e expressões regulares de alto sinal, que casam padrões conhecidos de credenciais.

O ponto central é o histórico: um desenvolvedor pode remover a chave do commit mais recente, mas ela continua viva no passado do Git, recuperável a qualquer momento. Com uma credencial válida em mãos, o acesso a serviços ocorre com pouco ruído — sem exploits, sem autenticação forçada, sem alerta imediato.

A ferramenta pode ser apontada para um único repositório, para um caminho local ou, usando as APIs do GitHub e GitLab, para muitos projetos de uma vez. Nas versões atuais, ela também classifica o que encontra e faz verificação ao vivo: confirma se a credencial realmente funciona contra o serviço ao qual pertence.

Há um detalhe de instalação que gera confusão frequente e precisa ser esclarecido de saída: o pacote Python trufflehog do PyPI não é a ferramenta atual da Truffle Security. É a versão 2.2.1 do projeto original, publicada pela última vez em 2021 e mantida em forma legada. A ferramenta atual, com subcomandos git, github e filesystem e verificação ao vivo de credenciais, instala-se pelo script oficial de releases do GitHub. Os dois formatos de linha de comando são diferentes — e este artigo mostra os dois.

Instalação

A demonstração de referência trabalha sobre duas ferramentas: o git-dumper, para reconstruir localmente um repositório a partir de um diretório .git exposto na web, e o próprio TruffleHog. No Kali Linux, o git-dumper instala-se pelo pip3:

pip3 install git-dumper

O TruffleHog da versão 2 também existe como pacote pip, e é essa forma que a demonstração usa para a varredura inicial do dump:

pip3 install trufflehog

Atenção aqui, porque a distinção importa: o pacote Python e o release do GitHub não são a mesma ferramenta. O pacote trufflehog do PyPI corresponde à versão 2.2.1 legada do projeto — entropia e regex sobre diffs, sem verificação ao vivo. O release atual, mantido pela Truffle Security, traz os subcomandos e a verificação de credenciais. Confira qual dos dois está no seu PATH antes de interpretar um resultado.

O fluxo desta demonstração é: usar o git-dumper quando houver um diretório .git exposto e então rodar o TruffleHog contra esse dump. Diretórios .git acessíveis por HTTP continuam sendo uma ocorrência comum em servidores mal configurados.

Dump de um repositório exposto

Alguns servidores deixam o diretório .git inteiro aberto. Quando isso acontece, o navegador exibe o próprio índice de arquivos do repositório, como na captura da demonstração de referência abaixo — tudo visível: HEAD, config, branches/, os objetos.

Navegador exibindo o índice de um diretório .git exposto com listagem de arquivos do repositório Git
Diretório .git de um site exposto com listagem habilitada: HEAD, config, branches/ e objetos do repositório visíveis no navegador

Reconstruindo com git-dumper

Com o índice acessível, basta entregar ao git-dumper a URL do diretório e a pasta local de destino:

git-dumper http://<DOMINIO>/.git dump

O git-dumper percorre o índice e baixa os arquivos do repositório para a pasta indicada, exibindo o progresso de cada requisição.

Terminal mostrando o git-dumper testando e baixando arquivos de um diretório .git exposto com respostas 200
git-dumper baixando o .git com listagem habilitada: requisições de HEAD, config e objetos com status 200

Dump sem listagem de diretório

Outros sites bloqueiam a listagem de diretórios, mas continuam servindo os arquivos individuais. A captura a seguir, da mesma demonstração, mostra o conteúdo de um arquivo config de um .git acessível dessa forma: a seção [remote "origin"] expõe a URL interna do repositório e a seção [user] revela o e-mail de quem commita.

Conteúdo do arquivo config de um repositório Git exposto exibindo remote origin e user email
Arquivo config de um .git servido sem listagem: seção remote origin com a URL interna do repositório e e-mail do autor dos commits

Coletando objetos por nome conhecido

Mesmo sem índice, o git-dumper consegue puxar todos os objetos, commits e referências que consegue alcançar:

git-dumper http://<DOMINIO>/.git/ dump

Dessa vez a saída mostra requisições de arquivos específicos — hooks, objetos, HEAD — com status 200 e 404, até completar o dump. Tudo o que o git-dumper alcançar fica armazenado na pasta de dump: é esse repositório reconstruído que o TruffleHog vai examinar.

Terminal com o git-dumper baixando hooks e objetos de um diretório .git cuja listagem retorna 403
git-dumper varrendo um .git sem listagem: testando HEAD, baixando hooks com status 200 e indexando objetos por nome conhecido

Analisando o repositório com TruffleHog

Com o dump em disco, roda-se o TruffleHog contra a pasta. Por padrão, a ferramenta executa a detecção baseada em entropia sobre os diffs de commits. Ela ajuda, mas não deve ser o único modo que você conhece — na demonstração de referência, a combinação de regex com entropia desligada devolveu mais resultados:

trufflehog --regex --entropy NO dump

A saída aponta o motivo de cada achado (Reason), a data do commit, o hash e o caminho do arquivo dentro do repositório.

Terminal mostrando o comando trufflehog --regex --entropy NO e o resultado Reason Password in URL com hash e filepath
Varredura com –regex –entropy NO sobre o dump: achado Password in URL com hash e caminho do arquivo no repositório

Credenciais de banco no dump

Entre os arquivos examinados, a demonstração encontrou credenciais de banco de dados — senha embutida em URL de conexão mysql, com caminho de arquivo, branch e commit registrados junto ao achado.

Resultado do TruffleHog exibindo Reason Password in URL com string de conexão mysql, filepath settings.php e branch master
Credenciais de banco de dados localizadas no dump: senha mysql embutida em URL de conexão, com arquivo e branch do commit

Release atual e modo filesystem

A partir daqui, a demonstração troca para o release atual da ferramenta — instalado pelo script oficial de releases do GitHub, direto em /usr/local/bin:

curl -sSfL https://raw.githubusercontent.com/trufflesecurity/trufflehog/main/scripts/install.sh | sh -s -- -b /usr/local/bin

Com o binário atual em disco, a varredura do dump passa a usar o modo filesystem, apontando diretamente para a pasta:

trufflehog filesystem /home/<USUARIO>/Documents/dump

Esse modo é adequado para ajustar varreduras, mas costuma gerar mais ruído e falsos positivos — na captura, os achados aparecem como unverified, com motivo verification issue: lookup e o caminho do objeto dentro de .git/objects. Vale conhecer o comportamento e calibrar a leitura dos resultados.

Varredura trufflehog filesystem com resultados unverified, verification issue lookup e arquivos dentro de .git/objects
Modo filesystem do release atual sobre o dump: achados unverified com verification issue lookup e caminho em .git/objects

Outras formas de analisar repositórios

Dependendo de qual versão está instalada, há flags que mudam o que a varredura devolve. Os exemplos a seguir, do release atual, usam o repositório público de chaves de teste mantido pela própria Truffle Security.

Para varrer um repositório remoto exibindo resultados verificados e não verificados:

trufflehog git https://github.com/trufflesecurity/test_keys --results=verified,unknown

O resultado verified significa que o TruffleHog confirmou a credencial ao vivo contra a API do serviço emissor — AWS, GitHub e outros. Unknown cobre tanto os achados de alta entropia quanto os de regex que não puderam ser confirmados.

Terminal com trufflehog git test_keys --results=verified,unknown exibindo Found verified result Detector Type AWS
Varredura de resultados verificados e unknown: AWS access key confirmada ao vivo pelo TruffleHog no repositório de testes oficial

Saída em JSON

O mesmo scan com saída em JSON, que registra fonte, detector, decodificador e o campo Verified de cada achado:

trufflehog git https://github.com/trufflesecurity/test_keys --results=verified,unknown --json
Saída JSON do TruffleHog com objetos de resultado contendo DetectorName AWS e campo Verified true
Saída em JSON da varredura: DetectorName AWS com campo Verified true e credencial mascarada em Raw e Redacted

Varredura de organização

No GitHub, a varredura de repositórios de uma organização inteira é feita com a flag --org=, conforme a documentação oficial da ferramenta.

Issues e pull requests

Issues e pull requests também são terreno de vazamento. A varredura que inclui comentários de issues e de PRs:

trufflehog github --repo=https://github.com/trufflesecurity/test_keys --issue-comments --pr-comments
Terminal com trufflehog github --repo com --issue-comments --pr-comments exibindo Found verified result Detector Type AWS
Varredura com –issue-comments –pr-comments: credencial AWS verificada em resultados de issues e pull requests

O que aparece nas discussões

Essa varredura revira issues, comentários, corpo das PRs e comentários de revisão — discussões técnicas frequentemente carregam credenciais que nunca chegaram ao código. Entre os resultados, a demonstração destaca uma chave privada OpenSSH publicada em discussão, com commit, e-mail e arquivo de origem registrados no achado.

Chave privada OpenSSH exibida como resultado da varredura de issues e pull requests, com commit email e file leaky
Resultado da varredura de issues e PRs: chave privada OpenSSH publicada em discussão, com commit, e-mail e arquivo de origem

Repositório local com file://

E para um repositório Git local, aponte a varredura para o caminho com o esquema file://:

trufflehog git file://test_keys --results=verified,unknown

O cenário típico é o de uma máquina de desenvolvimento comprometida com múltiplos projetos em disco. Como a demonstração mostrou, a chance de encontrar algo local é pelo menos tão alta quanto no GitHub — os dois caminhos existem, e é preciso varrer os dois.

Perspectiva defensiva

Do lado de quem defende, o TruffleHog é a mesma ferramenta operando com o objetivo invertido: revelar o que está exposto antes que um adversário encontre. Executar trufflehog git file:// no repositório local antes de cada push funciona como teste de vazamento caseiro; em escala, a ferramenta entra em pipelines de CI como gate de merge — a própria documentação oficial sugere o uso com --fail, que devolve código de erro 183 quando encontra credencial válida, bloqueando a entrega.

O lado operacional do vazamento é o que costuma escapar: a remoção do segredo do branch atual não o remove do histórico. Corrigir exige rotação da credencial — revogar e reemitir a chave vazada — porque o commit antigo continua recuperável por qualquer pessoa com acesso ao repositório, e em repositórios públicos por qualquer pessoa na internet.

Na perspectiva de detecção de exposição externa, há três superfícies para monitorar: o diretório .git de servidores web (que não deve existir na raiz de publicação — a listagem exibida na demonstração é o sintoma), os repositórios públicos dos desenvolvedores (um pentest externo da demonstração achou acesso a banco justamente em projetos pessoais públicos de funcionários) e as discussões do GitHub (issues, PRs e comentários, que as varreduras com --issue-comments --pr-comments cobrem). Para vazamentos já consumados, o histórico de uso da credencial fica registrável nos logs do serviço emissor.

Limitações

Este artigo é documental: descreve a ferramenta, seus comandos e os resultados conforme a documentação oficial e o material de referência, sem execução própria nesta ocasião. Os resultados citados são os da demonstração de referência, não testes independentes.

Quanto à ferramenta: a versão legada instalada pelo PyPI e o release atual não são intercambiáveis — os comandos e a saída diferem entre as duas, e a verificação ao vivo só existe no release atual. O modo filesystem tende a mais ruído e falsos positivos, e os resultados precisam de triagem. Achados unknown não são credenciais confirmadas: são candidatas cuja verificação falhou por erro de rede ou API, e exigem validação manual antes de qualquer conclusão.

Considerações éticas

A varredura de segredos opera sobre repositórios públicos ou ambientes autorizados — pentest contratado, CTF, auditoria do próprio acervo. Um diretório .git exposto e um repositório público são, tecnicamente, informação acessível; usar a credencial encontrada contra o serviço de terceiros é outra coisa, e é aí que está a fronteira: autenticar-se com chave alheia é acesso não autorizado.

O padrão de uso correto segue o mesmo fluxo da demonstração: relatar o achado, rotacionar a credencial se ela for sua, notificar o responsável se não for. Bug bounty e divulgação responsável são o caminho profissional para vazamentos descobertos em código de terceiros.

Conclusão

O caso que fecha a demonstração de referência resume o valor da ferramenta: em um pentest externo com vários serviços acessíveis e nenhuma credencial à vista, os projetos pessoais de alguns desenvolvedores — mantidos públicos no GitHub — acabaram entregando um par de credenciais válido e, com ele, o acesso a um banco de dados.

Arquivos sensíveis às vezes são expostos sem que quem publicou perceba. Somos humanos e erramos — ofensiva ou defensivamente, o ponto é o mesmo: o TruffleHog existe para tornar esse erro visível, do lado de quem o cometeu e de quem vai explorá-lo.