Verrouiller et mettre à jour les dépendances

Deux obligations qui tirent en sens contraire

Exigence Ce qu’elle impose Ce qu’elle pousse à faire
Annexe I, partie I — pas de vulnérabilité exploitable connue à la mise sur le marché Les composants doivent être à jour Mettre à jour souvent
Annexe I, partie II, point 2 — corriger sans délai Idem, en continu Mettre à jour vite
Art. 13, paragraphe 8 — période de support de cinq à dix ans Pouvoir reconstruire à l’identique une version livrée il y a huit ans Tout figer

Le règlement exige donc simultanément la fraîcheur et la reproductibilité. La réponse n’est pas un compromis mou : c’est figer précisément, et mettre à jour délibérément.

Figer : le fichier de verrouillage

Un manifeste déclare des intervalles (« version 5 ou supérieure ») ; un fichier de verrouillage enregistre la résolution exacte, transitives comprises, avec les empreintes.

Sans lui, deux constructions du même code à deux dates différentes produisent deux artefacts différents. Les conséquences sont directement réglementaires :

  • le SBOM ne décrit plus de façon fiable ce qui a été livré ;
  • la reconstruction d’une version ancienne devient impossible, donc la période de support aussi ;
  • une substitution silencieuse de dépendance ne se voit pas.

La règle : le fichier de verrouillage est commité, il fait partie du code source, et la construction publiable échoue si la résolution s’en écarte. C’est ce que garantissent les modes d’installation stricts des différents écosystèmes, qui refusent de mettre à jour le fichier de verrouillage à la volée.

Figer aussi ce qui n’est pas une dépendance applicative

C’est l’angle mort le plus fréquent : on verrouille les bibliothèques, et on laisse mutable tout le reste de la chaîne.

Élément Référence mutable — à éviter Référence immuable
Action ou étape de CI réutilisée Étiquette de version Empreinte de commit complète
Image de base de conteneur :latest, ou une étiquette de version Empreinte de contenu
Script distant exécuté par la chaîne URL vers la branche principale URL figée + vérification d’empreinte
Outil installé à la volée « dernière version » Version exacte, empreinte vérifiée

Pourquoi c’est décisif. Une étiquette peut être repointée vers un autre commit sans qu’aucune de vos références ne change. C’est exactement l’attaque qui a exposé les secrets de milliers de chaînes en mars 2025 — voir Incidents de référence. Une empreinte, elle, ne se repointe pas.

Mettre à jour : délibérément, pas automatiquement

Figer sans mettre à jour produit l’inverse du résultat cherché : un produit reproductible et vulnérable.

Les robots de mise à jour — Dependabot, Renovate — sont l’outillage standard. Ils ouvrent des propositions de modification lorsqu’une version est publiée, avec les notes de version et, selon la configuration, la vulnérabilité corrigée.

Mais un robot de mise à jour est lui-même un vecteur. Une montée de version automatique fusionnée sans revue introduit du code tiers directement en production. Trois garde-fous :

Garde-fou Effet
Délai de quarantaine Aucune version publiée depuis moins de N jours n’est proposée. Les paquets malveillants sont généralement retirés en quelques heures ou quelques jours
Fusion automatique restreinte Réservée aux correctifs de sécurité sur des composants en liste blanche, et jamais pour un changement de version majeure
Revue humaine des dépendances sensibles Liste explicite des composants dont toute montée de version passe par une personne

L’ingestion contrôlée : cache ou point de décision ?

Faire transiter les dépendances par un miroir interne est une bonne pratique répandue, mais il faut distinguer deux dispositifs que l’on confond souvent :

Cache ou miroir Point de décision à l’entrée
Fonction Sert plus vite, résiste à l’indisponibilité amont Autorise, refuse, met en quarantaine
Moment Après téléchargement Avant l’entrée dans l’organisation
Face à un paquet malveillant Il le propage, et le conserve Il le bloque

Un cache accélère ; il ne gouverne pas. Si l’objectif est d’empêcher un paquet typosquatté ou fraîchement publié d’entrer, il faut une décision appliquée avant l’ingestion, et une politique qui vive à côté du code plutôt que dans une console.

Point souvent négligé : la configuration seule ne suffit pas. Tant qu’un poste peut joindre directement le registre public, le contournement est trivial. Le filtrage sortant est ce qui rend la règle effective.

La reproductibilité, exigence de long terme

Sur un produit couvert par une période de support de dix ans, il faut pouvoir reconstruire dans huit ans. Cela suppose de conserver, en plus du code :

  • le fichier de verrouillage de la version livrée ;
  • les empreintes des images de base et des outils de construction ;
  • une copie des artefacts amont — un registre public n’est pas un service d’archivage, et des paquets disparaissent ;
  • la définition de la chaîne telle qu’elle était.

La démarche des builds reproductibles pousse la logique à son terme : deux constructions du même code produisent des artefacts identiques bit à bit. C’est exigeant, et c’est la seule preuve réellement vérifiable par un tiers.

Le recoupement mérite d’être dit : ce que le règlement impose de conserver pour la période de support, et ce que la GPL impose de fournir comme « code source correspondant », sont le même ensemble d’artefacts. Voir Application bureau ou ligne de commande.

Liste de contrôle

  • Fichier de verrouillage commité pour chaque écosystème
  • Construction publiable en mode strict, qui échoue si la résolution s’écarte
  • Actions et étapes de CI épinglées par empreinte de commit
  • Images de base épinglées par empreinte de contenu
  • Robot de mise à jour actif, avec délai de quarantaine
  • Fusion automatique limitée aux correctifs de sécurité, composants en liste blanche
  • Liste des dépendances à revue humaine obligatoire
  • Dépendances servies par un miroir interne, avec filtrage sortant
  • Artefacts amont archivés pour la durée de la période de support
  • Test annuel : reconstruire une version livrée il y a plus de deux ans