Você pode ter segredos vazados no GitHub: git push --force não é o suficiente
O Sharon Brizinov, pesquisador de segurança, escaneou todos os eventos de push forçados do tipo "zero-commit" desde 2020, e conseguiu US$ 25 mil em bug bounties com os segredos encontrados, além de outros US$ 64 mil com chaves encontradas por meio de uma automação que clonou e examinou dezenas de milhares de repositórios públicos do GitHub.
No artigo que escreveu para o blog da Truffle Security, Sharon detalhou como explorou o histórico de commits para encontrar esses segredos.
Se estiver curioso para verificar seus próprios repositórios, o Sharon e a Truffle Security criaram a ferramenta Force Push Scanner, de código aberto. Quando a ferramenta encontra alguma chave, aparece uma mensagem como:
✅ Found verified result 🐷🔑
Detector Type: URI
Decoder Type: PLAIN
Raw result: https://admin:[email protected]
Repository: https://github.com/trufflesecurity/test_keys.git
Commit: 7c2a103a324dff607c89cf59e42a4a3c2fddb87a
Email: counter <counter@counters-MacBook-Air.local>
File: keys
Link: https://github.com/trufflesecurity/test_keys/commit/7c2a103a324dff607c89cf59e42a4a3c2fddb87a
Timestamp: 2022-06-16 17:19:57 +0000
Ao investigar o commit no GitHub, verá a mensagem de commit órfão:
Como essa exploração funciona?
Conforme explicado no artigo, é possível buscar vários tipos de eventos pela API de eventos do GitHub, http://api.github.com/events
, que não precisa de um token de API e nem autenticação. O projeto de código aberto GitHub Archive, monitora e arquiva esse fluxo de eventos do GitHub desde 2015, como mencionado no site.
Os eventos buscados pelo Sharon são do tipo PushEvent
, com a lista de commits vazia ("zero-commit"), como no exemplo abaixo:
{
"actor": {
"avatar_url": "https://avatars.githubusercontent.com/u/749820?",
"gravatar_id": "",
"id": 749820,
"login": "grapefruit623",
"url": "https://api.github.com/users/grapefruit623"
},
"created_at": "2015-01-01T15:55:30Z",
"id": "2489676773",
"payload": {
"before": "e9c3d31212847723aec86ef96aba0a77f9387493",
"commits": [],
"distinct_size": 0,
"head": "b343acf4ade6dfc659f71a981eb51b62d22e33a0",
"push_id": 536875606,
"ref": "refs/heads/master",
"size": 0
},
"public": true,
"repo": {
"id": 26386587,
"name": "grapefruit623/gcloud-python",
"url": "https://api.github.com/repos/grapefruit623/gcloud-python"
},
"type": "PushEvent"
}
Quando um evento assim é encontrado, então é verificado o patch
do commit before
em busca de segredos que possam ter sido vazados.
No artigo, o Sharon também explica como fez a automação para realizar um filtro inicial de quais seriam as chaves mais prováveis de serem importantes, para então entrar em contato com as empresas.
Ele até utilizou o v0, ferramenta da Vercel que gera interfaces web com LLM, para criar uma plataforma visual simples que o ajudava a triar os segredos encontrados. A interface recebia um arquivo .zip com os dados e os exibia em tabelas e gráficos:
Exemplo de impacto real: acesso admin ao Istio
Para ilustrar o quão grave um vazamento desses pode ser, um dos segredos que o Sharon encontrou em um commit órfão foi um token de acesso do GitHub (PAT) que pertencia a um desenvolvedor do Istio, um dos maiores projetos de service mesh do mundo, usado por empresas como Google e IBM.
Esse token dava acesso de administrador a todos os repositórios da organização Istio. Com essa chave, ele poderia ter alterado código, lido segredos de CI/CD, publicado novas versões maliciosas do software ou até mesmo deletado o projeto inteiro.
O Sharon reportou à equipe do Istio, que revogou o acesso assim que foi notificada
Como remover um segredo do GitHub?
De acordo com comentários no Hacker News, a única forma de remover esses commits órfãos do GitHub é entrando em contato com o suporte.
E, para reforçar, rotacione a chave vazada. Considere que a partir do momento que algo foi para a Internet, não é mais possível tirar de lá, então quando expor uma chave ou outro segredo, desabilite-o e gere um novo.
Como evitar vazar segredos?
O Force Push Scanner utiliza o TruffleHog para escanear segredos, e você pode configurar o TruffleHog para executar localmente antes de um commit
, e/ou configurá-lo no CI como uma camada extra de proteção. Se for detectado no CI, ao menos você será alertado que o segredo vazou, podendo então desativá-lo e rotacioná-lo.