Le build qui a emporté sa propre clé : récupérer le GITHUB_TOKEN dans un artefact Actions
Le défi
La CI de Kelpforge a partagé tout son dépôt. Trouve l'auth que git a gardée, décode-la. Rapporte le token avec lequel le job a tourné.
Ce que tu vas apprendre
- Expliquer où actions/checkout stocke le token du job et pourquoi
- Trouver les fichiers et dossiers cachés dans un artefact CI
- Décoder un identifiant HTTP basic depuis le base64
- Distinguer un token GitHub Actions (ghs_) d'un token personnel (ghp_)
- Durcir un workflow : persist-credentials, chemins d'artefacts, permissions
Compétences testées
Prérequis
- Commandes shell de base (ls, cat, grep)
- Savoir ce qu'est un pipeline CI
Comment ça marche
Chaque job GitHub Actions reçoit un GITHUB_TOKEN de courte durée (préfixe ghs_), limité à son dépôt avec les permissions accordées par le workflow. actions/checkout l'écrit par défaut dans le .git/config du checkout (persist-credentials: true), sous la forme d'un http.https://github.com/.extraheader contenant AUTHORIZATION: basic et le base64 de x-access-token:<token>, pour que les étapes git push suivantes fonctionnent sans rien faire.
Le base64 est un encodage, pas du chiffrement : quiconque lit le fichier obtient le token. En 2024, Unit 42 a trouvé des dépôts publics dont les workflows publiaient tout le répertoire de travail comme artefact (ils ont appelé ça ArtiPACKED). Les artefacts des dépôts publics peuvent être téléchargés par n'importe quel utilisateur connecté, et depuis actions/upload-artifact@v4 ils sont disponibles pendant que le job tourne encore, donc pendant que le token est toujours valide.
Erreurs fréquentes
- Utiliser un simple
ls..git,.githubet.npmrcsont des fichiers cachés : utilisels -a,findougrep -r. - Répondre avec le token ghp_. La ligne commentée de
.npmrcest un ancien token d'accès personnel (ghp_). Le job a tourné avec un tokenghs_. - Répondre avec la valeur base64. C'est la paire
user:passwordencodée : décode-la et garde uniquement ce qui suitx-access-token:. - Prendre
${{ secrets.GITHUB_TOKEN }}au pied de la lettre. Le workflow ne fait que nommer le secret : sa valeur est dans la config du checkout. - Attendre git. Cette machine n'a pas git d'installé :
cat .git/configlit la même chose quegit config --list.
Comment s'en protéger
- Mets
persist-credentials: falsesuractions/checkout, et passe un token explicitement à la seule étape qui pousse. - Ne publie que le résultat du build (
path: dist), jamais., et laisseinclude-hidden-filesà sa valeur par défautfalse. - Déclare le minimum de
permissions:pour le job (contents: readsauf s'il doit pousser). - Analyse les workflows à la recherche de ces motifs (zizmor signale ArtiPACKED) et fais tourner tout secret longue durée qui a fini dans un artefact.