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.
- Un contributeur externe ouvre une proposition de modification.
- Elle touche un fichier que la chaîne exécute : configuration de tâche, fichier de construction, manifeste de dépendances.
- La chaîne se déclenche automatiquement sur la proposition.
- 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.