O build que levou a própria chave: recuperando o GITHUB_TOKEN de um artefato do Actions

Segurança em Nuvem Nível 3/4 ~5 min 9 de novembro de 2026

O desafio

A CI da Kelpforge compartilhou o checkout. Ache a auth que o git guardou e decodifique. Traga o token com que o job de build rodou.

O que você vai aprender

  • Explicar onde o actions/checkout guarda o token do job e por quê
  • Encontrar arquivos e pastas ocultos dentro de um artefato de CI
  • Decodificar uma credencial HTTP basic em base64
  • Distinguir um token do GitHub Actions (ghs_) de um token pessoal (ghp_)
  • Reforçar um workflow: persist-credentials, caminhos de artefato, permissions

Habilidades testadas

Segurança de CI/CDBusca de arquivos no LinuxCaça a credenciais

Pré-requisitos

  • Comandos básicos de shell (ls, cat, grep)
  • O que é um pipeline de CI

Como funciona

Todo job do GitHub Actions recebe um GITHUB_TOKEN de curta duração (prefixo ghs_), restrito ao seu repositório com as permissões que o workflow concede. O actions/checkout o grava no .git/config do checkout por padrão (persist-credentials: true), como um http.https://github.com/.extraheader com AUTHORIZATION: basic e o base64 de x-access-token:<token>, para que as etapas seguintes de git push funcionem sem configuração.

Base64 é uma codificação, não criptografia: quem lê o arquivo fica com o token. Em 2024 a Unit 42 encontrou repositórios públicos cujos workflows enviavam o diretório de trabalho inteiro como artefato (eles chamaram isso de ArtiPACKED). Artefatos de repositórios públicos podem ser baixados por qualquer usuário logado e, desde o actions/upload-artifact@v4, ficam disponíveis enquanto o job ainda está rodando, ou seja, com o token ainda válido.

Erros comuns

  • Usar o ls simples. .git, .github e .npmrc são dotfiles: use ls -a, find ou grep -r.
  • Responder com o token ghp_. A linha comentada no .npmrc é um personal access token antigo (ghp_). O job rodou com um token ghs_.
  • Responder com o valor em base64. Ele é o par user:password codificado: decodifique e fique só com a parte depois de x-access-token:.
  • Tomar ${{ secrets.GITHUB_TOKEN }} ao pé da letra. O workflow só cita o nome do secret: o valor está no config do checkout.
  • Esperar pelo git. Esta máquina não tem git instalado: cat .git/config lê o mesmo que git config --list mostraria.

Como se proteger

  • Defina persist-credentials: false no actions/checkout e passe um token explicitamente apenas para a etapa que faz push.
  • Envie só o resultado do build (path: dist), nunca ., e deixe include-hidden-files no padrão false.
  • Declare o mínimo de permissions: para o job (contents: read, a menos que ele precise fazer push).
  • Escaneie os workflows atrás desses padrões (o zizmor sinaliza o ArtiPACKED) e rotacione qualquer secret de longa duração que tenha ido parar em um artefato.

Solução completa

Membros Pro e Max desbloqueiam o passo a passo completo.

Assinar Pro

Estatísticas da comunidade

171 resoluções
89% taxa de sucesso
M2F14M3 Primeiro sangue

Hacks de hoje relacionados

38.000+ Hackers Labs reais Grátis
Comece Grátis ou resolva o hack de hoje, sem conta