Brotli2Shell, RCE du décodeur Brotli CVE-2026-111497
CentralCSP Team ·
Dernière mise à jour:
Le 21 octobre 2026, le même jour que PHP2Shell, Node.js a publié 22.23.4, 24.22.1 et 26.12.1 pour corriger CVE-2026-111497, une écriture hors limites dans le décodeur Brotli de Google. Google la note 9,2 en CVSS 4.0. Le bug n'est pas dans Node.js : il est dans la bibliothèque C qui décompresse les données Brotli, et cette bibliothèque est embarquée dans Node.js, Bun, des paquets Python, .NET, Envoy, Istio, PHP pour Windows et bien d'autres. En une semaine, elle a hérité de quatre surnoms : Node2Shell, HTTP2Shell, Python2Shell et Brotli2Shell.
Des chercheurs ont démontré une exécution de code à distance sur des builds officiels et non modifiés de Node.js. Le 26 octobre, ELLIO a signalé le premier trafic d'exploitation qu'il observait dans la nature.
La réponse courte, selon ce que vous faites tourner :
- Node.js 22, 24 ou 26 : mettez à jour dès maintenant vers 22.23.4, 24.22.1 ou 26.12.1.
- Node.js 18, 20, 23 ou 25 : aucune version corrigée. Passez à une branche supportée.
- Python avec
brotlioubrotlicffiinstallé : mettez à jour versbrotli1.2.1 oubrotlicffi1.2.1.0. - Bun, .NET, Envoy, Istio : mettez à jour vers les versions corrigées du tableau ci-dessous.
- Tout autre logiciel qui décompresse du Brotli : vérifiez s'il utilise la
libbrotlidu système ou embarque sa propre copie, et mettez à jour en conséquence.
Cet article résume ce qu'est Brotli2Shell, qui est exposé, le déroulé de la semaine, comment le repérer dans votre stack et quoi faire maintenant. Il reste au niveau du quoi et du pourquoi : aucun détail d'exploitation.
Qu'est-ce que Brotli2Shell, CVE-2026-111497
Brotli est le format de compression conçu par Google pour le web. Les navigateurs l'annoncent dans Accept-Encoding: br, et la plupart des CDN et serveurs web l'utilisent pour compresser les pages. CVE-2026-111497 se trouve dans le décodeur, le code qui retransforme les données Brotli en octets d'origine.
Selon l'avis de Node.js, un changement de bloc (block switch) invalide dans le flux compressé était signalé comme un besoin de données supplémentaires (« need more input ») au lieu d'une erreur de format. Le décodeur en flux continuait alors d'écrire les données d'entrée dans un tampon interne de huit octets, au-delà de sa fin. Node.js indique que cela peut provoquer un plantage, la divulgation de mémoire du processus ou une exécution de code à distance.
| CVE | CVE-2026-111497 |
| Composant | Décodeur C de Google Brotli (c/dec/decode.c), et tout produit qui l'embarque ou le lie |
| Type | Écriture hors limites, du plantage à l'exécution de code à distance |
| Sévérité | Critique, 9,2 en CVSS 4.0 selon la notation de Google. Node.js la classe High, Microsoft la note 8,1 en CVSS 3.1 pour .NET |
| Surnoms | Node2Shell, HTTP2Shell, Python2Shell, Broccoli2Shell, Brotli2Shell. HTTP2Shell n'a rien à voir avec HTTP/2 |
| Signalée par | Khai Tran et Sylvie Mayer, OpenAI Codex Security |
| Affecté | Brotli 1.0.3 à 1.0.9, 1.1.0 et 1.2.0 |
| Corrigé | Brotli 1.0.10, 1.1.1 et 1.2.1 |
Le correctif upstream est ancien. Google l'a intégré au dépôt Brotli le 27 février 2026 (commit 0ed4268) sans le signaler comme correctif de sécurité, et la plupart des projets en aval ne l'ont donc pas repris. C'est pourquoi les versions corrigées sont arrivées produit par produit au cours de la semaine suivante, et pourquoi certaines manquent encore.
Qui est exposé
Un décodeur vulnérable ne pose problème que lorsqu'il décompresse des données contrôlées par un attaquant. Beaucoup d'applications le font sans jamais mentionner Brotli dans leur code, parce que les clients HTTP et les parseurs de corps de requête décompressent automatiquement. JFrog et Phoenix Security regroupent les chemins en trois familles.
Requêtes entrantes. Un serveur qui décompresse les corps de requête envoyés avec Content-Encoding: br. Express 5.0.0 à 5.3.0 et body-parser 2.0.0 à 2.3.0 le font par défaut (Imperva). Le middleware de décompression des requêtes d'ASP.NET Core le fait quand il est activé, et Envoy et Istio le font quand le filtre de décompression Brotli est configuré. Imperva précise qu'un serveur HTTP Node.js nu ne décode pas de lui-même les corps Brotli entrants.
Requêtes sortantes. Un service qui récupère une URL et décompresse la réponse. Le fetch() de Node.js et de Bun décode automatiquement les réponses Brotli, tout comme les clients Python urllib3, requests, httpx et aiohttp quand le paquet brotli ou brotlicffi est installé, y compris via des extras comme urllib3[brotli]. Phoenix Security cite comme cibles typiques les webhooks, les aperçus de liens, les crawlers et les agents de navigation IA : tout ce qui récupère une URL qu'un utilisateur peut choisir.
Fichiers. Brotli se cache aussi dans des formats de fichiers : pages Parquet, images JPEG XL, polices WOFF2, certains PDF et archives. JFrog a atteint le décodeur via FFmpeg avec un fichier JPEG XL, via Apache Arrow avec un fichier Parquet, et a fait planter ClickHouse avec une seule requête compressée.
Certaines stacks courantes sont hors du chemin entrant par défaut. .NET laisse la décompression Brotli désactivée tant que l'application ne l'active pas, et .NET Framework n'est pas affecté. Phoenix Security note que nginx et Apache compressent les réponses en Brotli mais ne décodent pas les corps de requête Brotli par défaut, et la compression utilise l'encodeur, pas le décodeur.
Le déroulé de la semaine
- 27 février. Google intègre le correctif upstream, sans avis de sécurité.
- Début octobre. Envoy et Istio publient des versions corrigées sans nommer la faille (Tenable).
- 21 octobre. Node.js publie ses mises à jour de sécurité d'octobre avec le correctif Brotli et neuf autres CVE. Google publie Brotli 1.0.10, 1.1.1 et 1.2.1. Vercel déploie des règles WAF pour les requêtes entrantes (Vercel).
- 22 octobre. La NVD publie la fiche CVE et Brotli 1.2.1 arrive sur PyPI. Imperva publie sa recherche sous le nom Node2Shell : il a exécuté du code sur le build officiel Node.js 24.22.0 Linux arm64, et n'a pas publié l'exploit.
- 23 octobre.
brotlicffi1.2.1.0 sort, le nom HTTP2Shell apparaît, et l'évaluation de la CISA classe l'exploitation à « none » et l'impact technique à « total » (Phoenix Security). - 25 octobre. Microsoft publie des mises à jour .NET hors cycle (dotnet/announcements#494) et Cloudflare déploie une version d'urgence de son WAF pour les corps de requête entrants.
- 26 octobre. PHP publie de nouveaux builds Windows embarquant Brotli 1.2.1, cinq jours après sa propre version PHP2Shell. ELLIO signale du trafic d'exploitation dans la nature : un unique corps de requête de 23 Mo conçu pour Node.js 24.22.0 sur x86-64, qui reprend les preuves de concept publiques. ELLIO indique aussi avoir reproduit l'exécution de code sur des builds officiels x86-64, notamment des applications Express 5.3.0 et Koa 3, avec les réglages par défaut.
Au 26 octobre, Tenable n'avait pas confirmé de son côté l'exploitation signalée par ELLIO, et CVE-2026-111497 ne figurait pas au catalogue Known Exploited Vulnerabilities de la CISA. Wiz indique que 91 % des environnements cloud qu'il observe contiennent des ressources vulnérables à CVE-2026-111497.
Quelles versions sont affectées et corrigées
| Produit | Affecté | Corrigé dans |
|---|---|---|
| Google Brotli (bibliothèque C) | 1.0.3 à 1.0.9, 1.1.0, 1.2.0 | 1.0.10, 1.1.1, 1.2.1 |
| Node.js 22, 24, 26 | Inférieur à 22.23.4, 24.22.1, 26.12.1 | 22.23.4, 24.22.1, 26.12.1 |
| Node.js 18, 20, 23, 25 | Toutes | Aucune version, fin de vie |
| Bun | 1.0.21 à 1.4.3 | 1.4.4 |
Python brotli | 1.0.3 à 1.2.0 | 1.2.1 |
Python brotlicffi | 1.0.3 à 1.2.0.x | 1.2.1.0 |
| .NET 8, 9, 10 | Inférieur à 8.0.33, 9.0.22, 10.0.14 | 8.0.33, 9.0.22, 10.0.14 |
| Envoy | Jusqu'à 1.36.11, 1.37.7, 1.38.5, 1.39.2 | 1.36.12, 1.37.8, 1.38.6, 1.39.3, 1.40.0 |
| Istio | Inférieur à 1.29.9, 1.30.6, 1.31.2 | 1.29.9, 1.30.6, 1.31.2 |
| PHP pour Windows | Builds embarquant Brotli 1.0.3 à 1.2.0 | 8.2.35-1, 8.3.36-1, 8.4.27-1, 8.5.12-1 |
Extension PHP brotli | Inférieur à 0.21.1 | 0.21.1 |
Java brotli4j | Inférieur à 1.24.0 | 1.24.0 |
Go andybalholm/brotli | Inférieur à 1.2.7 | 1.2.7, plantage uniquement |
Sources : Tenable, Wiz et Phoenix Security. Le tracker Broccoli2Shell indique que Chromium, Firefox et le module nginx ngx_brotli étaient corrigés avant son lancement. Gardez vos navigateurs à jour comme d'habitude.
Copies embarquées, quand mettre à jour Brotli ne suffit pas
Brotli est petit, et beaucoup de projets copient ses sources dans leur propre build au lieu de lier la bibliothèque du système. Mettre à jour la libbrotli de votre distribution corrige les programmes qui la lient, une fois redémarrés. Cela ne change rien pour une copie compilée dans un autre binaire ou dans un wheel Python.
Au 26 octobre, Phoenix Security listait ceux-ci comme encore non corrigés : les wheels de Pillow, pyarrow, curl-cffi et pycurl, DuckDB, ClickHouse, les builds d'Apache Arrow avec Brotli embarqué, libjxl, 7-Zip-zstd, p7zip, NanaZip et Git for Windows. JFrog prévient que le numéro de version upstream seul ne suffit pas toujours (« the upstream version number alone is not always sufficient ») : un éditeur peut rétroporter le correctif sans changer la chaîne de version de Brotli, et une copie embarquée peut rester vulnérable alors que la bibliothèque du système est corrigée.
Est-ce que je l'utilise ? Vérifier si un site tourne sous Node.js
Node.js est le runtime le plus exposé : il embarque le décodeur, décode par défaut les réponses de fetch() et fait tourner Express, le parseur de corps de requête le plus répandu. La plupart du Node.js sur le web arrive par un framework : Express, Next.js, Nuxt, NestJS, Koa, Fastify, Remix, Astro ou SvelteKit en mode serveur.
Pour vérifier un site depuis l'extérieur, collez son URL dans le Technology Checker gratuit. Il signale Node.js quand le serveur le révèle, ainsi que les frameworks qui l'impliquent, comme Express ou Next.js. L'indice classique est un header X-Powered-By: Express, qui est aussi une fuite d'information à supprimer.
Un scan depuis l'extérieur montre ce qui sert vos pages. Il ne voit pas le chemin sortant : le worker qui appelle les webhooks, le crawler, le script Python qui interroge l'API d'un partenaire. Ceux-là se vérifient depuis l'intérieur :
node -v # runtime Node.js
bun --version # runtime Bun
pip show brotli brotlicffi # paquets Python
dotnet --list-runtimes # runtimes .NET
dpkg -l 'libbrotli*' # bibliothèque système Debian et Ubuntu
rpm -qa 'brotli*' # bibliothèque système Red Hat, Rocky, AlmaLancez-les dans chaque image de conteneur, pas seulement sur l'hôte : un conteneur embarque son propre Node.js et ses propres paquets Python. JFrog publie un scanner open source qui cherche les chemins de décompression Brotli dans le JavaScript, le Python et les binaires ELF. Une correspondance indique où regarder, pas que le chemin est atteignable.
Suis-je vulnérable à Brotli2Shell ?
Deux questions tranchent : le composant exécute-t-il un décodeur affecté, et un attaquant peut-il lui envoyer des données Brotli ?
- Recensez chaque runtime et service capable de décoder du Brotli. Node.js, Bun, les environnements Python avec
brotlioubrotlicffi, .NET avec la décompression Brotli activée, Envoy et Istio avec le décompresseur Brotli, et tout outil de la liste des copies embarquées ci-dessus. - Relevez la version dans chaque environnement avec les commandes ci-dessus, et comparez-la au tableau.
- Identifiez les chemins d'entrée. Un endpoint public qui parse les corps de requête, un service qui récupère des URL choisies par les utilisateurs, ou une chaîne qui traite des fichiers envoyés. Commencez par tout ce qui est joignable depuis internet.
Une version hors de la plage affectée écarte la CVE pour ce composant. Une version dans la plage, avec un chemin d'entrée contrôlé par un attaquant, signifie que le service est exposé jusqu'à ce qu'il soit corrigé.
Que faire maintenant
Nos recommandations, de la plus urgente à la moins urgente :
- Corrigez Node.js et Bun maintenant. Mettez à jour vers Node.js 22.23.4, 24.22.1 ou 26.12.1, ou Bun 1.4.4. Reconstruisez les images de conteneur sur une base corrigée et redéployez-les, et redémarrez les processus de longue durée : l'ancien décodeur reste en mémoire jusqu'à la fin du processus. Migrez les serveurs sous Node.js 18, 20, 23 ou 25 vers une branche supportée.
- Mettez à jour les autres runtimes et bibliothèques. Python
brotli1.2.1 oubrotlicffi1.2.1.0, .NET 8.0.33, 9.0.22 ou 10.0.14, Envoy et Istio vers les versions corrigées, PHP pour Windows vers les builds du 26 octobre. Mettez ensuite à jour lalibbrotlidu système et redémarrez ce qui la lie. - Bloquez les corps de requête Brotli là où vous ne pouvez pas corriger aujourd'hui. Rejetez les requêtes avec
Content-Encoding: brau niveau du load balancer ou du reverse proxy, et désactivez le décompresseur Brotli dans Envoy et Istio. Cloudflare, Vercel, Imperva et Azure ont déployé des règles WAF, mais ces règles ne couvrent que les corps de requête (Tenable). - Coupez aussi le chemin sortant. Un WAF ne voit pas les réponses que vos services récupèrent. Désactivez le décodage Brotli dans vos clients HTTP, ou désinstallez les paquets Python
brotlietbrotlicffijusqu'à ce que les versions corrigées soient en place. Tenable note que retirerbrdeAccept-Encodingne suffit pas, car un serveur malveillant peut envoyer du Brotli quand même. - Surveillez les plantages et les comportements inhabituels. Une tentative ratée fait souvent planter le processus : un pic de redémarrages de workers Node.js ou Python est un signal. Guettez les processus enfants inattendus lancés par l'utilisateur du service, les connexions sortantes depuis les workers web et les corps de requête compressés très volumineux. ELLIO a publié un indicateur de compromission dans son rapport.
Tenir un inventaire avant la prochaine faille
Brotli2Shell est la troisième fois cette année que la première question est « où le faisons-nous tourner ? ». C'était Next.js en août et PHP la semaine dernière. Cette fois, la réponse est plus difficile, car le code vulnérable est une bibliothèque cachée dans des runtimes et des paquets, pas un produit que vous avez choisi.
Pour les logiciels côté serveur, le Technology Checker gratuit donne une vue rapide depuis l'extérieur, et les commandes ci-dessus couvrent l'intérieur. Pour le code qui s'exécute dans le navigateur de vos visiteurs, CentralCSP tient l'inventaire à jour : il liste les scripts chargés par chaque page, identifie la bibliothèque et la version derrière chacun, et vous alerte quand une nouvelle CVE touche une version que vous servez. L'inventaire est décrit dans Technologies, et la page de la fonctionnalité supply chain en fait le tour. Commencez gratuitement avec CentralCSP pour voir vos propres sites.
FAQ
Qu'est-ce que Brotli2Shell ?
Brotli2Shell est l'un des surnoms de CVE-2026-111497, une écriture hors limites dans le décodeur Brotli de Google, divulguée le 21 octobre 2026. Node2Shell, HTTP2Shell, Python2Shell et Broccoli2Shell désignent la même vulnérabilité.
Node2Shell et HTTP2Shell sont-elles des failles différentes ?
Non. Les deux noms désignent CVE-2026-111497. Node2Shell vient de la première démonstration contre Node.js, et HTTP2Shell de sa portée sur l'ensemble des stacks HTTP. HTTP2Shell n'a aucun rapport avec le protocole HTTP/2.
Quelles versions de Node.js corrigent CVE-2026-111497 ?
Node.js 22.23.4, 24.22.1 et 26.12.1. Node.js 18, 20, 23 et 25 sont en fin de vie et ne reçoivent pas de correctif.
Mon application Express est-elle vulnérable ?
Express 5.0.0 à 5.3.0 décode par défaut les corps de requête Brotli : une application Express 5 sur un Node.js non corrigé est donc exposée aux requêtes entrantes. Le correctif est dans Node.js, pas dans Express : mettez à jour Node.js.
Un site qui sert des pages compressées en Brotli est-il vulnérable ?
Servir du Brotli utilise l'encodeur, et la faille est dans le décodeur. Un serveur est exposé quand il décompresse des données Brotli qu'il reçoit, dans des corps de requête, des réponses récupérées ou des fichiers.
Les navigateurs sont-ils affectés ?
Les navigateurs décodent du Brotli à chaque chargement de page. Le tracker Broccoli2Shell indique que Chromium et Firefox étaient corrigés avant son lancement, sans préciser de versions. Gardez vos navigateurs à jour comme d'habitude.
Brotli2Shell est-il exploité dans la nature ?
Le 26 octobre, ELLIO a signalé du trafic d'exploitation visant Node.js 24.22.0 sur x86-64. Tenable ne l'avait pas confirmé de son côté, et la CVE ne figurait pas au catalogue KEV de la CISA ce jour-là. Imperva et ELLIO ont tous deux démontré une exécution de code sur des builds officiels de Node.js. Considérez tout service non corrigé qui décode des données Brotli non fiables comme une cible.
Mon site est-il protégé s'il est derrière Cloudflare ?
Seulement pour les requêtes entrantes. Les règles WAF de Cloudflare inspectent les corps de requête : elles ne protègent pas un service qui récupère une réponse Brotli malveillante sur un autre serveur. Un attaquant qui atteint directement votre serveur d'origine les contourne aussi. Corrigez quoi qu'il en soit.
Articles liés
- PHP2Shell, RCE PHP CVE-2026-109618 et CVE-2026-109619
- Failles Next.js en 2026, la RCE AVIF et la version à installer
- Quelle technologie utilise ce site, et est-elle encore à jour
- Comment détecter les bibliothèques JavaScript vulnérables sur un site en production
Sources
- Node.js, mises à jour de sécurité d'octobre 2026
- Google Brotli, commit 0ed4268
- Tenable, FAQ Brotli2Shell
- JFrog Security Research, Brotli2Shell: beyond Node2Shell and HTTP2Shell
- Imperva, Node2Shell: from Brotli data to remote code execution
- ELLIO, Node2Shell, RCE sur des builds Node.js standard
- Wiz, Broccoli2Shell, la faille critique du décodeur Brotli
- Phoenix Security, HTTP2Shell, de Node2Shell à toutes les stacks HTTP
- Tracker Broccoli2Shell
- Vercel, avis de sécurité Node.js
- Microsoft, mises à jour de sécurité .NET
- PHP, builds Windows avec Brotli 1.2.1
- JFrog, scanner Brotli2Shell