Points clés à retenir :
- Les composants non pris en charge peuvent présenter des risques bien au-delà du paquet qu'une organisation suit activement, car des dépendances transitives cachées peuvent subsister au plus profond de la chaîne d'approvisionnement logicielle.
- Des outils tels que les SBOM et les plateformes SCA améliorent la visibilité sur les dépendances vulnérables, mais ils ne résolvent pas le problème sous-jacent de la mise à jour une fois qu'un composant a atteint sa fin de vie.
- Pour réduire les risques à long terme, il faut adopter une approche proactive visant à sécuriser et à maintenir à la fois les composants en fin de vie et les dépendances sous-jacentes, sans imposer de mises à niveau perturbatrices ni ralentir le développement.
La plupart des équipes se sentent plutôt en confiance quant aux risques qu’elles surveillent au sein de leur pile logicielle. Elles surveillent leurs systèmes d’exploitation, contrôlent leurs paquets de premier niveau et se concentrent sur les composants qu’elles adoptent délibérément. Cependant, derrière chaque projet open source se cache une réalité bien plus complexe : une majorité invisible de code hérité indirectement par le biais de bibliothèques tierces.
Cette chaîne de dépendances tentaculaire est en grande partie invisible, transmise de génération en génération et souvent oubliée. Et c'est là que les risques apparaissent. Ces bibliothèques profondément imbriquées constituent 80 à 90 % des logiciels modernes et créent l'un des angles morts les plus dangereux de la chaîne d'approvisionnement actuelle.
Même les organisations qui ont mis en place des processus rigoureux de gestion des correctifs ont rarement une visibilité complète sur ces composants indirects, ce qui permet à des dépendances obsolètes ou en fin de vie de persister discrètement au sein des systèmes de production sans qu'on s'en rende compte.
L'impact réel de la fin de vie
Lorsqu'un composant open source arrive en fin de vie (EOL), le risque s'étend immédiatement à toutes les dépendances qui en découlent. Certaines peuvent encore bénéficier d'un support, tandis que d'autres sont peut-être déjà vulnérables ou en passe d'arriver en fin de vie. Ce réseau complexe de dépendances offre une opportunité idéale aux pirates, ce qui explique pourquoi les paquets en fin de vie constituent des cibles particulièrement prisées.
Le véritable défi réside dans le fait que la correction du paquet parent ne résout pas automatiquement les problèmes au niveau des dépendances sur lesquelles il s'appuie, ce qui expose plusieurs niveaux à des risques sans qu'on en ait une vision claire.
Les pirates le savent bien. Ils ne veulent pas perdre leur temps à s'attaquer à du code personnalisé hautement sécurisé alors que des paquets open source obsolètes constituent une cible bien plus facile.
L'effet Jenga
Le problème est que dès lors qu'un seul de ces composants, qu'il s'agisse du composant parent en fin de vie ou de l'une de ses dépendances transitives, contient une vulnérabilité non corrigée, la sécurité de l'ensemble de la pile est compromise. À l'instar d'une tour de Jenga, peu importe quel bloc est fragile : il suffit aux attaquants de repérer celui qui est le plus facile à faire tomber pour mettre en péril toute la tour.
Un problème similaire est apparu avec Spring4Shell (CVE-2022-22965): de nombreuses organisations n'utilisaient pas directement la bibliothèque Spring Core vulnérable, mais celle-ci était intégrée aux frameworks et aux plateformes sur lesquels reposaient leurs applications. Cette exposition cachée a compliqué les efforts de correction et a démontré comment une seule faille dans une bibliothèque largement utilisée peut avoir des répercussions sur des organisations autres que celles qui l'utilisent directement.
On ne peut pas protéger ce que l'on ne voit pas
L'incident Spring4Shell a mis en évidence une réalité douloureuse : la plupart des dirigeants et de leurs équipes n'ont pas mis en place de processus cohérent permettant d'assurer une visibilité totale sur leurs arborescences de dépendances. Sans savoir ce que contient la pile logicielle et quels composants arrivent en fin de cycle de support, il est pratiquement impossible de repérer où se cachent les paquets vulnérables.
Dans un monde idéal, les équipes d'ingénieurs tiendraient à jour une nomenclature logicielle (SBOM) exhaustive répertoriant tous les composants directs et transitifs. Grâce à cette visibilité, elles pourraient rapidement déterminer si un paquet à risque, tel que Spring Core, est présent et où il est utilisé.
Les outils modernes d'analyse de la composition logicielle (SCA) facilitent la tâche en générant des SBOM, en recherchant les CVE connus et en signalant les dépendances vulnérables. Ils sont indispensables pour la détection, mais lorsqu'un paquet est en fin de vie (EOL), les outils SCA se contentent de signaler l'existence d'un problème. Ils n'apportent pas de solution. C'est pourquoi les vulnérabilités transitives sont si dangereuses : elles sont cachées, souvent signalées trop tard, et, dans les composants en fin de vie, elles ne peuvent pas être corrigées par les voies habituelles.
Rater sa mise sur le marché
La réaction à Spring4Shell a mis en évidence à quel point les dépendances cachées peuvent être perturbantes. Les équipes ont dû tout laisser tomber pour passer au crible leurs applications, leurs conteneurs et leurs outils tiers, simplement pour déterminer si la bibliothèque Spring Core vulnérable était intégrée à leurs piles. Pour beaucoup, le véritable défi ne résidait pas seulement dans l'application des correctifs, mais dans la recherche de cette dépendance elle-même.
Ce genre de course effrénée pour réagir aux problèmes ne se contente pas de ralentir le processus de correction. Elle peut même faire dérailler des feuilles de route de produits entières. Au lieu de proposer de nouvelles fonctionnalités, les développeurs et les chefs de produit peuvent finir par se retrouver à fouiller dans des graphiques de dépendances opaques et à mettre en place des solutions de contournement d'urgence.
Lorsque le composant vulnérable a également dépassé la fin de son cycle de vie en matière de support de sécurité, la charge devient encore plus lourde. En l'absence de correctifs proposés par la communauté ou les éditeurs, les équipes doivent soit se lancer dans le travail coûteux consistant à maintenir elles-mêmes les correctifs, soit retarder les mises à jour tout en recherchant des solutions de migration.
Et même lorsqu'une dépendance transitive dispose d'une version plus récente et non vulnérable, la mise à niveau n'est pas toujours possible, car le paquet parent en fin de vie (EOL) peut ne pas la prendre en charge. Dans ces cas-là, le développement s'enlise tandis que les équipes doivent choisir entre deux options : provoquer des changements incompatibles en effectuant la mise à niveau, ou laisser subsister des vulnérabilités en ne la réalisant pas. Dans tous les cas, les dépendances non prises en charge entraînent des retards dans les projets, une augmentation des coûts et la perte d'opportunités commerciales.
La voie à suivre
En réalité, la visibilité à elle seule ne suffit pas.
Même si vous disposez d'une vision claire de votre graphe de dépendances, les composants non pris en charge limitent vos options. Les mises à niveau seront toujours nécessaires à un moment ou à un autre, mais en l'absence de correctifs de sécurité, les entreprises sont souvent contraintes de les effectuer de manière réactive, plutôt que selon leur propre calendrier.
Une meilleure approche consiste à mettre en place une gestion proactive du cycle de vie, garantissant la poursuite des correctifs de sécurité même après qu'un composant a atteint sa fin de vie (EOL), et couvrant à la fois le composant lui-même, qui n'est plus pris en charge, et toutes les dépendances transitives vulnérables.
Cela permettrait aux équipes de :
- Veiller au respect des exigences en matière de correctifs et de sécurité.
- Réduire les risques opérationnels liés aux composants non pris en charge.
- Maintenir le rythme de développement en évitant les mises à jour forcées et imprévues.
Mais cela soulève une question évidente : comment maintenir ce type de correctifs continus et tenant compte des dépendances à grande échelle sans faire porter tout le poids de cette tâche à votre équipe ?
Quand la maturité des processus se traduit par une sécurité de bout en bout
La réponse ? Un processus de correction éprouvé et de qualité industrielle qui sécurise automatiquement et à grande échelle chaque couche de dépendances, évitant ainsi aux équipes de devoir suivre manuellement chacune d'entre elles.
L'approche de TuxCare, affinée au fil de dix années d'expérience, relève le défi de la sécurité « full-stack » en sécurisant non seulement le composant en fin de vie dont vous dépendez, mais aussi toutes les dépendances transitives vulnérables au sein de son écosystème.
Lorsque vous intégrez un composant en fin de vie dans le cadre de notre service « Endless Lifecycle Support », nous analysons et interprétons son système de compilation, son modèle de gestion des versions et sa structure de dépendances propres à ce composant. Cela garantit que même les bibliothèques les plus profondément imbriquées sont prises en charge sans que vous ayez à les identifier manuellement.
Nous surveillons en permanence plusieurs sources faisant autorité afin de identifier les vulnérabilités dans l'ensemble de l'arborescence des dépendances dès leur divulgation. Les correctifs sont rétroportés en toute sécurité vers les anciennes versions non prises en charge, chaque correctif faisant l'objet d'une validation approfondie par des experts afin de garantir qu'il comble la faille de sécurité sans nuire à la compatibilité.
Vous recevez des mises à jour entièrement testées et signées cryptographiquement, accompagnées de fichiers SBOM et VEX, ce qui vous offre une transparence totale sur ce qui s'exécute exactement dans votre environnement, sans que vous ayez à analyser vous-même des chaînes d'interdépendances complexes.
C'est là que réside la véritable différence : un processus de correction automatisé et éprouvé, adapté aux entreprises, qui assure une sécurité complète face à la fin de vie des produits sans vous obliger à consacrer des ressources techniques à l'identification ou à la correction des dépendances profondément imbriquées dont vous dépendez.

