Ce que CVE-2026-111497 affecte réellement

Un spécialiste de la cybersécurité examine un pipeline protégé de dépendances du décodeur Brotli entre serveurs, conteneurs et couches logicielles.

CVE-2026-111497 est une écriture hors limites dans le décodeur Brotli de Google. Le défaut survient lorsqu’une application vulnérable décompresse un flux Brotli malformé : le décodeur traite un changement de bloc invalide comme s’il lui fallait simplement davantage de données, puis continue d’ajouter des octets dans un tampon interne de huit octets. Les données peuvent ainsi dépasser la limite mémoire prévue. Dans Node.js, le code concerné est intégré au module zlib de l’environnement d’exécution ; une application qui utilise la décompression Brotli peut donc exposer la faille sans installer un paquet distinct appelé brotli.

La publication de sécurité de Node.js décrit directement la conséquence. Un attaquant capable de fournir des données Brotli qu’une application décompresse avec node:zlib peut corrompre la mémoire du processus, ce qui peut entraîner un plantage, une divulgation de la mémoire du processus ou une exécution de code à distance. La publication classe le problème comme étant de gravité élevée et identifie les lignes de versions Node.js 26.x, 24.x et 22.x comme concernées. Pour un responsable, la question pertinente n’est donc pas seulement « Quelle version de Node.js est installée ? », mais aussi « Ce processus en cours d’exécution peut-il être amené à décompresser des données Brotli provenant d’un attaquant ou d’un autre système non fiable ? »

Cette condition est importante, car la vulnérabilité ne signifie pas que toute machine contenant une bibliothèque capable de gérer Brotli est compromise. Le bulletin de Red Hat décrit le même problème comme un flux conçu pour corrompre la mémoire d’une application traitant des données Brotli non fiables. Il cite parmi les conséquences possibles la divulgation d’informations, le déni de service et l’exécution de code arbitraire, tout en précisant que les environnements dans lesquels aucune application ne décompresse de données Brotli provenant de sources non fiables ne sont pas concernés en pratique. L’exploitation exige un flux spécifiquement malformé ; une sortie ordinaire et correctement formée produite par un encodeur normal ne déclenche pas le problème.

C’est l’emplacement du décodeur qui rend le problème d’inventaire facile à sous-estimer. Brotli est utilisé pour l’en-tête HTTP Content-Encoding: br, mais peut aussi se présenter sous la forme d’une bibliothèque autonome, de liaisons Python, d’un composant intégré aux navigateurs et à d’autres clients, ou d’une partie d’un produit plus vaste. Red Hat indique que la bibliothèque est disponible via des paquets tels que brotli et les liaisons Brotli pour Python, tout en précisant que Node.js l’intègre à zlib. Le même bulletin mentionne des copies intégrées dans Firefox, Thunderbird et des produits en couches. Un inventaire logiciel qui ne recense que les applications de premier niveau peut donc afficher un service apparemment banal tout en masquant le décodeur natif qui analyse réellement les octets compressés fournis de l’extérieur.

C’est également pourquoi l’identifiant CVE doit être suivi à deux niveaux. La fiche CVE nomme la vulnérabilité sous-jacente, tandis qu’un avis concernant un environnement d’exécution ou un produit explique comment ce composant est empaqueté, corrigé ou rétroporté dans une distribution donnée. Une mise à jour de Node.js peut corriger la copie intégrée à Node.js, mais ne dit rien en elle-même d’une bibliothèque Brotli distincte, d’une liaison Python, d’une version de navigateur, d’une image d’appliance ou d’un autre produit qui embarque sa propre copie. À l’inverse, la présence du CVE dans le résultat d’un analyseur ne prouve pas que le chemin de décodage concerné soit accessible depuis une source non fiable.

La première classification utile combine donc le composant et le chemin d’entrée. Notez par où Brotli entre dans le système, quel produit ou environnement d’exécution détient la copie utilisée et si cette copie traite des réponses réseau, des requêtes HTTP, des données téléversées, des artefacts distants ou tout autre contenu contrôlé en dehors de la frontière de confiance. Dans Node.js, cette vérification doit inclure les utilisations des API de décompression Brotli ainsi que tout comportement qui décode automatiquement les réponses br. Pour les autres produits, utilisez l’avis du fournisseur concernant le composant et les notes de version, plutôt que de supposer qu’un nom de paquet ou une version d’application correspond directement au binaire vulnérable.

Cette approche permet de distinguer les comportements confirmés des spéculations concernant l’exploitation. Les avis disponibles établissent l’existence d’une faille de sécurité mémoire, potentiellement lourde de conséquences lorsque des processus de décodage vulnérables traitent des données contrôlées par un attaquant. Ils ne démontrent pas que toutes les installations sont exposées de la même manière, ni qu’une campagne d’exploitation généralisée et confirmée est en cours. La priorité défendable consiste à localiser les décodeurs à la fois vulnérables et accessibles, puis à vérifier la version corrigée du produit qui les intègre effectivement. C’est le socle de l’inventaire des dépendances requis à l’étape suivante.

Pourquoi une mise à jour de Node.js ne suffit pas à réduire toute l’exposition

Mettre Node.js à jour est nécessaire lorsqu’une application utilise une branche de versions concernée, mais ce n’est pas une réponse complète à CVE-2026-111497. Le code vulnérable se trouve dans le décodeur C Brotli de Google, et Cisco précise que ce composant est souvent intégré ou lié à des logiciels qui dépassent le seul périmètre de Node.js. Un produit peut donc hériter de la même faille sans apparaître comme une application Node.js dans un inventaire, et sans fournir aux opérateurs un paquet Brotli distinct à mettre à jour. La question pertinente n’est pas seulement : « Quelles versions de Node.js utilisons-nous ? » Il faut aussi demander : « Quels produits contiennent un décodeur Brotli, et lesquels peuvent être amenés à décompresser des données fournies par un tiers ? »

L’avis publié par Cisco le 5 novembre montre pourquoi cette distinction compte sur le plan opérationnel. Cisco examine les produits individuellement, au lieu de considérer l’ensemble de son portefeuille comme touché de manière uniforme. Son tableau des produits prioritaires fait apparaître des situations différentes : Catalyst SD-WAN Software, Identity Services Engine, IOS XE Software, Secure Firewall Management Center et Secure Firewall Threat Defense y sont indiqués comme non concernés, tandis que IOS XR Software et Secure Firewall Adaptive Security Appliance Software restent en cours d’examen. Pour NX-OS Software, l’avis renvoie vers d’autres tableaux consacrés à l’impact et aux correctifs. Cette variation montre qu’une évaluation au niveau du fournisseur dépend de la manière dont un produit donné intègre et utilise le composant partagé, et pas simplement du fait que le fournisseur propose des logiciels associés à Node.js ou à Brotli.

Le même avis recense des produits faisant l’objet d’une enquête active dans un large éventail de catégories : observabilité des applications, sécurité des réseaux et des contenus, gestion des réseaux, routage et commutation, informatique unifiée, vidéo et collaboration, services sans fil et services hébergés par Cisco. Cette ampleur est importante pour les responsables des actifs, car le chemin d’exécution concerné peut se trouver dans une appliance, un contrôleur, une appliance virtuelle, un utilitaire pour poste terminal ou un service connecté au cloud. Le nom du produit affiché dans une CMDB peut décrire la fonction métier — par exemple un gestionnaire de pare-feu, un contrôleur ou une plateforme de collaboration — alors que le décodeur vulnérable est enfoui dans un environnement d’exécution, une bibliothèque intégrée ou un composant de service. Un inventaire applicatif classique peut donc être exact au niveau du produit tout en ne repérant pas le code qui traite les données compressées.

Le tableau des versions corrigées de Cisco montre également pourquoi il ne faut pas considérer « corrigé » comme un état unique applicable à tout le portefeuille. L’avis identifie des voies de remédiation différentes selon les produits : Duo Network Gateway est associé à la version 3.4.2, Duo Authentication Proxy Local Manager pour Windows à la version 6.8.1, et Catalyst Center à la version 3.4.1. Pour d’autres entrées, le numéro de version reste à déterminer ou la cible de publication est indiquée comme en attente. Ces distinctions imposent à l’organisation de confronter le produit exact, sa forme de déploiement et la branche de versions utilisée au statut communiqué par le fournisseur et à la version corrigée. Installer un paquet Node.js mis à jour sur un hôte de compilation ne prouve pas qu’une image d’appliance, un service intégré ou un produit maintenu séparément a reçu la correction correspondante.

Il existe un autre piège d’inventaire, lié cette fois au flux de données lui-même. Un service peut ne proposer aucune fonctionnalité Brotli visible pour l’utilisateur tout en décodant du Brotli lorsqu’il traite du contenu HTTP ou un autre flux fourni de l’extérieur. Red Hat décrit l’exposition en fonction de la réception, par le décodeur, de données Brotli non fiables et cite notamment les échanges HTTP utilisant Content-Encoding: br, les API de décompression de Node.js et les applications qui appellent directement la bibliothèque Brotli. Cette limite d’analyse est plus utile que la seule présence d’un nom de paquet. Les équipes doivent déterminer si le composant peut recevoir des octets compressés contrôlés par un attaquant, par quel écouteur ou quelle intégration, et si le produit en fonctionnement — pas seulement son manifeste de dépendances — contient le décodeur vulnérable.

C’est aussi la raison pour laquelle une analyse de dépendances sans anomalie peut donner un faux sentiment de sécurité. Un fichier de verrouillage peut signaler une dépendance applicative tout en omettant une bibliothèque compilée dans un binaire fourni par un éditeur. À l’inverse, l’inventaire des paquets d’un hôte peut révéler un paquet Brotli système alors que le service exposé utilise une copie privée intégrée à sa propre image. L’avis de Cisco invite les administrateurs à consulter les fiches de bogues propres à chaque produit et les versions corrigées, tandis que Red Hat rappelle que les produits en couches et les conteneurs peuvent dépendre de paquets de base mis à jour. L’unité concrète de remédiation est donc le produit déployé et son chemin de décodage exécutable. Les mises à jour de Node.js corrigent le composant Node.js là où elles sont installées ; elles ne corrigent pas automatiquement chaque produit Cisco, appliance, conteneur ou service susceptible d’embarquer le même décodeur Brotli.

L’inventaire défensif qui compte

La question utile n’est pas simplement de savoir si Node.js est installé sur un serveur. Il faut identifier les composants capables de décoder des données Brotli, où ils s’exécutent et si les données qu’ils reçoivent peuvent être influencées par une partie non fiable. Le décodeur peut faire partie de Node.js, d’une bibliothèque Brotli utilisée via des liaisons Python, d’un SDK intégré à une application, d’une image de conteneur ou d’une appliance qui n’offre à l’équipe d’exploitation aucune vue évidente au niveau des paquets. Un inventaire logiciel classique peut donc repérer l’application tout en manquant la bibliothèque qui effectue l’analyse concernée.

Commencez par inventorier les environnements d’exécution plutôt que de rechercher un seul nom de paquet. Recensez les installations de Node.js ainsi que les applications qui les intègrent ou en dépendent. Vérifiez les services utilisant la prise en charge de Brotli via des liaisons Python ou d’autres intégrations de langage, et incluez les SDK intégrés dont les dépendances sont maintenues séparément du système d’exploitation hôte. Étendez l’examen aux conteneurs, aux images de base, aux artefacts de compilation et aux appliances fournies par les éditeurs. Pour chaque élément, notez le produit et sa version, la version de l’image ou du micrologiciel, le processus qui charge le décodeur et le responsable des mises à jour. L’objectif est de relier une dépendance abstraite au binaire qui traitera effectivement les données.

La distinction suivante concerne l’exposition. La présence d’un décodeur sur un système ne signifie pas automatiquement qu’il est exposé. Cartographiez les chemins par lesquels chaque service reçoit du contenu compressé : requêtes HTTP publiques, téléversements fournis à distance par des utilisateurs authentifiés, messages provenant de systèmes externes, trafic de proxy, flux de paquets ou d’artefacts et interfaces d’administration. Recensez également les services qui décompressent indirectement des données, comme les passerelles, les brokers, les composants d’API ou les workers applicatifs. Cette cartographie doit décrire le flux de données à un niveau général ; elle ne nécessite ni de tester la faille ni d’envoyer une entrée spécialement conçue. Il suffit d’établir si un attaquant, un client non fiable ou un système en amont peut contrôler le contenu qui atteint le chemin de décodage Brotli.

Un inventaire pratique peut s’articuler autour de quatre questions pour chaque environnement d’exécution ou produit :

  • Qu’est-ce qui décode Brotli ? Identifiez l’environnement d’exécution, la bibliothèque, la liaison, le SDK, le composant d’appliance, la couche de conteneur ou l’implémentation de service concernés.
  • Où cela s’exécute-t-il ? Recensez les hôtes, les conteneurs, les images, les micrologiciels, les environnements de déploiement ainsi que le processus ou le produit qui le charge.
  • Qui peut fournir l’entrée ? Indiquez si les données compressées proviennent du réseau public, d’un partenaire, d’un utilisateur, d’un service interne ou d’une source contrôlée.
  • Quelle version du fournisseur corrige le problème ? Comparez le produit ou le composant observé avec la version corrigée applicable de Node.js, du fournisseur du produit ou du distributeur qui fournit le paquet.

Cette dernière comparaison doit être effectuée au niveau du produit déployé. Une mise à jour de Node.js peut corriger l’environnement d’exécution d’un service tout en laissant intact un équipement distinct, un SDK ou une bibliothèque copiée. À l’inverse, un éditeur peut publier une mise à jour produit intégrant le décodeur corrigé sans modifier la manière dont la dépendance apparaît dans le rapport d’un paquet applicatif. La réponse fiable se trouve dans l’avis de sécurité de l’éditeur et dans la version corrigée du produit concerné, puis dans la confirmation de ce qui est effectivement présent dans l’environnement en fonctionnement.

Les conteneurs exigent une attention particulière, car la mise à jour d’un fichier de verrouillage ou d’un manifeste de paquets ne modifie pas une image déjà construite. Vérifiez la résolution des dépendances utilisée pendant la construction, mais inspectez également l’image produite ou son environnement d’exécution installé, puis redéployez-la. Des images reconstruites à partir d’une couche de base inchangée peuvent réintroduire le même composant vulnérable, même si le code source de l’application n’a pas évolué. Lorsqu’une image corrigée est disponible, remplacez la charge de travail en cours d’exécution au lieu de supposer qu’une construction ultérieure modifiera sur place les conteneurs existants. Conservez une association suffisamment claire entre l’ancienne image et le déploiement pour identifier les instances qui nécessitent encore une intervention.

Le même principe s’applique aux processus et aux équipements conçus pour fonctionner longtemps. Une mise à jour de paquet peut ne pas affecter un processus qui a déjà chargé l’ancienne bibliothèque, et la mise à jour d’un équipement peut nécessiter un redémarrage documenté ou l’activation d’un micrologiciel avant que le composant corrigé soit utilisé. Considérez les exigences de redémarrage comme une partie du dossier de remédiation : indiquez la mise à jour appliquée, l’instance ou l’appareil redémarré, l’heure à laquelle le nouveau processus ou micrologiciel est devenu actif, ainsi que les éléments ayant servi à le confirmer. Si un produit ne fournit pas d’inventaire indépendant et visible de ses paquets, appuyez-vous sur la correspondance entre les versions de l’éditeur et la vérification opérationnelle, plutôt que de déduire qu’il est sûr à partir d’une version applicative sans rapport.

Cet inventaire aide aussi à prioriser le travail sans transformer chaque occurrence en urgence. Donnez la priorité aux décodeurs accessibles depuis des services exposés à Internet ou traitant des contenus fournis à distance, puis aux passerelles partagées, aux équipements critiques et aux charges de travail dont les sorties sont consommées par d’autres systèmes. Pour des outils de développement isolés ou des services qui ne décodent que des données contrôlées, l’évaluation du risque peut être différente, mais ils doivent rester consignés jusqu’à ce que l’équipe responsable les ait comparés aux recommandations applicables de l’éditeur. La cartographie obtenue doit rester une liste de remédiation vivante : chaque entrée comporte un responsable produit, une évaluation de l’exposition, une comparaison avec la version corrigée et une étape de vérification liée au composant qui s’exécute réellement.

Corriger, contenir et vérifier sans deviner

Une réponse défendable commence par le triage, et non par l’hypothèse que tous les systèmes utilisant Node.js sont exposés de la même manière. Classez les décodeurs selon la façon dont les données compressées les atteignent : d’abord les services et passerelles exposés à Internet, puis les applications qui acceptent des téléversements ou des messages de partenaires, et enfin les services internes alimentés par des réseaux moins fiables. La question essentielle n’est pas de savoir si l’inventaire d’un hôte contient quelque part une version vulnérable. Il faut déterminer si cette version est réellement le composant qui décode des données Brotli contrôlées par un attaquant dans un processus ou un produit en fonctionnement.

Pour chaque candidat, consignez l’équipe responsable, le produit et sa version, l’origine de l’environnement d’exécution ou de la bibliothèque, la forme du déploiement et le chemin d’entrée qui déclenche le décodage. Incluez les installations de Node.js, les applications qui embarquent Node.js, les bibliothèques Brotli directes, les liaisons de langage telles que les intégrations Python, les SDK, les conteneurs et les équipements. Un avis de sécurité peut attribuer des statuts différents à différentes versions d’un produit : vérifiez donc la version exacte du produit au lieu de déduire l’exposition d’une affirmation générale sur la bibliothèque sous-jacente. L’avis de Cisco montre pourquoi cette précision est nécessaire : un même problème sous-jacent peut apparaître dans plusieurs produits, avec des états de remédiation différents.

La correction à privilégier est la mise à jour documentée par le fournisseur du composant ou du produit. Si le décodeur est fourni par Node.js, utilisez la version indiquée dans les recommandations de sécurité de Node.js. S’il est intégré à une appliance, un SDK ou une application, suivez les instructions de mise à jour et de déploiement de ce fournisseur. Ne considérez pas le remplacement d’une dépendance de premier niveau comme la preuve que toutes les copies intégrées ont disparu. Un fichier de verrouillage décrit une résolution de build ; l’image déployée peut encore contenir un ancien paquet transitif, du code source intégré, un module natif ou une couche d’exécution distincte. La clôture dépend de l’artefact qui s’exécute.

Le confinement temporaire doit rester ciblé, documenté et réversible. Lorsque les conditions opérationnelles le permettent, réduisez ou suspendez la route précise qui accepte du contenu Brotli non fiable, placez-la derrière un contrôle de filtrage ou une passerelle approuvé, ou retirez du service le composant exposé le temps de préparer la correction. Ces mesures ne remplacent pas l’application du correctif, et les équipes ne doivent pas les concevoir à partir de suppositions sur le comportement de compression d’un produit. Utilisez uniquement les mesures d’atténuation documentées par le fournisseur responsable ou validées par les processus de changement et de sécurité de l’organisation. Notez la date de mise en place du contrôle, la fonction concernée et la personne chargée de le retirer après la remédiation.

Les détails du déploiement font partie de la remédiation. Un processus qui charge son environnement d’exécution ou sa bibliothèque partagée au démarrage peut continuer à utiliser l’ancien décodeur jusqu’à son redémarrage. Une image de conteneur peut être reconstruite correctement alors que des réplicas existants continuent de servir le trafic depuis l’ancienne image. Après une mise à jour progressive, vérifiez que les anciens pods, workers, sidecars et nœuds d’appliance ont été arrêtés ou redémarrés, et que le basculement ou la mise à l’échelle automatique ne réintroduira pas l’artefact remplacé. Pour les systèmes situés hors du pipeline applicatif principal, ajoutez les redémarrages de services ou les reboots d’appliance au dossier de changement, en suivant la procédure documentée du produit.

La vérification doit associer les éléments probants liés au logiciel à ceux qui concernent l’exposition. Identifiez le binaire exact en cours d’exécution, l’environnement d’exécution, le digest de l’image, le manifeste des paquets ou la version fournisseur qui sert le chemin de décodage, puis comparez-le à la version corrigée indiquée dans la fiche CVE applicable, la version de Node.js ou l’avis produit. Confirmez que le processus concerné a redémarré et que les instances attendues exécutent le nouvel artefact ; un dépôt de code source, un cache de paquets ou un résultat de CI ne suffit pas à le prouver. Recherchez de nouveau les copies en double dans les images dormantes, les configurations de sauvegarde, les environnements de test connectés aux flux de production et les appliances gérées par une autre équipe.

Le compte rendu doit préciser ce qui a été observé et ce qui ne l’a pas été : versions affectées trouvées, versions corrigées déployées, routes recevant des entrées compressées non fiables, contrôles temporaires et résultats de supervision pertinents. Les sources citées établissent le contexte de la vulnérabilité et de sa remédiation, mais ne démontrent pas une exploitation généralisée confirmée. Cette distinction permet une réponse proportionnée : donnez la priorité aux décodeurs accessibles et vérifiez rapidement les correctifs, sans affirmer que chaque consommateur de Brotli a été attaqué ni que la remédiation a réussi simplement parce qu’un fichier de dépendances a changé. Le point d’aboutissement est un service en fonctionnement, inventorié, dont le décodeur est rattaché à une version corrigée documentée — et dont le chemin de déploiement ne pourra pas réintroduire silencieusement le composant vulnérable.