Le build qui a emporté sa propre clé : récupérer le GITHUB_TOKEN dans un artefact Actions

Sécurité Cloud Niveau 3/4 ~5 min 9 novembre 2026

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

Sécurité CI/CDRecherche de fichiers sous LinuxChasse aux identifiants

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, .github et .npmrc sont des fichiers cachés : utilise ls -a, find ou grep -r.
  • Répondre avec le token ghp_. La ligne commentée de .npmrc est un ancien token d'accès personnel (ghp_). Le job a tourné avec un token ghs_.
  • Répondre avec la valeur base64. C'est la paire user:password encodée : décode-la et garde uniquement ce qui suit x-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/config lit la même chose que git config --list.

Comment s'en protéger

  • Mets persist-credentials: false sur actions/checkout, et passe un token explicitement à la seule étape qui pousse.
  • Ne publie que le résultat du build (path: dist), jamais ., et laisse include-hidden-files à sa valeur par défaut false.
  • Déclare le minimum de permissions: pour le job (contents: read sauf 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.

Solution complète

Les membres Pro et Max débloquent la solution complète étape par étape.

Passer Pro

Statistiques de la communauté

171 résolutions
89% taux de réussite
M2F14M3 Premier sang

Hacks du jour associés

38 000+ Hackers Vrais labs Gratuit
Commencer Gratuitement ou résolvez le hack du jour, sans compte