Node2Shell : un corps compressé en Brotli suffit à corrompre la mémoire de Node.js
Publié le
Le 21 octobre 2026, Node.js publie une mise à jour de sécurité pour toutes ses branches maintenues. Elle corrige notamment CVE-2026-111497, surnommée Node2Shell : une écriture hors limites dans la bibliothèque Brotli de Google, que Node.js embarque pour la décompression. Une donnée Brotli forgée peut faire planter le processus, lui faire divulguer sa mémoire ou y exécuter du code. Une preuve de concept publique existe.
Corrigé : Node.js 22.23.4, 24.22.1 et 26.12.1 (21 octobre 2026)
D’où vient la faille Node2Shell ?
Le décodeur Brotli traite un changement de bloc invalide comme un simple manque de données, au lieu d’une erreur de format. En mode flux, il continue alors d’ajouter des octets dans un tampon interne de huit octets, et finit par écrire au-delà. La mémoire du processus Node.js est corrompue.
La faille est dans Brotli lui-même, pas dans le code de Node.js. Tout logiciel qui embarque le même décodeur est concerné : Bun, les paquets Python `Brotli` et `brotlicffi`, .NET, Envoy et Istio, brotli4j, ainsi que des paquets de distributions Linux.
Mon API Node.js est-elle exposée ?
Si elle tourne sur Express 5 ou body-parser 2, très probablement : ces versions décompressent par défaut les corps de requête envoyés avec `Content-Encoding: br`. N’importe quel client peut donc envoyer une donnée Brotli forgée à votre API.
Sont aussi exposés le code qui passe des données non fiables à `zlib.brotliDecompress()` ou `zlib.createBrotliDecompress()`, et le `fetch()` intégré, qui décompresse automatiquement les réponses Brotli : un serveur malveillant ou compromis que votre application interroge peut alors l’attaquer. En revanche, un serveur HTTP Node.js nu ne décode pas seul les corps compressés.
La faille est-elle exploitée ?
Au 26 octobre 2026, Rapid7 n’a connaissance d’aucune exploitation dans la nature, et la faille ne figure pas au catalogue des failles exploitées de la CISA. Mais des chercheurs d’Imperva ont démontré une exécution de code sur l’image Linux arm64 officielle de Node.js 24.22.0, même si leur exploit ne réussit pas à chaque tentative.
Node.js classe la faille en sévérité élevée ; Google, qui gère Brotli, la note 9.2 en CVSS v4. Avec une preuve de concept publique, la fenêtre avant les premières attaques réelles se compte en jours.
Que faire dès aujourd’hui ?
Passer à Node.js 22.23.4, 24.22.1 ou 26.12.1, puis redémarrer les processus et reconstruire les images de conteneur : un processus déjà lancé garde l’ancien décodeur jusqu’à son arrêt. Les branches en fin de vie (25.x, 23.x, 20.x et antérieures) ne recevront pas de correctif.
Si votre API n’a pas besoin de recevoir des corps compressés, désactivez-les : avec body-parser, l’option `inflate: false` fait refuser ces requêtes avec un code 415.
Vérifiez aussi vos autres composants qui embarquent Brotli (proxy Envoy, services Python ou .NET) : la mise à jour de Node.js ne les corrige pas.
Qui est concerné ?
- Node.js 22.x avant 22.23.4, 24.x avant 24.22.1, 26.x avant 26.12.1
- Branches en fin de vie (25.x, 23.x, 20.x et antérieures) : vulnérables, sans correctif
- Express 5 et body-parser 2 avec la décompression par défaut (`inflate: true`)
- Google Brotli 1.0.3 à 1.0.9, 1.1.0 et 1.2.0, et les logiciels qui l’embarquent (Bun, Envoy, Istio, .NET, Python, brotli4j)
- Preuve de concept publique ; pas d’exploitation connue dans la nature au 26 octobre 2026
Comment AtriShield bloque-t-il la faille ?
Patch virtuel (Business et Enterprise) : la faille est neutralisée à l’entrée de votre serveur, sans modifier votre application et sans attendre la fenêtre de maintenance. Des métadonnées de sécurité remontent à votre console.
- ✓Patch virtuel à l’entrée : les requêtes dont le corps est compressé en Brotli (`Content-Encoding: br`) sont refusées avant d’atteindre Node.js. Les navigateurs n’envoient pas de corps compressés : la règle ne gêne pas vos visiteurs, et une exception reste possible route par route.
- ✓La protection couvre toutes les applications Node.js derrière le serveur (Express, API, back-office), sans toucher à leur code ni les redéployer.
- ✓Ce qu’un filtre à l’entrée ne peut pas faire : protéger un `fetch()` sortant vers un serveur malveillant, ou la décompression de fichiers déjà stockés. Pour ces cas, seule la mise à jour de Node.js corrige.
- ✓Les tentatives sont journalisées et remontent à votre console : vous voyez qui envoie des corps Brotli à votre API, et quand.
Sources
- Rapid7 - CVE-2026-111497: Critical out-of-bounds write in the Node.js Brotli decoder
- Akamai - Inside Node2Shell: A Closer Look at CVE-2026-111497
- The Hacker News - Researchers Demonstrate Node2Shell RCE Exploit on Node.js Build Using Crafted Brotli Data
Analyse publiée par Atrilya Solutions à partir de publications de sécurité publiques. Les liens ci-dessus renvoient aux sources d’origine.