Sécuriser la chaîne de construction

Intégration dans la CI/CD explique comment produire un SBOM dans la chaîne de construction. Cette page traite du problème inverse : la chaîne elle-même.

Pourquoi c’est un sujet de conformité

La chaîne de construction produit l’artefact, génère le SBOM, appose la signature et émet l’attestation de provenance. Si elle est compromise, tout l’aval perd sa valeur : le SBOM décrit ce que l’attaquant veut bien montrer, et la signature authentifie un binaire vérolé. SolarWinds et Codecov sont exactement cela.

Le règlement ne consacre pas d’article à la chaîne de construction, mais trois de ses exigences y conduisent : la limitation des surfaces d’attaque et la protection de l’intégrité (annexe I, partie I), la diffusion sécurisée des mises à jour (annexe I, partie II, point 7), et la diligence sur les composants tiers (art. 13, paragraphe 5) — laquelle porte aussi sur les composants que la chaîne consomme, actions et images comprises.

Les six façons d’exécuter du code dans un pipeline

Le point contre-intuitif : la plupart n’exploitent aucune vulnérabilité. Ce sont des fonctionnalités documentées, utilisées comme prévu.

Mécanisme Comment ça marche Exemple typique
Exécution directe L’outil a pour rôle d’exécuter des commandes décrites dans un fichier du dépôt Un fichier de construction lance un script shell
Configuration exécutable Le fichier de configuration n’est pas lu, il est évalué Une configuration d’outil écrite en JavaScript ou en Python
Scripts de cycle de vie Le gestionnaire de paquets déclenche des scripts à l’installation Les crochets d’installation d’un paquet
Redirection de registre Un fichier du dépôt réoriente la résolution vers un dépôt contrôlé par l’attaquant Un fichier de configuration de registre commité
Empoisonnement d’environnement Une variable modifie silencieusement le comportement d’un outil Une variable interprétée par l’interpréteur de commandes ou par un utilitaire d’archive
Fichier d’entrée piégé Une archive ou un fichier malformé exploite l’analyseur qui le traite Une archive à chemins absolus, un fichier de projet forgé

La conséquence pratique : interdire les scripts d’installation ne suffit pas. Un dépôt qui peut modifier n’importe quel fichier de configuration peut, dans la plupart des écosystèmes, obtenir l’exécution de code.

L’attaque par proposition de modification

C’est le scénario dominant, et il ne demande aucun accès au dépôt.

  1. Un contributeur externe ouvre une proposition de modification.
  2. Elle touche un fichier que la chaîne exécute : configuration de tâche, fichier de construction, manifeste de dépendances.
  3. La chaîne se déclenche automatiquement sur la proposition.
  4. Si elle s’exécute avec les secrets du dépôt, ceux-ci sont exfiltrés — souvent discrètement, par une requête sortante ou en les écrivant dans les journaux.

L’erreur de conception qui rend l’attaque possible est unique : exécuter du code non validé dans un contexte qui détient des secrets.

Les contre-mesures, par ordre d’efficacité

1. Séparer les contextes d’exécution

La mesure structurante, et la seule qui traite la cause.

Contexte Déclencheur Secrets Ce qu’il fait
Non fiable Proposition de modification externe Aucun Compilation, tests, analyse statique
Fiable Après fusion, ou sur validation explicite Oui Publication, signature, déploiement

Tout ce qui a besoin d’un secret appartient au second. Aucun code non fusionné ne s’y exécute.

2. Épingler par empreinte, jamais par étiquette

Une étiquette est mutable : elle peut être repointée vers un autre commit sans que rien ne change de votre côté. C’est ce qui s’est produit sur une action de CI très répandue en mars 2025. Les actions, images de base et scripts distants se référencent par empreinte.

Voir Verrouiller et mettre à jour les dépendances.

3. Protéger les fichiers qui s’exécutent

Les fichiers de définition de chaîne, les manifestes de dépendances et les configurations évaluées méritent un régime de revue distinct : propriétaires désignés, approbation obligatoire, et alerte sur modification.

4. Moindre privilège sur les jetons

Par défaut, un jeton de chaîne ne devrait avoir que la lecture. Les droits d’écriture, de publication et d’émission d’identité sont accordés tâche par tâche, et seulement là où ils servent. Un jeton éphémère vaut mieux qu’un secret de longue durée.

5. Désactiver ce qui n’est pas nécessaire

Installation sans exécution des scripts de cycle de vie, chemins de configuration imposés en ligne de commande plutôt que lus depuis le dépôt, registres forcés par argument.

6. Isoler les exécuteurs

Exécuteurs éphémères, détruits après chaque tâche, sans accès réseau sortant non maîtrisé. Le filtrage sortant transforme une exfiltration silencieuse en échec visible.

7. Analyser la chaîne comme du code

Trois familles d’outils ouverts examinent les définitions de chaîne et détectent ces défauts :

Outil Ce qu’il regarde
actionlint Syntaxe des définitions de tâches et sûreté des scripts intégrés
zizmor Défauts de sécurité propres aux chaînes hébergées
poutine Analyse de chaîne d’approvisionnement des chaînes de construction

Ils s’exécutent dans la chaîne, sur la chaîne, et leur échec doit être bloquant au même titre qu’un test.

Ce que ça produit comme preuve

Artefact À quoi il sert
Configuration de chaîne versionnée Montre l’état exact à une date, pour une version livrée
Rapports d’analyse de chaîne, datés Preuve du contrôle régulier exigé par l’annexe I, partie II, point 3
Attestation de provenance signée par le service de construction Relie l’artefact à la révision et aux paramètres réels
Journal des dérogations, avec expiration Montre que les blocages sont maîtrisés, pas contournés
Politique de jetons documentée Preuve du moindre privilège

Le rapport avec le niveau de provenance visé

Séparer les contextes, isoler les exécuteurs et empêcher les étapes définies par l’utilisateur d’atteindre le matériel de signature sont exactement les conditions des niveaux supérieurs du cadre SLSA — voir Signature et intégrité. Sécuriser la chaîne n’est donc pas un chantier séparé : c’est ce qui rend l’attestation crédible.