O build que levou a própria chave: recuperando o GITHUB_TOKEN de um artefato do Actions
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
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
lssimples..git,.githube.npmrcsão dotfiles: usels -a,findougrep -r. - Responder com o token ghp_. A linha comentada no
.npmrcé um personal access token antigo (ghp_). O job rodou com um tokenghs_. - Responder com o valor em base64. Ele é o par
user:passwordcodificado: decodifique e fique só com a parte depois dex-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/configlê o mesmo quegit config --listmostraria.
Como se proteger
- Defina
persist-credentials: falsenoactions/checkoute passe um token explicitamente apenas para a etapa que faz push. - Envie só o resultado do build (
path: dist), nunca., e deixeinclude-hidden-filesno padrãofalse. - 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.