Campanha Gheist com tokens roubados do GitHub planta workflows para extrair secrets, mas esbarra em bloqueios
Aprofundamento CEVIU
Aprofundamento
A Wiz Research acompanha desde 15 de setembro de 2026 a Gheist, campanha que abusa em massa de tokens do GitHub comprometidos. Para cada repositório ao qual o token tem acesso, a ferramenta cria uma branch ci-sync- mais seis caracteres aleatórios e commita .github/workflows/sync-check.yml com a mensagem "ci: sync config", sem assinatura e em nome do dono do token. O push dispara o workflow, que imprime os secrets no próprio log. A ferramenta baixa o log pela API e apaga a execução segundos depois. A Wiz recuperou mais de 13.500 branches plantadas em mais de 850 contas, de projetos pessoais a repositórios privados de organizações enterprise.
Três detalhes fazem o ataque funcionar. O GitHub só mascara secrets nos logs quando o valor aparece literalmente, então um secret em base32 sai inteiro. O permissions: {} restringe o GITHUB_TOKEN do job, mas não o contexto secrets. E, quando há deployment environments, o workflow os lista numa matrix, expondo também secrets de ambiente, muitas vezes credenciais de produção. Como tudo sai pela API do GitHub, não existe domínio do atacante nem conexão de saída para bloquear.
Há duas variantes. A Tool B adicionou, em 19 de outubro, um separador em base32 e um segundo job, sync-host, que roda em self-hosted runners. Ele varre o host atrás de 31 formatos de token, chaves privadas, .env, state de Terraform e histórico de shell, e monta um container pelo Docker socket com o filesystem raiz do host. Também tenta credenciais de instance role da AWS e o token de service account do Kubernetes. O job tem bugs: procura o arquivo errado de chave do runner, tem regex de credencial em URL quebrada e não coleta tokens de GCP nem Azure.
Desde 28 de julho de 2026, o GitHub retém em repositórios públicos as execuções potencialmente maliciosas até um colaborador aprovar. Todas as execuções públicas da Gheist verificadas pela Wiz estão em action_required. Em repositórios privados e no GitHub Enterprise Server a retenção não vale: os audit logs mostram runs completando e sendo apagadas pelo user agent gheist, e o CloudTrail registra workflows assumindo roles da AWS nessas branches. Em ambiente enterprise, a Wiz viu a ferramenta alternar tokens de vários usuários e contas de automação em minutos, clonar repositórios privados e, horas depois, credenciais de nuvem da mesma organização enumerando o AWS Secrets Manager. Segundo a Wiz, cerca de dois terços das contas já não estão disponíveis, provável resposta após o reporte ao GitHub.
O que mudou
Em 1 de outubro de 2026, o CEVIU noticiou "Alerta Crítico: Tokens de Acesso do GitHub Expostos por Info-Stealers", sobre o roubo de PATs clássicos por info-stealers. A Wiz aponta infostealer logs como uma das fontes de credenciais da Gheist, o que liga os dois temas. Em 27 de outubro de 2026, o CEVIU já havia publicado a primeira cobertura da Gheist; a matéria de hoje se apoia no mesmo relatório da Wiz. Já a GhostAction, tratada em 12 de outubro de 2026, é outra campanha: a Wiz diz que a Gheist é distinta, com workflows diferentes.
Por que isso importa
Para quem opera pipelines, a leitura é que a proteção de repositório público não cobre o seu caso se o código é privado. Revisores obrigatórios em environments de produção, trust policies de OIDC limitadas a branches protegidas e runners efêmeros sem Docker socket reduzem o dano. Tokens de vida curta no lugar de PATs fecham a porta que a campanha usa. E rotacionar secrets é obrigatório: apagar a branch ou o run não desfaz a exposição.
Linha do tempo
CEVIU noticia o aumento do roubo de PATs do GitHub por info-stealers.
CEVIU noticia a campanha GhostAction, distinta da Gheist.
CEVIU publica a primeira cobertura da Gheist e do bloqueio por aprovação.
Wiz detalha a Gheist: mais de 850 contas, workflows sync-check e exposição em repositórios privados e enterprise.
Perguntas frequentes
Como saber se fui alvo da Gheist?
Procure branches com o padrão ci-sync- mais seis caracteres, com apenas o arquivo sync-check.yml e a mensagem "ci: sync config". Nos audit logs do GitHub, busque runs em ci-sync-* apagadas em menos de um minuto e o user agent gheist. Se usa OIDC, veja no log da nuvem assunções de role cujo subject cite uma branch ci-sync-.
Por que o mascaramento de secrets do GitHub não funcionou?
O GitHub só mascara um secret quando ele aparece literalmente no log. O workflow codifica o conteúdo em base32, então o valor não bate com o original e sai em claro. Quem tem o log decodifica depois.
Repositórios públicos estão seguros?
Segundo a Wiz, o controle do GitHub em vigor desde 28 de julho de 2026 segurou as execuções públicas, todas paradas em action_required. A retenção não vale para repositórios privados nem para o GitHub Enterprise Server, onde houve exploração bem-sucedida.
O que fazer se uma branch ci-sync rodou em self-hosted runner?
Trate o host e a instance role como comprometidos. Procure os arquivos .gdmp_pat, .gdmp_patg e .gdmp_sweep e a string gdmp-pivot nos logs. Rotacione todos os secrets acessíveis, revogue os tokens que fizeram o push e não aprove runs retidas de sync-check.
Fontes
- wiz.iofonte original
- Categoria
- CEVIU DevOps
- Publicado
- 28 de outubro de 2026
- Editoria
- CEVIU DevOps

