Ce qui s'est passé
Le 21 octobre 2026, Node.js a publié les versions 22.23.4, 24.22.1 et 26.12.1 pour corriger la vulnérabilité CVE-2026-111497, aussitôt surnommée Node2Shell. Elle est notée 9,2 sur 10 (CVSS 4.0) dans l'enregistrement CVE de Google ; Node.js, de son côté, la classe « élevée ».
La faille n'est pas dans le code de Node.js, mais dans Brotli, l'algorithme de compression créé par Google qui compresse une grande partie du trafic web (en-tête Content-Encoding: br). Node.js en embarque sa propre copie, comme une multitude d'autres logiciels.
Le mécanisme tient en une phrase. Face à un flux volontairement malformé, le décodeur Brotli (versions 1.0.3 à 1.2.0) prend une erreur de format pour un simple manque de données, et continue d'écrire dans un tampon interne de 8 octets… au-delà de ses limites. Les octets en trop écrasent la mémoire voisine.
Qui l'a découverte, et comment
L'enregistrement CVE crédite Khai Tran et Sylvie Mayer, de l'équipe OpenAI Codex Security, qui s'appuie sur des agents d'IA pour auditer du code. L'exploitabilité a ensuite été démontrée par Ron Masas (Imperva), et l'impact sur l'écosystème Python analysé par Aikido.
L'histoire a un côté ironique : la correction existait dans le code source de Brotli depuis le 27 février 2026. Elle n'avait pas été identifiée comme un correctif de sécurité, et aucune version publiée ne l'incluait. Pendant près de huit mois, tous les logiciels qui embarquaient Brotli sont restés vulnérables sans le savoir.
- 14 octobre : Node.js annonce une publication de sécurité de sévérité élevée.
- 21 octobre : versions corrigées de Node.js en matinée, puis Brotli 1.0.10, 1.1.1 et 1.2.1 en soirée. Un premier dépôt GitHub consacré à la faille apparaît environ cinq heures après les correctifs.
- 22 octobre : publication de la CVE et correctifs des paquets Python. Imperva obtient une exécution de code sur l'image Docker officielle Node.js 24.22.0 (Linux ARM64), après plusieurs tentatives.
- 23 octobre : avis de sécurité du proxy Envoy ; OpenAI annonce publiquement sa découverte.
- 25 octobre : Wiz publie ses chiffres d'exposition.
Comment elle s'est répandue
Pas encore de vague d'attaques : ce qui s'est propagé, c'est la liste des logiciels touchés. D'où les surnoms successifs, Node2Shell puis HTTP2Shell et Broccoli2Shell.
- Node.js 22, 24 et 26 avant correctif, et les versions en fin de vie 20, 23 et 25, qui ne seront pas corrigées. Les applications Electron et les exécutables Node autonomes embarquent leur propre moteur.
- Bun avant la version 1.4.4.
- Python : les paquets Brotli et brotlicffi, que requests, urllib3, httpx, aiohttp ou Scrapy utilisent automatiquement dès qu'ils sont installés, même sans import explicite.
- Go : la bibliothèque andybalholm/brotli avant la version 1.2.7.
- Infrastructure cloud : le proxy Envoy, le maillage de services Istio, curl et libcurl selon la version de Brotli liée, et les distributions Linux qui utilisent la bibliothèque Brotli du système.
Selon Wiz, 91 % des environnements cloud analysés contiennent des ressources vulnérables, et 82 % exposent publiquement des instances Node.js. Bonne nouvelle en revanche : Apache et NGINX ne décompressent pas le Brotli entrant dans leur configuration par défaut.
Au 23 octobre, aucune exploitation n'était confirmée dans la nature, et la faille ne figurait pas au catalogue des vulnérabilités exploitées de la CISA. Des preuves de concept publiques font toutefois déjà planter des serveurs.
Les risques encourus
- Déni de service. C'est la conséquence la plus simple à obtenir : un seul flux malformé peut faire tomber le processus Node.js. Même une tentative ratée d'exécution de code peut couper votre service.
- Fuite de mémoire. Vercel signale une divulgation de mémoire sur les versions non corrigées : secrets, données d'autres requêtes.
- Exécution de code. Démontrée en laboratoire sur une image officielle, pas encore fiable, mais les exploits progressent vite. Le code s'exécute alors avec les droits du service Node.js : ouverture d'un shell, minage, vol des secrets et des jetons cloud du conteneur.
Pourquoi c'est dangereux : la porte est souvent déjà ouverte
Votre application n'a pas besoin d'utiliser Brotli volontairement pour être exposée. Trois chemins mènent au décodeur :
- Les requêtes entrantes. Express 5 et body-parser 2.x décompressent automatiquement les corps de requête envoyés avec
Content-Encoding: br. N'importe quel client peut donc adresser le flux piégé à votre API. - Les réponses que vous recevez.
fetch()décompresse automatiquement les réponses Brotli. Un serveur malveillant ou compromis (une API tierce, un webhook, une URL fournie par un utilisateur) peut attaquer votre application par sa réponse. - Le code direct. Tout appel à
zlib.brotliDecompress()oucreateBrotliDecompress()sur des données non fiables.
Certains chercheurs estiment que l'impact réel se limitera au déni de service. Pour une API en production, c'est déjà un incident sérieux. Traitez la faille comme critique.
Les correctifs disponibles
- Node.js 22 : 22.23.4 · Node.js 24 : 24.22.1 · Node.js 26 : 26.12.1, ou une version ultérieure de la même branche.
- Node.js 20, 23 et 25 : fin de vie, aucun correctif. Migrez vers une version LTS, 22 ou 24.
- Bun : 1.4.4.
- Brotli (bibliothèque C) : 1.0.10, 1.1.1 ou 1.2.1.
- Python : Brotli 1.2.1 et brotlicffi 1.2.1.0.
- Go : andybalholm/brotli 1.2.7.
- Envoy : 1.37.8, 1.38.6, 1.39.3 ou 1.40.0 · Istio : 1.29.9, 1.30.6 ou 1.31.2.
Comment les appliquer, étape par étape
- 1. Inventorier. Lancez
node --versionsur les serveurs, les postes de build et les runners CI, etdocker run --rm <image> node --versionpour chaque image. Repérez les points d'entrée avecnpm ls express body-parseret une recherche debrotliDecompressdans votre code et vos dépendances. - 2. Mettre à jour Node.js. Avec nvm :
nvm install 24.22.1 && nvm alias default 24.22.1. Sous Debian ou Ubuntu avec le dépôt NodeSource :sudo apt update && sudo apt install --only-upgrade nodejs. Avec Docker : passez à une étiquette corrigée, par exemplenode:24.22.1-alpineou plus récente, reconstruisez avecdocker build --pullpuis redéployez. Certains gestionnaires de paquets ont livré la correction avec plusieurs heures de retard : vérifiez la version réellement installée. - 3. Mettre à jour le reste de la chaîne. Python :
pip install -U "brotli>=1.2.1" "brotlicffi>=1.2.1.0". Bun :bun upgrade. Go :go get github.com/andybalholm/brotli@v1.2.7. Système : les mises à jour de sécurité de votre distribution pour libbrotli. - 4. Redémarrer et redéployer.
pm2 restart allousystemctl restartpour vos services, redéploiement des fonctions serverless, recompilation des applications Electron et des exécutables autonomes. - 5. Vérifier que la version corrigée est bien celle qui tourne en production, pas seulement celle du poste de développement.
Si vous ne pouvez pas mettre à jour immédiatement :
- rejetez
Content-Encoding: brà l'entrée, sur votre proxy. Avec NGINX :if ($http_content_encoding ~* "br") { return 415; }; - dans Express, désactivez la décompression des corps avec
express.json({ inflate: false }), en sachant que cela refuse aussi le gzip : testez vos clients ; - limitez les destinations des
fetch()côté serveur et rejetez les réponses Brotli venant d'hôtes que vous ne maîtrisez pas. Retirerbrde l'en-têteAccept-Encodingne suffit pas : un serveur malveillant peut l'ignorer ; - exécutez Node.js avec un utilisateur non privilégié, sortez les secrets des variables d'environnement quand c'est possible, et surveillez les plantages suivis du lancement d'un shell.
Ce que nous en retenons
Vos dépendances invisibles sont votre surface d'attaque. Personne n'installe Brotli volontairement, et pourtant il est partout. Un inventaire des composants logiciels (SBOM) permet de répondre en quelques minutes à la question « sommes-nous exposés ? ».
Un correctif peut dormir des mois. Celui-ci attendait depuis février. Suivre les versions de ses dépendances compte autant que suivre les annonces de sécurité.
Les IA cherchent les failles, des deux côtés. La même semaine, PHP2Shell et Node2Shell ont été trouvées par des chercheurs assistés d'IA. Le rythme des correctifs doit suivre.
Vos API tournent sur Node.js, vos traitements de données sur Python, et vous ne savez pas quelles versions sont réellement en production ? Nous inventorions vos dépendances, mettons à jour vos images et vos pipelines CI/CD, et installons une veille qui vous prévient avant la prochaine alerte. Parlez-nous de votre projet.
Sources : Node.js, enregistrement CVE de Google, Wiz, Aikido, Imperva, Sysdig, SecureLayer7 (avis publiés du 21 au 25 octobre 2026).