Aikido

Node2Shell évolue vers HTTP2Shell. La faille Brotli (CVE-2026-111497) touche de nombreuses bibliothèques et applications utilisant le protocole HTTPS.

Attachez vos ceintures.

Écrit par
Dania Durnas

TL;DR

⚠️ Brotli est une bibliothèque de compression très répandue développée par Google. Mercredi 21 octobre, NodeJS a révélé la vulnérabilité CVE-2026-111497, baptisée « node2shell », qui permet de provoquer une fuite de mémoire ou l’exécution de code arbitraire dans un processus Node.js décompressant des données Brotli contrôlées par un attaquant. Jeudi, l’équipe Python a révélé que des paquets Python étaient également vulnérables à la faille CVE-2026-111497.

Vendredi 23 octobre, il est apparu que cette faille affectait d’autres langages et applications de service majeurs utilisant HTTP, pour lesquels des correctifs ne sont pas encore entièrement disponibles.

Vérifiez si vous décodez des données Brotli en tant que dépendance au sein de vos bibliothèques. Restez à l’affût d’annonces plus détaillées et soyez prêt à effectuer la mise à jour dès que possible. Si aucun correctif n’est disponible pour une bibliothèque ou une application susceptible d’être affectée, nous vous recommandons de désactiver le décodage Brotli jusqu’à ce que des correctifs soient disponibles.

Mise à jour à 16 h 12 (heure du Pacifique) :
des correctifs sont disponibles pour libbrotli, Python, C++, NodeJS, bun, Envoy et d’autres sont à venir. Apache et Nginx ne décodent pas Brotli par défaut.

Mise à jour à 16 h 15 (heure du Pacifique) : OpenAIindique avoir découvert cette vulnérabilité en février. Bien que le problème à l'origine de celle-ci ait été corrigé dans le code source de Brotli à l'époque, on ignorait alors qu'il donnait lieu à une faille de sécurité. Consultez les avis de sécurité d'OpenAI ici:
‍

Qu'est-ce que Brotli ?

Brotli est un algorithme de compression sans perte et un format de données développé par Google. Il permet de réduire la taille des données en vue de leur stockage ou de leur transmission sur Internet. Un logiciel se charge ensuite de les décompresser pour récupérer les données d'origine. Il est largement utilisé pour la compression HTTP afin de compresser des contenus Web tels que le HTML, le CSS et le JavaScript.

Qu'est-ce que la faille CVE-2026-111497 ?

La vulnérabilité CVE-2026-111497 correspond à une écriture hors limites dans le décodeur Brotli de Google, affectant les versions 1.0.3 à 1.2.0 sur toutes les plateformes. Il s'agit de la même faille du décodeur Brotli à l'origine de la vulnérabilité Node2Shell annoncée il y a quelques jours. Un attaquant distant et non authentifié peut envoyer un flux compressé Brotli spécialement conçu pour corrompre la mémoire, divulguer des données sensibles, provoquer le plantage du processus ou potentiellement exécuter du code arbitraire. Cette vulnérabilité présente un score CVSS v4.0 de 9,2 (critique), et Node.js est affecté via sa bibliothèque Brotli intégrée.

Un bug fait que le décodeur Brotli continue d'accepter des octets alors qu'il devrait rejeter les données. Ces octets peuvent provoquer un débordement d'un petit tampon de travail et endommager la mémoire du programme. Un attaquant peut exploiter ces dommages pour contrôler ce qui s'exécute, par exemple son propre code.

OpenAI a découvert cette vulnérabilité en février et l'a signalée comme une faille d'exécution de code à distance non authentifiée fonctionnant dans les deux sens : ainsi, un client malveillant peut prendre le contrôle d'un serveur non corrigé, et un serveur malveillant peut prendre le contrôle d'un client non corrigé qui accepte les réponses compressées.

La cause première du problème a été corrigée dans le code source de Brotli en février, mais elle n'avait pas été identifiée comme un problème de sécurité à l'époque et aucune version intégrant ce correctif n'avait été publiée jusqu'à présent. Cela signifie que chaque projet intégrant Brotli doit publier sa propre mise à jour. 

‍Vous êtesexposé si un environnement quelconque dispose de Brotli 1.2.0 ou d’une version antérieure, ou encore de brotlicffi 1.2.0.x, car les clients HTTP tels que requests, httpx et aiohttp chargent automatiquement ces paquets lorsqu’ils sont présents. Effectuez une mise à jour vers Brotli 1.2.1 ou brotlicffi 1.2.1.0 et recompilez toutes les images de conteneurs qui les intègrent. Au 23 octobre, les bases de données d'alertes ne font pas le lien entre le CVE et l'un ou l'autre de ces paquets PyPI ; par conséquent, pip-audit, Dependabot et Safety ne signaleront pas encore les versions vulnérables.

‍Vouspouvez consulter les données que nous avons recueillies ici, dans la rubrique « Aikido Intel ». 

Quant aux logiciels non concernés, la version standard d'Apache mod_brotli ne décode pas le format Brotli

Comment corriger la vulnérabilité HTTP2Shell CVE-2026-111497

Pour la vulnérabilité CVE-2026-111497, mettez à jour le moteur d'exécution ou la bibliothèque Brotli concernés :

  • Node.js : effectuez la mise à jour vers la version 22.23.4, 24.22.1 ou 26.12.1, ou vers une version plus récente prise en charge dans la branche de versions correspondante.
  • Brotli natif / libbrotli : passez à la version 1.2.1 ou ultérieure. Pour les anciennes séries de versions, utilisez les versions corrigées 1.0.10 ou 1.1.1.
  • Modules Python : mettez à jour Brotli vers la version 1.2.1 ou une version ultérieure, et brotlicffi vers la version 1.2.1.0 ou une version ultérieure, quel que soit leur emplacement d'installation.
  • curl / libcurl : mettez à jour la dépendance Brotli vers la version 1.2.1, une ancienne version corrigée, ou le paquet du fournisseur comportant les correctifs de sécurité. Les copies intégrées ou liées statiquement nécessitent une nouvelle compilation de l'application.
  • Bun : passez à la version 1.4.4 ou ultérieure. Recompilez les exécutables qui intègrent Bun.
  • Envoy : effectuez une mise à jour vers la version 1.40.0, 1.39.3, 1.38.6 ou 1.37.8, ou vers une version plus récente d'une branche prise en charge. La version 1.36.12 inclut également le correctif, mais la branche 1.36 n'est plus prise en charge.
  • Istio : le correctif est inclus dans les versions 1.29.9, 1.30.6 et 1.31.2. Utilisez une version prise en charge plus récente dans la ligne correspondante ; la branche 1.29 est en fin de vie.
  • Packages du système d'exploitation : installez la mise à jour de sécurité fournie par l'éditeur. Il se peut que les éditeurs intègrent le correctif dans des versions antérieures sans modifier le numéro de version en amont.
  • Autres serveurs HTTP, proxys inversés, passerelles API et clients HTTP : mettez à jour le moteur d'exécution concerné ou la bibliothèque Brotli qu'ils utilisent. Lorsque Brotli est intégré au produit, installez la version fournie par l'éditeur du produit qui corrige explicitement cette vulnérabilité CVE. Pour les services gérés, vérifiez auprès du fournisseur que la correction a bien été appliquée.

Mettez à jour les verrous de dépendances, recompilez les applications et les images de conteneurs concernées, redéployez-les et redémarrez les services. Vérifiez que les charges de travail en cours d'exécution utilisent bien les composants corrigés.

‍

Versions corrigées, révisées le 23 octobre 2026
Projet État du correctif Versions corrigées Notes
Node.js Correctif disponible 22.23.4 · 24.22.1 · 26.12.1 Utilisez une ligne de largage compatible.
Bun Correctif disponible 1.4.4 Comprend Brotli 1.2.1.
Envoyé Correctif disponible 1.40.0 · 1.39.3 · 1.38.6 · 1.37.8 La version 1.36.12 inclut également le correctif, mais la version 1.36 n'est plus prise en charge. Utilisez une branche prise en charge.
Istio Correctif disponible 1.29.9 · 1.30.6 · 1.31.2 La version 1.29 est en fin de vie ; passez donc à une version prise en charge.
Google Brotli (en amont) Correctif disponible 1.0.10 · 1.1.1 · 1.2.1 Choisissez la version stable pour votre branche de bibliothèque.

Que faire si vous ne pouvez pas encore effectuer la mise à jour ?

Ces solutions de contournement permettent de réduire les risques pendant que vous préparez la mise à niveau :

  • Applications Python : Lorsque la prise en charge de Brotli est facultative, désinstallez à la fois Brotli et brotlicffi des environnements concernés. Supprimez les dépendances supplémentaires telles que httpx[brotli] et toute autre exigence susceptible de les réinstaller, puis régénérez les verrous de dépendances et recompilez/redémarrez les charges de travail. HTTPX, Requests et urllib3 conservent la prise en charge de gzip et de deflate sans ces paquets optionnels. Cependant, un serveur qui enverrait tout de même des données au format Brotli pourrait générer une réponse illisible ou une erreur d'application ; le repli automatique n'est pas garanti.
    • La désinstallation de ces deux paquets Python et le redémarrage des charges de travail suppriment les chemins de décodage fournis par ces paquets pour les données entrantes et sortantes. Cela ne supprime pas les décodeurs Brotli distincts intégrés à d'autres environnements d'exécution, bibliothèques ou produits.
  • Demandes HTTP entrantes : rejetez les demandes dont l'en-tête `Content-Encoding` contient « br » au niveau du proxy inverse, de l'équilibreur de charge ou du middleware d'application, avant qu'un décodeur vulnérable ne traite le corps de la requête. Effectuez la correspondance avec « br » sans tenir compte de la casse, y compris au sein des listes d'encodages. 
  • Requêtes HTTP sortantes : supprimez « br » de l'en-tête « Accept-Encoding ». Désactivez également le décodage des réponses Brotli ou rejetez les réponses dont l'en-tête « Content-Encoding » contient « br » avant le début du décodage. Veillez à ce que cette vérification ait lieu avant le traitement automatique du corps de la réponse ; il est trop tard de la réaliser une fois que le client a téléchargé et décodé la réponse.

Modifier uniquement l'en-tête « Accept-Encoding » ne suffit pas : un serveur malveillant peut envoyer une réponse au format Brotli, quelle que soit la valeur indiquée par le client, et urllib3 choisit son décodeur en fonction de l'en-tête « Content-Encoding » de la réponse.

Maintenez ces mesures de contrôle en place jusqu’à ce que les composants concernés aient été corrigés et vérifiés. Réévaluez la portée de ces mesures à mesure que les fournisseurs confirment l’existence d’autres composants concernés ou de nouvelles voies d’attaque.

Comment « Aikido » permet de remédier à la vulnérabilité CVE-2026-111497

Aikido Signalez les versions vulnérables de Brotli et de brotlicffi présentes dans vos dépôts, vos images de conteneurs et vos dépendances, y compris lorsqu’elles proviennent de dépendances transitives. Votre tableau de bord indique quels services utilisent encore une version vulnérable ; vous pouvez ainsi commencer par mettre à jour ceux qui interrogent des serveurs externes ou qui acceptent des corps de requêtes compressés. 

Une fois la mise à jour effectuée, Aikido vérifie si le problème a disparu.

La chronologie

Brotli est une bibliothèque de compression très répandue développée par Google. Mercredi 22 octobre, NodeJS a révélé la vulnérabilité CVE-2026-111497, baptisée « node2shell », dans laquelle un processus Node.js décompressant des données Brotli contrôlées par un attaquant peut être amené à divulguer de la mémoire ou à exécuter du code arbitraire. Les utilisateurs étaient exposés si leur application ou une bibliothèque décompressait des données Brotli malveillantes (par exemple, la fonction intégrée `fetch()` ou `body-parser`).

Le lendemain, Python a publié une mise à jour de sécurité corrigeant cette même faille ; les paquets Python étaient également vulnérables à la faille CVE-2026-111497. La faille Brotli pourrait toucher encore davantage de langages et d'applications de service, compte tenu de l'ampleur de l'intégration de cette bibliothèque en aval. Il s'avère qu'OpenAI avait déjà identifié ce problème en février.

Détails techniques de la vulnérabilité CVE-2026-111497

La faille réside dans DecodeBlockTypeAndLength(), qui gère les changements de bloc, c'est-à-dire les points où un flux Brotli change d'arbre de Huffman. Dans les versions vulnérables, la fonction renvoie une valeur booléenne simple, et BROTLI_FALSE peut signifier soit « ce flux est mal formé », soit « j'ai besoin de plus de données d'entrée ». Les appelants ne peuvent pas faire la distinction entre les deux, et dans le cas du chemin rapide, le décodeur ignore complètement la valeur renvoyée.

Un flux généré peut déclarer un seul type de bloc, puis épuiser la longueur de ce bloc, ce qui force un changement qui ne peut aboutir. Le décodeur signale alors soit qu'il a besoin de données supplémentaires pour un flux pourtant complet, soit il poursuit le décodage en conservant l'état du bloc dont il disposait déjà. Cette deuxième option conduit à une écriture hors limites.

Le correctif en amont, commit 0ed4268 de google/brotli, fait en sorte que la fonction renvoie un code d'erreur et ajoute une nouvelle erreur, BROTLI_DECODER_ERROR_FORMAT_BLOCK_SWITCH (-17). Le décodage s'arrête désormais en cas d'erreur de format, tant sur le chemin « safe » que sur le chemin « fast ». OSM a comparé les distributions source de Brotli 1.2.0 et 1.2.1 et a constaté que la version 1.2.1 ne diffère que par l'augmentation du numéro de version et les modifications apportées au décodeur issues de ce commit.

‍

‍

Vulnérabilités Brotli dans des bibliothèques Python (CVE-2026-111497)

La faille Brotli à l'origine de Node2Shell (CVE-2026-111497) affecte Python. Deux paquets PyPI, Brotli et brotlicffi, intègrent le même décodeur Brotli vulnérable que celui fourni avec Node.js. Un avis officiel a été publié sur GitHub. Brotli enregistre 82,8 millions de téléchargements par mois.

Vous êtes concerné si l'un de vos environnements Python utilise Brotli 1.2.0 ou une version antérieure, ou encore brotlicffi 1.2.0.x. Les clients HTTP courants, tels que requests et httpx, chargent automatiquement ces paquets lorsqu'ils sont présents. Certains paquets, comme Scrapy, installent automatiquement Brotli en tant que dépendance, tandis que d'autres nécessitent de le spécifier explicitement. Un attaquant peut accéder au décodeur vulnérable en envoyant une réponse Brotli malveillante à une requête effectuée par votre application, ou en envoyant à votre application un corps de requête compressé avec Brotli. Cela signifie qu’une application peut être exposée sans même importer Brotli nulle part dans son propre code. Il s’agit d’une dépendance transitive courante, veillez donc à vérifier vos systèmes.

Pour résoudre ce problème, effectuez la mise à jour vers les versions corrigées :

  • Brotli -> 1.2.1
  • brotlicffi -> 1.2.1.0

Les notes de mise à jour des deux versions corrigées ne mentionnent pas le CVE. Au 23 octobre, les bases de données d'alertes ne l'associent encore à aucun paquet PyPI ; par conséquent, pip-audit, Dependabot et Safety ne signaleront pas ces versions.

Qui est concerné par la vulnérabilité CVE-2026-111497 dans Python ?

Vous êtes concerné si l'un de vos environnements Python comporte l'un des paquets suivants :

PackageVersions impactéesVersion corrigée
Brotli (PyPI)1.2.0 et versions antérieures1.2.1
brotlicffi (PyPI)1.2.0.x1.2.1.0

Votre code n'a pas besoin d'importer l'un ou l'autre de ces paquets. Ces clients HTTP indiquent « Accept-Encoding: br » et décodent automatiquement les réponses Brotli :

  • urllib3 (et donc requests) lorsque Brotli ou brotlicffi est installé
  • httpx avec l'extension Brotli
  • aiohttp lorsque Brotli est installé
  • Scrapy, ainsi que tout ce qui repose sur les clients mentionnés ci-dessus

Les données de l'attaquant peuvent parvenir au décodeur par deux voies :

  • Requêtes sortantes. Votre application récupère une réponse Brotli provenant d'un serveur contrôlé par un pirate, par exemple via un webhook, un aperçu d'URL, un robot d'indexation ou une fonctionnalité de type « récupérer cette URL ».
  • Requêtes entrantes. Votre framework ou votre middleware décode le corps d'une requête envoyé avec l'en-tête `Content-Encoding: br`, ce qui correspond à l'équivalent Python du cas « Express 5 » dans Node.js.

Comment corriger la vulnérabilité CVE-2026-111497 en Python

La solution consiste à mettre à jour un paquet, ce qui se fait en quatre étapes :

  1. Mettez à jour le paquet que vous avez installé à l'aide de la commande `pip install -U "Brotli>=1.2.1"` ou `pip install -U "brotlicffi>=1.2.1.0"`. Si vous utilisez un fichier de verrouillage avec Poetry, uv ou pip-tools, mettez à jour la contrainte et régénérez le fichier de verrouillage.
  2. Recompilez vos images de conteneurs ainsi que toutes les bibliothèques « wheel » qui intègrent l'un ou l'autre de ces paquets. Une image compilée à partir d'une version vulnérable reste vulnérable tant que vous ne l'avez pas recompilée.
  3. Vérifiez tous les environnements que vous utilisez, y compris les ordinateurs portables, les runners d'intégration continue, les serveurs et les conteneurs. De nombreux projets intègrent Brotli via un module supplémentaire de client HTTP ; examinez donc l'intégralité de votre arborescence de dépendances.
  4. Pour l'instant, fiez-vous à une vérification manuelle. pip-audit, Dependabot et Safety ne signaleront pas ce problème tant que les bases de données d'alertes n'auront pas établi de correspondance entre le CVE et les paquets PyPI.

Si vos bibliothèques Python pour Brotli proviennent d'un paquet de distribution Linux plutôt que de PyPI, le correctif est fourni par votre distribution ; veuillez donc également consulter son avis de sécurité.

Qu'est-ce que la vulnérabilité Brotli de Python (CVE-2026-111497) ?

La vulnérabilité Brotli dans Python fait référence à la faille CVE-2026-111497, une faille du décodeur Brotli connue sous le nom de « Node2Shell », car elle affecte les paquets Python disponibles sur PyPI. La fiche CVE associe les CWE-252 (valeur de retour non vérifiée) et CWE-787 (écriture hors limites).

Quelle est la gravité de la vulnérabilité CVE-2026-111497 pour Python, et fait-elle l'objet d'exploits ?

La fiche CVE attribue à cette faille un score CVSS 4.0 de 9,2, et Node.js la classe dans la catégorie « gravité élevée ». OSM a compilé les versions 1.2.0 et 1.2.1 de Brotli avec AddressSanitizer et a fait passer un flux spécialement conçu par les deux versions. La version 1.2.0 a consommé l'intégralité du flux d'environ 23 Mo et n'a cessé de signaler qu'elle avait besoin de plus de données, que le flux arrive en un seul bloc ou par morceaux aussi petits qu'un octet. La version 1.2.1 a rejeté le flux à chaque fois avec l'erreur -17.

OSM n'a pas cherché à exploiter la corruption de mémoire ni l'exécution de code dans l'extension Python. Le code du décodeur est le même que celui que les chercheurs ont exploité contre une version non modifiée de Node.js 24.22.0, comme Imperva et d’autres l’ont signalé. Concernant Node.js, The Hacker News n’a signalé aucune exploitation en milieu réel au 22 octobre.

Considérez tout de même cela comme urgent. Le bogue est une faille de sécurité liée à la gestion de la mémoire dans un composant qui traite des données réseau non fiables, et la correction consiste en une simple mise à jour de version. Les services qui appellent des serveurs externes ou acceptent des corps de requêtes compressés doivent être traités en priorité.

Comment vérifier si votre application Python est exposée

  1. Check installed versions with pip show Brotli brotlicffi in each environment, and with docker run --rm <image> pip show Brotli brotlicffi for each container image.
  2. Identifiez ce qui entraîne l'installation de ces paquets. Exécutez la commande `pipdeptree -r -p Brotli` pour voir quelles dépendances l'exigent, puis recherchez-le dans vos fichiers de verrouillage à l'aide de `grep -i brotli poetry.lock uv.lock requirements*.txt`.
  3. Répertoriez les appels HTTP sortants destinés à des serveurs que vous ne contrôlez pas, ainsi que tous les points de terminaison qui décodent les corps de requête contenant l'en-tête « Content-Encoding: br ».
  4. Commencez par mettre à niveau les services correspondant à l'étape 3, puis passez aux autres.

Si vous reproduisez le bug depuis Python, la fonction `brotli.decompress()` lève une exception générique de type `brotli.error : decoder failed` pour n'importe quelle erreur ; vous ne pouvez donc pas identifier le code d'erreur précis qui a été déclenché. Un objet `Decompressor()` alimenté de manière incrémentielle par le flux spécialement conçu ne terminera jamais son traitement dans la version 1.2.0.

FAQ

‍Quelles versions corrigent la vulnérabilité CVE-2026-111497 dans Python ?

Brotli 1.2.1 et brotlicffi 1.2.1.0, ainsi que toutes les versions plus récentes.

Dois-je importer Brotli dans mon code pour que cela m'affecte ?

Il suffit d'installer un seul paquet. urllib3, requests, httpx et aiohttp utilisent automatiquement Brotli ou brotlicffi dès lors que l'un ou l'autre est présent, et décodent les réponses Brotli provenant de n'importe quel serveur auquel votre application s'adresse.

Est-ce que pip-audit ou Dependabot signalera cela ?

Pas encore. Au 23 octobre, ni la base de données CVE, ni l'OSV, ni la base de données des avis de sécurité de GitHub ne répertorient ces deux paquets PyPI. OSM est en train de soumettre des entrées PYSEC ainsi qu'un mappage des paquets PyPI pour l'avis de sécurité de GitHub, afin que les outils puissent les prendre en compte.

Existe-t-il une solution de contournement ?

La désinstallation de Brotli et de brotlicffi supprime le décodeur vulnérable, et les clients HTTP reviennent alors aux formats gzip et deflate. Le rejet des requêtes encodées en Brotli au niveau de la périphérie réduit l'exposition entrante, mais ne protège pas contre les réponses Brotli récupérées par votre application.

Partager :

https://www.aikido.dev/blog/python-packages-vulnerable-node2shell-brotli-cve-2026-111497

Vérifier la présence de vulnérabilités

Commencer maintenant
4,7/5
Fatigué des faux positifs ?
Essayez Aikido, comme 100 000 autres.
Commencez maintenant
Obtenez une démonstration personnalisée

Approuvé par plus de 100 000 équipes

Réserver maintenant
Analysez votre application à la recherche d'IDORs et de chemins d'attaque réels

Approuvé par plus de 100 000 équipes

Démarrer l'analyse
Découvrez comment le pentest IA teste votre application

Approuvé par plus de 100 000 équipes

Démarrer les tests

Sécurisez vos systèmes dès aujourd'hui,
rapidement et gratuitement.

Sécurisez votre code, votre cloud et votre runtime au sein d'un système centralisé.
Connectez un dépôt pour découvrir ce que les agents de raisonnement trouvent dans votre base de code.

Aucune carte bancaire requise | Résultats de l'analyse en 32 secondes.
Utilisé par plus de 150 000 organisations