Read in English · Leer en español · Auf Deutsch lesen
Section 8.6 sur 8.8 · Intermédiaire · 23 min de lecture
Sécurité de la chaîne d’approvisionnement logicielle
Leçon vidéo
5 min · narré en anglais, avec sous-titresÉcouter seulement (audio)
Lire la transcription
L’essentiel du code d’un service moderne n’a pas été écrit par l’équipe qui l’exploite. Cette leçon montre pourquoi tout ce sur quoi vous construisez fait partie de votre surface d’attaque, et comment les architectes réduisent ce risque.
Un restaurant ne cultive pas sa propre farine. Il fait confiance à des fournisseurs. Si la farine d’un fournisseur est contaminée, tous les restaurants qui l’ont achetée sont touchés, aussi propre que soit leur cuisine. Les bons restaurants tiennent donc la liste de chaque ingrédient et de sa provenance. Ils achètent auprès de fournisseurs qui scellent et étiquettent leurs livraisons, et ils vérifient les scellés à la réception. Le logiciel se construit de la même façon, à partir de centaines de composants écrits par d’autres et assemblés par des machines de build.
Voici la chaîne : un développeur, le dépôt source, le système de build, un registre qui stocke le résultat, et le déploiement. Chaque flèche est une relation de confiance, et chaque incident célèbre en a exploité une autre. Les dépendances open source alimentent le build. En 2018, un paquet populaire appelé event-stream a été confié à un bénévole, qui y a ajouté une dépendance malveillante. En 2021, Log4Shell était une faille involontaire mais grave dans une bibliothèque de journalisation enfouie au cœur d’innombrables systèmes. En 2024, l’attaque contre xz utils est passée par le processus de source et de publication. Après environ deux ans de contributions patientes et utiles, un co-mainteneur a livré des fichiers de publication contenant une porte dérobée cachée. Elle a été détectée tôt. En 2020, des attaquants infiltrés chez SolarWinds ont altéré son système de build, si bien que les mises à jour authentiquement signées de l’entreprise contenaient une porte dérobée. Une signature prouve qui a construit quelque chose, pas que le build était sain. Et les registres sont détournés avec des noms de paquets imitant des noms connus, ce qu’on appelle le typosquatting, et avec des paquets publics nommés comme les paquets internes d’une entreprise.
Une nomenclature logicielle, ou SBOM, est une liste lisible par machine des composants de votre logiciel, avec leurs versions et des identifiants exacts. Elle ne rend pas le logiciel plus sûr à elle seule. Elle permet de répondre aux questions. Générez-la pendant le build, à partir de ce qui a réellement été résolu et empaqueté, et non de la liste écrite par un développeur. Stockez-la avec l’artefact, et transmettez-la à un service qui revérifie chaque liste stockée dès qu’une nouvelle vulnérabilité est publiée. Quand Log4Shell a été annoncée, les organisations qui disposaient d’un inventaire exact ont répondu à la question en quelques heures. Les autres y ont passé des semaines.
Voici un pipeline renforcé, du commit à la production. Il commence par un code source relu sur des branches protégées, et des dépendances verrouillées sur des versions exactes, avec une empreinte de chacune. Le build est isolé, créé pour un seul job et détruit ensuite, avec toutes ses entrées déclarées. Il produit la nomenclature logicielle. Le résultat est signé sans aucune clé à longue durée de vie. Un certificat qui dure quelques minutes nomme l’identité du build, et la signature est inscrite dans un journal public auquel on ne peut qu’ajouter. L’image est stockée par son digest. Avant que la production ne l’exécute, un contrôle d’admission vérifie la signature et sa provenance. Seul ce que le pipeline attendu a construit à partir d’un code source relu est autorisé à s’exécuter.
Commitez les lockfiles, qui enregistrent les versions exactes avec une empreinte de chacune, et installez à partir d’eux dans chaque build. Épinglez aussi les outils de build. En 2025, les tags de version d’une action de build populaire ont été déplacés vers du code malveillant, touchant des milliers de dépôts qui la référençaient par tag. Épingler sans mettre à jour crée le risque inverse : laissez donc un bot proposer souvent de petites mises à jour. Attendre quelques jours avant d’adopter une version de routine aide, car la plupart des versions malveillantes sont retirées en quelques jours. Les correctifs de sécurité passent vite. Et les scanners produisent des centaines de résultats. Priorisez selon que la faille est exploitée ou non, que votre code peut l’atteindre ou non, et que le service est exposé à internet ou non.
La réglementation pousse dans la même direction. Le règlement européen sur la cyberrésilience fixe des exigences de cybersécurité pour les produits matériels et logiciels comportant des éléments numériques mis à disposition sur le marché de l’UE. Ses exigences relèvent de l’architecture : une configuration sécurisée par défaut, une surface d’attaque limitée, des mises à jour de sécurité et une nomenclature des logiciels couvrant au moins les dépendances de premier niveau. Il s’applique par étapes. Ses obligations de signalement des vulnérabilités activement exploitées et des incidents graves s’appliquent à partir du onze septembre 2026, et la plupart des autres obligations à partir du onze décembre 2027. Il s’agit d’une information générale, et non d’un conseil juridique. Savoir si un produit donné entre dans le champ d’application est une question juridique propre à chaque organisation, à confirmer au moyen des textes officiels et auprès de conseillers qualifiés.
La section complète raconte les quatre incidents en détail, et présente les niveaux d’intégrité du build ainsi qu’une liste de contrôle pour les équipes de service. Ensuite, dans la section huit point sept, nous verrons la protection de la vie privée dès la conception. À très vite.
Ce qu’il faut savoir
- L’essentiel du code d’un service moderne provient des dépendances, des outils de build, des actions de CI et des images de base ; chacun d’eux, et toute personne qui peut le modifier, fait partie de la surface d’attaque.
- event-stream (2018) a abusé de la confiance accordée à un mainteneur, SolarWinds (2020) d’un système de build compromis, Log4Shell (2021) d’une bibliothèque vulnérable enfouie au fond des arbres de dépendances, et xz utils (2024) d’une prise de contrôle patiente d’un processus de publication.
- Une SBOM au format SPDX ou CycloneDX liste les composants avec des identifiants exacts, de sorte que l’exposition à une nouvelle vulnérabilité se trouve par simple requête ; le décret présidentiel américain 14028 (2021) et le règlement européen sur la cyberrésilience ont généralisé les SBOM.
- SLSA (version 1.2) définit des niveaux Build L0 à L3, qui aboutissent à des builds renforcés et isolés, et des niveaux Source allant jusqu’à la revue par deux personnes ; la provenance indique qui a construit un artefact, et à partir de quoi.
- La signature sans clé de Sigstore associe un certificat à courte durée de vie à une identité de CI et inscrit les signatures dans un journal de transparence public ; des contrôles d’admission vérifient signatures et provenance avant le déploiement.
- Des lockfiles avec empreintes, l’épinglage des actions de CI et des images par digest, de petites mises à jour automatisées avec un court délai pour les nouvelles versions, une analyse priorisée et des builds éphémères et hermétiques réduisent le risque au quotidien.
- Les obligations de signalement du CRA s’appliquent à partir du 11 septembre 2026 (alerte précoce sous 24 heures, notification sous 72 heures), et la plupart des autres obligations à partir du 11 décembre 2027.
Pourquoi les dépendances sont une surface d’attaque
L’essentiel du code d’un service moderne n’a pas été écrit par l’équipe qui l’exploite. Un petit service web peut déclarer vingt dépendances directes et, par le jeu de leurs propres dépendances, installer plusieurs centaines de paquets ; le conteneur dans lequel il est livré ajoute l’espace utilisateur d’un système d’exploitation, et le pipeline qui le construit exécute des compilateurs, des plug-ins et des actions de CI écrits par d’autres personnes encore. La section 0.3 a présenté les dépendances comme une économie d’effort assortie d’un coût de maintenance. Cette section s’intéresse à leur coût en matière de sécurité : chacun de ces composants, et chaque personne ou système capable de les modifier, fait partie de votre surface d’attaque.
Une attaque de la chaîne d’approvisionnement logicielle compromet quelque chose que vous consommez afin de vous atteindre, généralement en touchant de nombreuses victimes à la fois. Elle peut arriver par quatre grandes voies. Du code malveillant provenant d’une source de confiance : le compte d’un mainteneur est piraté par hameçonnage, un mainteneur devient hostile, ou un projet est confié à un inconnu. Des imitations malveillantes : le typosquatting publie reqeusts à côté de requests ; la dependency confusion (confusion de dépendances), démontrée par Alex Birsan en février 2021, publie sur le registre public un paquet portant le même nom que le paquet interne d’une entreprise et un numéro de version plus élevé, que certains outils de build préfèrent alors. Une altération dans le pipeline : le code source est sain, mais le système de build, les clés de signature ou le registre sont compromis. Des vulnérabilités involontaires : aucun attaquant n’a participé à l’écriture du code, mais un bogue grave dans une dépendance transitive très utilisée expose tous ceux qui la livrent.
Les dernières années ont montré à quelle vitesse la première voie se propage. En mars 2025, les tags de version d’une GitHub Action populaire, tj-actions/changed-files, ont été déplacés vers un commit malveillant qui affichait les secrets de CI dans les journaux de build, touchant des milliers de dépôts qui référençaient l’action par tag. En septembre 2025, un mainteneur de paquets npm très utilisés comme chalk et debug a été piégé par hameçonnage au moyen d’un faux site de support npm, et des versions malveillantes ont été publiées puis retirées en quelques heures ; plus tard le même mois, un ver auto-propagateur, surnommé Shai-Hulud, a volé des jetons npm et s’en est servi pour publier des versions infectées d’autres paquets.
La chaîne d’approvisionnement et les relations de confiance qu’exploitent les attaquants
Quatre incidents, racontés avec exactitude
event-stream (2018). event-stream était un paquet npm populaire, téléchargé environ deux millions de fois par semaine, dont l’auteur d’origine n’avait plus le temps de s’occuper. En septembre 2018, il a cédé les droits de publication à un bénévole qui avait proposé son aide. Le nouveau mainteneur a ajouté une dépendance, flatmap-stream, dont le paquet publié contenait une charge utile chiffrée qui ne s’activait que dans le build de Copay, une application de portefeuille bitcoin, et tentait de voler les portefeuilles aux soldes importants. Un développeur a remarqué le code suspect en novembre 2018. Rien dans le modèle de npm n’avait été cassé : un nom de confiance avait simplement changé de mains.
SolarWinds (2020). Des attaquants, attribués plus tard par le gouvernement américain au service de renseignement extérieur russe, ont obtenu l’accès à l’environnement de build de SolarWinds, l’éditeur du produit de gestion de réseau Orion. Un implant (baptisé SUNSPOT par les enquêteurs) surveillait les builds d’Orion et remplaçait pendant la compilation un fichier source par une version dotée d’une porte dérobée, puis remettait l’original en place. Les mises à jour qui en résultaient, publiées entre mars et juin 2020, étaient construites par le propre pipeline de SolarWinds et signées avec son certificat authentique. Environ 18 000 clients les ont installées ; les attaquants ont ensuite choisi un nombre bien plus restreint d’agences gouvernementales et d’entreprises pour poursuivre l’intrusion. FireEye a découvert la campagne en décembre 2020 en enquêtant sur sa propre violation. La leçon pour les architectes : une signature prouve qui a construit quelque chose, pas que le build était sain.
Log4Shell (2021). La CVE-2021-44228, divulguée le 9 décembre 2021 et notée 10,0 selon le CVSS, était une faille de Log4j 2, la bibliothèque de journalisation Java dominante. Log4j résolvait les lookups écrits dans les messages de journal, y compris les lookups JNDI capables de charger une classe depuis un serveur distant ; un attaquant capable de faire journaliser une chaîne, comme un nom d’utilisateur ou un en-tête de requête, pouvait donc exécuter du code sur le serveur. Aucun attaquant n’avait touché à la chaîne d’approvisionnement ; les dégâts venaient de l’ampleur et de la profondeur avec lesquelles la bibliothèque était intégrée. Les organisations ont passé des semaines à trouver où elles l’utilisaient, plusieurs versions correctives successives ont été nécessaires pour combler des failles apparentées, et celles qui disposaient d’un inventaire exact ont répondu à la question en quelques heures.
xz utils (2024). xz est une bibliothèque de compression utilisée, par l’intermédiaire d’autres bibliothèques, par le serveur OpenSSH sur plusieurs distributions Linux. Pendant environ deux ans, un compte nommé Jia Tan a apporté des contributions utiles et, aidé par d’autres comptes qui pressaient le mainteneur d’origine, débordé, d’accepter de l’aide, est devenu co-mainteneur. Les versions 5.6.0 et 5.6.1, publiées en février et mars 2024, contenaient une porte dérobée qui aurait permis au détenteur d’une clé privée précise d’exécuter des commandes via SSH. Le code malveillant était caché dans des fichiers de test binaires et activé par un script de build modifié qui n’existait que dans les tarballs de publication, pas dans le dépôt public. Le 29 mars 2024, Andres Freund, développeur chez Microsoft, l’a révélé après avoir cherché pourquoi les connexions SSH sur un système de test consommaient un temps processeur inhabituel et prenaient environ une demi-seconde de plus ; la faille a été suivie sous la référence CVE-2024-3094. Comme elle a été détectée tôt, elle n’avait atteint pour l’essentiel que des distributions de développement et en publication continue (rolling release), et non des distributions stables.
Ce que chaque incident enseigne
| Incident | Ce qui s’est passé | Maillon attaqué | Contrôles qui auraient aidé |
|---|---|---|---|
| event-stream (npm), 2018 | Un nouveau mainteneur bénévole, à qui l’auteur d’origine, épuisé, avait confié le paquet, a ajouté une dépendance (flatmap-stream) contenant une charge utile chiffrée visant une application de portefeuille bitcoin précise. | Confiance envers les mainteneurs et dépendances transitives | Lockfiles et délai avant d’adopter les nouvelles versions ; revue des nouvelles dépendances transitives ; financement et succession pour les paquets critiques. |
| SolarWinds Orion, 2020 | Des attaquants présents dans le réseau de l’éditeur ont implanté du code qui remplaçait un fichier source pendant le build, si bien que des mises à jour légitimement signées contenaient la porte dérobée SUNBURST. | Système build | Builds isolés, éphémères et surveillés ; provenance ; builds reproductibles pour comparer les résultats ; moindre privilège pour l’outil de gestion de réseau lui-même. |
| Log4Shell (Log4j 2), 2021 | Une fonctionnalité ancienne qui résolvait les lookups JNDI dans le texte journalisé permettait à tout attaquant capable de faire journaliser une chaîne d’exécuter du code sur le serveur. | Une dépendance vulnérable, profondément imbriquée | Une SBOM pour trouver en quelques minutes chaque système touché ; filtrage du trafic sortant ; application rapide et répétée des correctifs. |
| xz utils, 2024 | Après environ deux ans de contributions patientes, un co-mainteneur a livré des tarballs de publication contenant une porte dérobée cachée qui visait OpenSSH sur certaines distributions Linux. | Processus de source et de publication | Construire à partir du dépôt relu, et non de tarballs faits à la main ; builds reproductibles ; examen attentif des fichiers de test binaires et des scripts de build. |
Les nomenclatures logicielles
Une nomenclature logicielle (SBOM, software bill of materials) est une liste lisible par machine des composants d’un logiciel, avec leurs versions, leurs identifiants et les relations entre eux. Elle ne rend pas le logiciel plus sûr à elle seule ; elle permet de répondre aux questions. Quand le prochain Log4Shell est annoncé, un stockage interrogeable des SBOM de chaque artefact déployé transforme sommes-nous touchés, et où ?
en une simple requête.
Deux formats dominent. SPDX, de la Linux Foundation, est né comme format de conformité des licences ; sa version 2.2.1 est la norme internationale ISO/IEC 5962:2021, et SPDX 3.0 (2024) ajoute des profils pour la sécurité, les builds et l’IA. CycloneDX, un projet OWASP conçu pour les cas d’usage de sécurité, est normalisé par Ecma International sous la référence ECMA-424 ; la version 1.7 est sortie en octobre 2025. Les deux peuvent identifier les composants par une package URL (purl), comme pkg:npm/express@4.21.2, ce sur quoi s’appuient les bases de données de vulnérabilités pour leurs correspondances. L’idée complémentaire de VEX (Vulnerability Exploitability eXchange) permet à un fournisseur d’indiquer qu’un composant vulnérable listé n’est pas exploitable dans son produit, par exemple parce que la fonction vulnérable n’est jamais appelée, ce qui réduit le bruit pour les clients.
Les pouvoirs publics ont fait entrer les SBOM dans les pratiques courantes. Le décret présidentiel américain 14028, Improving the Nation’s Cybersecurity, signé le 12 mai 2021, a défini des mesures relatives à la chaîne d’approvisionnement logicielle pour les logiciels vendus à l’administration fédérale, dont la fourniture d’une SBOM aux acheteurs ; la National Telecommunications and Information Administration a ensuite publié les éléments minimaux d’une SBOM (fournisseur, nom du composant, version, autres identifiants uniques, relations de dépendance, auteur des données de la SBOM et horodatage). La politique américaine s’est depuis éloignée des obligations uniformes : en janvier 2026, le mémorandum M-26-05 de l’Office of Management and Budget a abrogé l’obligation antérieure faite aux fournisseurs d’attester de pratiques de développement sécurisé, laissant les agences fixer des exigences fondées sur les risques et demander des SBOM lorsqu’elles le jugent utile. Dans l’UE, le règlement sur la cyberrésilience, décrit plus loin, fait de la nomenclature des logiciels (SBOM) un élément de la documentation technique des produits comportant des éléments numériques.
Générez les SBOM pendant le build, à partir de ce qui a réellement été résolu et empaqueté, plutôt qu’à partir du manifeste écrit par un développeur ; stockez-les avec l’artefact, indexées par son digest ; et transmettez-les à un service qui revérifie chaque SBOM stockée lorsqu’une nouvelle vulnérabilité est publiée.
{
"bomFormat": "CycloneDX",
"specVersion": "1.6",
"metadata": {"timestamp": "2026-10-20T09:14:02Z",
"component": {"bom-ref": "orders-service", "type": "application",
"name": "orders-service", "version": "4.12.0"}},
"components": [
{"bom-ref": "log4j-core", "type": "library", "name": "log4j-core",
"group": "org.apache.logging.log4j", "version": "2.24.3",
"purl": "pkg:maven/org.apache.logging.log4j/log4j-core@2.24.3",
"hashes": [{"alg": "SHA-256", "content": "9f2c..."}]},
{"bom-ref": "jackson-databind", "type": "library", "name": "jackson-databind",
"version": "2.18.2",
"purl": "pkg:maven/com.fasterxml.jackson.core/jackson-databind@2.18.2"}
],
"dependencies": [
{"ref": "orders-service", "dependsOn": ["log4j-core", "jackson-databind"]}
]
}SLSA : des niveaux pour l’intégrité du build
SLSA (Supply-chain Levels for Software Artifacts, prononcé salsa) est un cadre, aujourd’hui maintenu au sein de l’Open Source Security Foundation, qui décrit des niveaux progressifs de protection contre les altérations. La version 1.0 (2023) définissait une piste Build ; la version 1.2 a restructuré la spécification en plusieurs pistes et ajouté une piste Source. L’élément central est la provenance : une déclaration signée, généralement au format d’attestation in-toto, indiquant quelle plateforme de build a produit un artefact, à partir de quelle révision du code source, avec quelle définition de build et quels paramètres. Un consommateur vérifie la provenance par rapport à des attentes comme construit par notre CI à partir de la branche main de github.com/fooddelivery/orders.
La piste Source comporte quatre niveaux : gestion de versions (L1), historique continu et immuable avec une provenance pour chaque révision (L2), contrôles techniques appliqués en continu, comme les branches protégées (L3), et revue par deux personnes de chaque modification des branches protégées (L4). Pour la plupart des organisations, la cible réaliste est Build L3 sur une plateforme de build partagée et bien gérée, plus Source L3 ou L4 pour les dépôts importants ; les niveaux disent ce qu’une plateforme doit garantir, et une équipe plateforme peut les atteindre une fois pour tous les services.
Les niveaux de la piste Build de SLSA
| Niveau | Nom | Ce qu’il garantit |
|---|---|---|
| Build L0 | Aucune garantie | Aucune exigence : l’absence de SLSA. |
| Build L1 | La provenance existe | Le build produit une provenance qui décrit comment l’artefact a été construit. Elle détecte les erreurs, mais est facile à falsifier. |
| Build L2 | Plateforme de build hébergée | Un service de build hébergé génère et signe la provenance, ce qui protège contre les altérations après le build. |
| Build L3 | Builds renforcés | La plateforme de build isole les builds les uns des autres et garde le matériel de signature hors de portée des étapes de build définies par l’utilisateur, ce qui protège contre les altérations pendant le build. |
Signature et provenance avec Sigstore
Signer les artefacts est possible depuis longtemps, mais la gestion de clés de signature à longue durée de vie était si contraignante que peu de projets open source le faisaient, et les clés volées constituaient elles-mêmes un risque. Sigstore, lancé en 2021 et désormais rattaché à l’Open Source Security Foundation, rend la signature peu coûteuse grâce à la signature sans clé (keyless). Un job de CI prouve son identité à Fulcio, l’autorité de certification de Sigstore, avec un jeton OpenID Connect ; Fulcio émet un certificat valable quelques minutes qui nomme cette identité, par exemple un workflow précis dans un dépôt précis ; l’outil signe l’artefact et inscrit la signature dans Rekor, un journal de transparence public en ajout seul ; la clé privée éphémère est ensuite détruite. Les vérificateurs contrôlent la signature, l’identité figurant dans le certificat et l’entrée du journal, au lieu de faire confiance à une clé qui aurait pu fuiter.
L’outil cosign applique ce principe aux images de conteneur et à d’autres artefacts, et les écosystèmes de paquets ont adopté les mêmes idées : npm peut publier des paquets avec des déclarations de provenance qui les relient au dépôt source et au build (2023), et PyPI prend en charge la publication de confiance (trusted publishing) depuis la CI sans jetons à longue durée de vie (2023) et des attestations fondées sur Sigstore (2024). Au déploiement, un contrôleur d’admission dans Kubernetes, comme le policy controller de Sigstore ou Kyverno, peut refuser toute image qui n’est pas signée par l’identité attendue ou qui n’a pas la provenance attendue. Souvenez-vous de SolarWinds : la signature et la provenance prouvent d’où vient quelque chose ; seuls l’isolation du build, la revue et la détection rendent fiable ce qui en sort.
Un pipeline renforcé, du commit à la production
Lockfiles, épinglage et mises à jour automatisées
Un manifeste comme package.json ou pyproject.toml indique des plages de versions acceptables ; un lockfile (fichier de verrouillage : package-lock.json, poetry.lock, uv.lock, go.sum, Cargo.lock) enregistre les versions exactes résolues, généralement avec une empreinte cryptographique de chacune. Commiter le lockfile et installer à partir de lui en CI (npm ci, pip install --require-hashes) garantit que chaque build utilise les mêmes octets relus, et qu’un paquet republié avec un contenu différent échoue à la vérification d’empreinte. L’épinglage s’applique aussi à l’outillage de build : référencez les actions de CI par leur empreinte de commit complète, et non par un tag que leur propriétaire, ou un attaquant, peut déplacer, ce qui est précisément ce qui a permis à l’incident tj-actions de se propager ; référencez les images de base par digest.
Épingler sans mettre à jour crée le risque inverse : les anciennes versions accumulent les vulnérabilités connues et les montées de version deviennent trop lourdes pour être tentées. Des bots de mise à jour comme Dependabot et Renovate ouvrent de petites pull requests fréquentes que la CI teste automatiquement. Un raffinement utile est un âge minimal de publication : attendre quelques jours avant d’adopter une nouvelle version de routine, car la plupart des versions malveillantes sont détectées et retirées en quelques heures ou quelques jours ; les correctifs de sécurité en sont exemptés et passent en priorité.
Les outils d’analyse de la composition logicielle (SCA), comme OWASP Dependency-Check, Trivy, Grype ou des services commerciaux, confrontent vos dépendances aux bases de données de vulnérabilités. Leur faiblesse est le bruit : des centaines de résultats, pour la plupart dans des chemins de code que vous n’appelez jamais. Priorisez à l’aide des données d’exploitation (la vulnérabilité figure-t-elle dans le catalogue Known Exploited Vulnerabilities de la CISA, quel est son score EPSS ?), de l’analyse d’atteignabilité quand vos outils la proposent, et de l’exposition (le service est-il exposé à internet ?). La section 8.8 traite de la gestion des vulnérabilités en tant que processus.
Conteneurs et intégrité du build
Une image de conteneur embarque l’espace utilisateur d’un système d’exploitation en plus de votre code, et chaque paquet qu’elle contient fait partie de la chaîne d’approvisionnement. Partez d’images de base minimales (distroless, Alpine ou images de distribution allégées), qui contiennent moins de paquets susceptibles d’être vulnérables ; reconstruisez les images régulièrement pour que les correctifs de l’image de base arrivent même quand votre code n’a pas changé ; analysez les images en CI, puis en continu dans le registre, car de nouvelles vulnérabilités visant d’anciennes images sont publiées chaque jour ; et déployez les images par digest, pour que ce qui a été analysé soit bien ce qui s’exécute.
Le système de build est la cible la plus précieuse de la chaîne, car il touche à tout, comme l’a montré SolarWinds. Exécutez les builds sur des runners éphémères, créés pour un seul job et détruits ensuite, afin qu’un attaquant ne puisse pas persister d’un build à l’autre. Rendez les builds hermétiques, avec toutes leurs entrées déclarées et récupérées par empreinte, et sans accès réseau pendant la compilation, pour qu’aucune entrée non déclarée ne puisse s’y glisser. Tenez les secrets à longue durée de vie à l’écart de la CI en utilisant la fédération OIDC pour obtenir des identifiants cloud à courte durée de vie pour chaque job, et donnez à chaque pipeline le moindre privilège dont il a besoin, afin qu’une pull request issue d’un fork ne puisse pas atteindre les identifiants de déploiement. Protégez le chemin de mise en production par la protection des branches et une revue par deux personnes. Enfin, les builds reproductibles, où le même code source produit toujours un résultat identique au bit près, permettent à des parties indépendantes de reconstruire et de comparer ; le projet Reproducible Builds et des distributions comme Debian ont rendu reproductibles la plupart de leurs paquets, et une divergence est un indice sérieux d’altération.
Le règlement européen sur la cyberrésilience
Le règlement sur la cyberrésilience (Cyber Resilience Act, CRA), règlement (UE) 2024/2847, fixe des exigences horizontales de cybersécurité pour les produits comportant des éléments numériques mis à disposition sur le marché de l’UE : produits matériels et logiciels, y compris leurs solutions de traitement de données à distance. Il est entré en vigueur le 10 décembre 2024 et s’applique par étapes. Les règles relatives à la notification des organismes d’évaluation de la conformité s’appliquent à partir du 11 juin 2026. Les obligations de signalement de l’article 14 s’appliquent à partir du 11 septembre 2026 : un fabricant doit signaler toute vulnérabilité activement exploitée ou tout incident grave ayant des répercussions sur la sécurité de son produit, par une alerte précoce au plus tard 24 heures après en avoir pris connaissance, une notification plus complète au plus tard 72 heures après, puis un rapport final (pour une vulnérabilité, au plus tard 14 jours après la mise à disposition d’une mesure de correction ; pour un incident grave, dans un délai d’un mois), via la plateforme unique de signalement gérée par l’ENISA, l’agence de l’Union européenne pour la cybersécurité. La plupart des autres obligations s’appliquent à partir du 11 décembre 2027.
Les exigences essentielles de l’annexe I relèvent autant de l’architecture que de la procédure : les produits doivent être conçus avec un niveau de sécurité approprié, mis à disposition avec une configuration sécurisée par défaut, limiter les surfaces d’attaque, protéger la confidentialité et l’intégrité des données, minimiser les données, et pouvoir enregistrer les événements de sécurité et recevoir des mises à jour de sécurité. Les fabricants doivent recenser et documenter les composants, notamment en établissant une nomenclature des logiciels (SBOM) couvrant au moins les dépendances de premier niveau, traiter les vulnérabilités au moyen d’une politique de divulgation coordonnée des vulnérabilités, et fournir des mises à jour de sécurité pendant une période d’assistance qui devrait normalement être d’au moins cinq ans, sauf si le produit est destiné à être utilisé moins longtemps. Les amendes pour manquement aux exigences essentielles ou aux obligations des fabricants peuvent atteindre 15 millions d’euros ou 2,5 % du chiffre d’affaires annuel mondial total, le montant le plus élevé étant retenu.
Le champ d’application est déterminant. Les logiciels libres et ouverts développés ou fournis en dehors d’une activité commerciale ne relèvent pas du CRA, et un régime allégé s’applique aux intendants de logiciels ouverts qui soutiennent de tels logiciels destinés à un usage commercial. Le logiciel purement en tant que service (SaaS) échappe généralement au CRA, sauf s’il constitue la solution de traitement de données à distance d’un produit ; les fournisseurs de services cloud et d’autres services numériques peuvent relever plutôt de la directive SRI 2 (NIS2). Savoir si un produit donné entre dans le champ d’application, et quelle procédure d’évaluation de la conformité s’applique, est une question juridique propre à chaque organisation ; la conséquence pour l’architecture est que les SBOM, le traitement des vulnérabilités, les mécanismes de mise à jour et la journalisation de sécurité deviennent des preuves qui doivent exister, et non de bonnes intentions.
Liste de contrôle : la sécurité de la chaîne d’approvisionnement pour une équipe de service
La plupart de ces points sont d’abord des fonctions de la plateforme, puis des habitudes.
- Tenir un inventaireGénérez une SBOM pour chaque build et stockez-la avec l’artefact, pour que « sommes-nous touchés ? » soit une requête, et non un projet.
- Verrouiller et vérifier les dépendancesCommitez les lockfiles, installez avec vérification des empreintes en CI, et faites échouer le build si le lockfile et le manifeste divergent.
- Choisir les dépendances délibérémentAvant d’en ajouter une, vérifiez sa maintenance, le nombre de mainteneurs, les résultats OpenSSF Scorecard, la licence et la quantité de code qu’elle entraîne de manière transitive.
- Mettre à jour en continu, mais pas instantanémentLaissez un bot proposer de petites mises à jour chaque semaine ; appliquez un court âge minimal de publication aux mises à jour de routine ; faites passer les correctifs de sécurité en priorité.
- Analyser, puis trierExécutez l’analyse de la composition logicielle et l’analyse des images en CI et en continu dans le registre ; priorisez selon l’exploitabilité et l’atteignabilité, pas selon le nombre.
- Épingler les outils de build autant que les bibliothèquesÉpinglez les actions de CI et les plug-ins sur des empreintes de commit complètes et les images de base sur des digests ; revoyez leurs modifications comme du code.
- Isoler et renforcer le buildRunners éphémères, aucun secret à longue durée de vie (utilisez la fédération OIDC), jetons au moindre privilège, branches protégées et revue par deux personnes pour les chemins de mise en production.
- Signer et enregistrer la provenanceSignez les artefacts avec Sigstore ou un équivalent, publiez une provenance SLSA, et visez Build L3 sur la plateforme.
- Vérifier au déploiementDes politiques d’admission rejettent les images non signées, signées par une mauvaise identité ou dépourvues de provenance issue du dépôt attendu.
- Préparer le prochain Log4ShellEntraînez-vous à trouver et à corriger une bibliothèque dans tous les services en une journée, et connaissez vos obligations de signalement au titre du CRA, des contrats et envers vos clients.
Questions fréquentes
Faut-il vendoriser (copier) toutes les dépendances dans notre dépôt ?
Le vendoring donne du contrôle et permet des builds hors ligne, mais complique les mises à jour et masque les correctifs en amont. Un lockfile avec empreintes, plus un miroir de registre privé qui met en cache les paquets approuvés, donne l’essentiel du contrôle avec moins de maintenance.
Un registre privé suffit-il à arrêter la dependency confusion ?
Seulement si les builds sont configurés pour résoudre les noms internes exclusivement à partir de lui. Utilisez des noms de paquets à portée (scope) ou à espace de noms, enregistrez vos noms internes sur les registres publics, et configurez le gestionnaire de paquets pour qu’un paquet public ne puisse jamais remplacer un paquet interne.
Qui, dans l’organisation, est responsable de la sécurité de la chaîne d’approvisionnement ?
En général, c’est une responsabilité partagée : une équipe plateforme ou sécurité fournit une fois pour toutes le pipeline renforcé, la signature, l’analyse et les politiques ; chaque équipe de service garde ses dépendances peu nombreuses, à jour et justifiées.
Vérifiez votre compréhension
Pourquoi les vérifications de signature des clients de SolarWinds ne les ont-elles pas protégés ?
La porte dérobée a été insérée pendant le build de SolarWinds lui-même, si bien que la mise à jour piégée était authentiquement signée par SolarWinds. Une signature montre qui a produit un artefact, pas que le build était sain.
Qu’apporte un lockfile par rapport à un manifeste ?
Le manifeste indique des plages de versions acceptables ; le lockfile enregistre les versions exactes résolues et généralement leurs empreintes, de sorte que chaque build installe les mêmes octets et qu’un paquet modifié échoue à la vérification.
Pourquoi référencer une action de CI par tag est-il plus risqué que par empreinte de commit ?
Un tag peut être déplacé par quiconque contrôle le dépôt, y compris un attaquant, si bien que la même référence peut exécuter silencieusement un code différent ; une empreinte de commit complète identifie un contenu immuable.
À quelle question une SBOM répond-elle, à laquelle un scanner de vulnérabilités seul ne répond pas rapidement sur l’ensemble d’un parc ?
Quels artefacts déployés, dans quels services et quels environnements, contiennent un composant et une version donnés, de sorte que l’exposition à une vulnérabilité nouvellement annoncée puisse être repérée partout à la fois.
Sources et lectures complémentaires
Une question sur cette section ? ArchitectBot, l’assistant d’étude IA du cours, répond d’abord à partir du cours.
Demander : « Comment notre équipe doit-elle prioriser des centaines d’alertes de vulnérabilités dans les dépendances, et lesquelles comptent vraiment ? »