Executando verificação de segurança...
7

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:

This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

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:

Tabela de dados processados

Tipos de segredos detectados

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.

JSON Istio

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.

Carregando publicação patrocinada...
2

Infelizmente não apenas no Github,mas já vi comitarem chaves no Gitlab. Fui avisar e eu me arrependi pela recepção negativa, que não quis escutar o alerta.

2

Como remover um segredo do GitHub?

Nunca confie, commitou alguma chave incorretamente? Invalide-a imediatamente!

Mesmo em repositórios privados

1

Caramba!
estava estudando para o Github advanced security e isso veio como uma luva.
O pessoal achando que Git Push force ou a verificação de chave secreta nativa do github sozinhos protegem algo... kkkk. Muito bom conteúdo! valeu!