DevSecOps

Supply chain : auditer les GitHub Actions utilisées par votre CI

Chaque action GitHub utilisée dans votre CI est du code tiers exécuté avec accès à vos secrets. La plupart ne sont jamais auditées. Voici la méthode pour cartographier et durcir.

Aroua Biri 8 min

Les GitHub Actions sont devenues l'épine dorsale CI/CD de la majorité des éditeurs SaaS B2B. Et chacune d'elles est du code tiers exécuté dans votre runner, souvent avec accès à vos secrets, à votre registry, à votre infrastructure cloud. La compromise d'une action peut donner à l'attaquant un accès complet à votre supply chain — comme l'a démontré l'incident tj-actions/changed-files de 2023. Voici comment auditer et durcir.

Pourquoi c'est sous-estimé

Une pipeline CI typique 2026 :

```yaml

  • uses: actions/checkout@v4
  • uses: actions/setup-node@v4
  • uses: pnpm/action-setup@v3
  • uses: actions/cache@v4
  • uses: docker/login-action@v3
  • uses: docker/build-push-action@v5
  • uses: aws-actions/configure-aws-credentials@v4
  • uses: hashicorp/setup-terraform@v3
  • uses: tj-actions/changed-files@v40
  • uses: codecov/codecov-action@v4
  • ```

Dix actions. Chacune contient potentiellement des dizaines de milliers de lignes de JavaScript/Python. Personne dans votre équipe ne les a lues. Et chacune a accès aux variables d'environnement du job.

Si l'une est compromise — par un mainteneur malveillant, un compte mainteneur volé, un fork malveillant qui devient officiel —, l'attaquant peut :

  • Exfiltrer vos GITHUB_TOKEN, AWS credentials, registry tokens.
  • Modifier les artefacts publiés sans laisser de trace.
  • Empoisonner les builds suivants.

C'est arrivé : tj-actions/changed-files compromise en mars 2023, exposant des secrets de plus de 23 000 organisations.

L'audit en 3 phases

Phase 1 — Inventaire

Lister toutes les actions utilisées dans votre organisation.

```bash # Au niveau d'un repo grep -rh "uses:" .github/workflows/ | grep -v '^\s*#' | sort -u

# Au niveau d'une org GitHub avec gh CLI gh repo list myorg --limit 1000 --json nameWithOwner | \ jq -r '.[].nameWithOwner' | \ while read repo; do gh api "repos/$repo/contents/.github/workflows" 2>/dev/null | \ jq -r '.[].download_url' | \ while read url; do curl -s "$url" | grep "uses:" | head -20 done done | sort -u ```

Output type : 30-150 actions différentes pour une organisation de taille moyenne.

Phase 2 — Classification par criticité

Pour chaque action, déterminer :

  • Officielle : maintenue par GitHub (actions/*) ou un éditeur reconnu (Microsoft, Google, AWS, HashiCorp, Docker).
  • Tierce reconnue : éditeur de référence (Snyk, Codecov, Datadog, Sentry).
  • Communauté : maintenue par un individu ou petite équipe.
  • Inconnue : pas de mainteneur clairement identifié.

Risque croissant du haut vers le bas. Les actions communauté et inconnues sont la priorité.

Phase 3 — Durcissement

#### A. Pinning par SHA, pas par tag

Au lieu de :

```yaml

  • uses: actions/checkout@v4
  • ```

Utiliser le SHA du commit exact :

```yaml

  • uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
  • ```

Pourquoi : un tag (v4) est mutable. Un mainteneur compromis peut rétroactivement le déplacer vers un commit malveillant. Un SHA est immuable.

Dependabot peut vous aider à maintenir les SHA à jour automatiquement.

#### B. Allowlist au niveau organisation

Settings → Actions → General → "Allow specified actions and reusable workflows".

Activez :

  • "Allow actions created by GitHub" → uniquement les actions/* officielles.
  • Allowlist explicite des autres actions autorisées.

Effet : un dev qui ajoute une action non-allowlistée verra son CI bloquée. Force le passage par une review.

#### C. Limiter les secrets accessibles

Au niveau d'un job, ne fournir que les secrets nécessaires :

``yaml jobs: publish: permissions: contents: read packages: write env: NPM_TOKEN: ${{ secrets.NPM_TOKEN }} steps: - uses: actions/checkout@SHA - uses: third-party-action@SHA # n'a accès qu'à NPM_TOKEN, pas aux autres ``

Et utiliser permissions: strict au niveau workflow (par défaut, GitHub donne maintenant contents: read mais à confirmer dans vos repos legacy).

#### D. OIDC plutôt que long-lived secrets

Pour les credentials AWS, GCP, Azure, Vault — utilisez OIDC (id-token: write) au lieu de stocker des credentials persistants. La compromise d'une action n'expose pas un secret long-vie utilisable hors-CI.

```yaml permissions: id-token: write contents: read

steps: - uses: aws-actions/configure-aws-credentials@SHA with: role-to-assume: arn:aws:iam::123456789:role/GitHubActions aws-region: eu-west-1 ```

#### E. Self-hosted runners pour les workflows critiques

Pour les déploiements production, considérer des self-hosted runners éphémères (nouvelle VM par job) plutôt que les runners GitHub partagés. Avantage : isolation réseau possible (VPC private).

#### F. Auditer le code des actions tierces

Pour les actions critiques (publication d'artefacts, déploiement prod), faire une revue manuelle du code. Les actions GitHub sont des dépôts publics, leur code est lisible.

Indices d'alerte :

  • Téléchargement de binaires depuis URL non-officielle.
  • Eval de strings provenant de variables d'environnement.
  • Network calls vers des endpoints non documentés.
  • Mainteneur récent qui a fait beaucoup de changements en peu de temps.

Phase 4 — Détection runtime

Outils 2026 pour monitorer les actions en cours :

  • StepSecurity Harden Runner : détecte en runtime les comportements anormaux (network calls inattendus, lecture de secrets, etc.).
  • Datadog GitHub Actions monitoring : visibilité.
  • Custom audit logs : si vous avez GitHub Enterprise, exploitez l'audit log API.

Le cas particulier des reusable workflows

Les reusable workflows (uses: ./.github/workflows/... ou cross-org) sont aussi du code tiers ou interne. Mêmes principes : pinning par SHA, permissions strictes, allowlist.

Politique d'organisation

Au-delà de l'audit ponctuel, mettre en place :

  • Review obligatoire sur tout changement d'action utilisée (CODEOWNERS sur .github/workflows/).
  • CI dédiée à la CI : un workflow qui scanne les autres workflows pour détecter les régressions de sécurité (actions non-pinnées, permissions manquantes).
  • Formation des devs : ils choisissent les actions, ils doivent comprendre le risque.

Articulation avec SBOM et CRA

Les actions utilisées dans votre CI font partie de votre supply chain. Pour la conformité CRA en 2027, votre SBOM devra inclure votre stack CI.

C'est de moins en moins théorique : les auditeurs commencent à demander la liste des actions utilisées et leur posture de durcissement.

Un sujet connexe chez vous ?

20 minutes pour cadrer ensemble. Aucune offre commerciale envoyée à froid.

Réserver un échange Calendly