Offre Durée limitée : -10% sur tout le site* avec le code WELCOME10

Node2Shell : faille RCE critique dans Node.js et Python via le décodeur Brotli

Publié le 24 octobre 2026 9 min de lecture 6 sections

Le 21 octobre 2026, l'équipe Node.js a publié un correctif d'urgence pour CVE-2026-111497, un bug critique dans le décodeur Brotli intégré au runtime. Deux jours plus tard, le 23 octobre, la même faille a été confirmée dans les paquets Python brotli et brotlicffi, utilisés par les principales bibliothèques HTTP de l'écosystème Python. Score CVSS v4.0 : 9.2 sur 10 (critique). D'abord baptisée Node2Shell, la vulnérabilité a été rebaptisée HTTP2Shell pour refléter son rayon d'action réel : tout serveur web, script d'automatisation ou application qui décompresse des données Brotli est exposé à une exécution de code arbitraire à distance. Que vous administriez un VPS Linux, un VPS Windows ou un serveur dédié, la mise à jour est impérative.

Source : Node.js, "October 2026 Security Releases", 21 octobre 2026. Confirmation Python : Aikido Security, 23 octobre 2026.

Le bug CVE-2026-111497 : dépassement de tampon dans le décodeur Brotli

Brotli est un algorithme de compression développé par Google, intégré nativement dans Node.js (module node:zlib) et disponible en Python via les packages brotli et brotlicffi. Il est largement utilisé pour compresser les réponses HTTP (en-tête Content-Encoding: br) sur les serveurs web : navigateurs, clients HTTP, reverse proxies et API le supportent par défaut. Brotli a progressivement remplacé gzip dans les échanges HTTP/1.1 et HTTP/2 grâce à de meilleurs taux de compression pour les ressources texte.

Le bug se situe dans la bibliothèque C de Google Brotli (versions 1.0.3 à 1.2.0), dans la fonction DecodeBlockTypeAndLength du fichier c/dec/decode.c. Lorsqu'un flux Brotli compressé déclare un seul type de bloc puis tente une transition de bloc en cours de décompression, le décodeur devrait rejeter le flux comme invalide. Au lieu de cela, il confond cette transition impossible avec une demande de données supplémentaires (la valeur de retour booléenne ne distingue pas "flux malformé" de "besoin d'entrées") et continue à écrire dans un tampon interne de huit octets, au-delà de ses limites. Le résultat est une écriture hors limites (CWE-787, out-of-bounds write) qui corrompt la mémoire RAM du processus.

Les conséquences possibles pour un attaquant distant :

  • Crash de l'application (déni de service)
  • Fuite de données en mémoire RAM (adresses, clés, tokens)
  • Exécution de code arbitraire (RCE) sans authentification préalable

Le correctif ajoute un nouveau code d'erreur BROTLI_DECODER_ERROR_FORMAT_BLOCK_SWITCH (-17) qui interrompt proprement le décodage lorsque le flux est invalide, au lieu de continuer l'écriture dans le tampon. Les versions de la bibliothèque C Brotli corrigées sont 1.0.10, 1.1.1 et 1.2.1.

De Node2Shell à HTTP2Shell : Node.js et Python touchés

La faille a d'abord été signalée dans Node.js par OpenAI Codex Security (Khai Tran et Sylvie Mayer), découverte en février 2026 et divulguée de manière coordonnée le 21 octobre. Tout appel à zlib.brotliDecompress() ou à la décompression automatique Brotli via fetch() est un vecteur d'attaque. Un serveur web Node.js qui accepte des requêtes HTTP avec Content-Encoding: br, ou un client qui récupère des réponses compressées en Brotli, peut être exploité par un flux malveillant.

Le 23 octobre, la communauté sécurité a confirmé que les packages Python brotli (plus de 82 millions de téléchargements par mois sur PyPI) et brotlicffi embarquent le même code C vulnérable. Les bibliothèques HTTP suivantes activent automatiquement la décompression Brotli lorsque l'un de ces packages est installé, sans import explicite dans le code du script ou de l'application :

  • urllib3 et donc Requests (la bibliothèque HTTP la plus utilisée en Python)
  • aiohttp (requêtes HTTP asynchrones)
  • httpx (avec l'extra brotli)
  • Scrapy (framework de scraping)

Les vecteurs d'attaque sont doubles. En sortie : votre application récupère une ressource depuis un serveur contrôlé par l'attaquant, qui renvoie un flux Brotli malformé. En entrée : votre serveur web accepte un corps de requête compressé en Brotli (Express.js avec body-parser décompresse par défaut), et un client malveillant envoie un flux crafté. Dans les deux cas, aucune authentification n'est nécessaire : il suffit qu'un script ou un service décompresse le flux pour déclencher la corruption mémoire.

Au-delà de Node.js et Python : d'autres logiciels touchés

Le bug se trouve dans la bibliothèque C de Google Brotli, pas dans un runtime spécifique. Tout logiciel qui embarque ou lie une copie de cette bibliothèque entre les versions 1.0.3 et 1.2.0 est potentiellement vulnérable. Voici les cas confirmés qui peuvent concerner un administrateur de serveur ou un poste de travail :

LogicielPlateformeExpositionCorrectif
Git for WindowsWindows, desktopLe client Git embarque curl compilé avec Brotli. Les opérations git clone, git fetch et git pull via HTTPS décompressent automatiquement les réponses Brotli du serveur. Git 2.56.0.windows.3 embarque encore Brotli 1.2.0 vulnérable.En attente
curlLinux, macOS, WindowsLes versions de curl compilées avec le support Brotli décompressent les réponses lorsque le flag --compressed est utilisé, quel que soit le système d'exploitation.Mettre à jour la libbrotli du système
Extension PHP brotliLinux, WindowsLes applications PHP qui utilisent l'extension PECL brotli pour compresser ou décompresser des données sont exposées. Les CMS et frameworks PHP qui intègrent cette extension doivent la mettre à jour.En attente
BunLinux, macOSLe runtime JavaScript alternatif embarquait une copie vulnérable de Brotli.Bun 1.4.4
EnvoyLinuxLe reverse proxy et load balancer décompresse les flux Brotli entrants.1.40.0, 1.39.3, 1.38.6, 1.37.8
Apache Arrow, ClickHouse, DuckDBMulti-plateformeCes moteurs de bases de données et d'analyse embarquent Brotli pour la compression de colonnes.En attente ou en cours

Sur un VPS ou un serveur dédié, vérifiez chaque composant installé. Un serveur web Node.js peut être corrigé, mais si une copie de curl, un script PHP ou un outil de bases de données embarque une version vulnérable de Brotli, votre machine virtuelle reste exposée. Sous Windows, Git for Windows est un vecteur particulièrement discret : les opérations Git quotidiennes (git pull, git fetch) déclenchent la décompression Brotli sans action explicite de l'utilisateur.

Versions corrigées

Mettez à jour vers les versions suivantes depuis un terminal SSH. Les commandes de vérification sont détaillées dans la section suivante.

ComposantVersions vulnérablesVersion corrigée
Node.js 22.x (LTS)< 22.23.422.23.4
Node.js 24.x (LTS)< 24.22.124.22.1
Node.js 26.x (Current)< 26.12.126.12.1
Python brotli (PyPI)≤ 1.2.01.2.1 (publiée le 22 oct.)
Python brotlicffi (PyPI)≤ 1.2.0.x1.2.1.0 (publiée le 23 oct.)
Bun< 1.4.41.4.4
Bibliothèque C Brotli (Google)1.0.3 – 1.2.01.0.10 / 1.1.1 / 1.2.1

Comment vérifier et corriger votre serveur

Connectez-vous en SSH (shell distant) à votre VPS ou serveur dédié. Avant d'appliquer les mises à jour, effectuez un backup de vos données critiques et de vos fichiers de configuration. Pour configurer des sauvegardes automatiques avec rsync, consultez notre guide dédié.

Node.js

Vérifiez la version installée depuis le terminal :

node --version

Si la version est inférieure à 22.23.4, 24.22.1 ou 26.12.1 selon votre branche, mettez à jour via le gestionnaire de versions Node ou le dépôt NodeSource. Sur les distributions Ubuntu et Debian :

# Via nvm (si installé)
nvm install 22.23.4
nvm use 22.23.4

# Via le dépôt NodeSource (Ubuntu/Debian)
sudo apt update && sudo apt upgrade nodejs

Redémarrez ensuite vos applications Node.js. Si vous utilisez un service systemd, relancez-le avec sudo systemctl restart mon-app.service. Un reboot complet du système d'exploitation n'est pas nécessaire : seuls les processus Node.js doivent être redémarrés.

Python

Vérifiez si les packages Brotli sont présents dans vos environnements virtuels Python :

pip list 2>/dev/null | grep -i brotli
pip3 list 2>/dev/null | grep -i brotli

Pour un audit automatisé de toutes les dépendances vulnérables, utilisez pip-audit depuis le terminal :

pip install pip-audit
pip-audit

pip-audit détecte automatiquement les packages brotli et brotlicffi vulnérables (entrées PYSEC-2026-4322 et GHSA-9v8h-qqgm-4m35 dans la base GitHub Advisory).

Si Brotli ou brotlicffi apparaît avec une version inférieure à 1.2.1, mettez à jour :

pip install --upgrade Brotli brotlicffi

Si votre script ou application Python n'a pas besoin de la décompression Brotli (la plupart des scripts d'administration serveur n'en ont pas besoin), vous pouvez aussi désinstaller le package. urllib3 et Requests fonctionnent sans Brotli : ils utiliseront gzip et deflate, qui restent supportés par tous les serveurs HTTP.

pip uninstall Brotli brotlicffi

Pensez à vérifier chaque environnement virtuel Python sur votre serveur, ainsi que les images Docker qui embarquent des applications Python. Reconstruisez les conteneurs avec docker compose up -d --build après avoir mis à jour les packages dans le Dockerfile.

Configurer le firewall comme mesure de mitigation

En attendant la mise à jour de tous les composants, vous pouvez configurer votre reverse proxy (Nginx, Caddy) pour rejeter les requêtes entrantes avec Content-Encoding: br. Cela bloque le vecteur d'attaque entrant sans toucher au code applicatif. Exemple de configuration Nginx :

# Dans le bloc server ou location
if ($http_content_encoding ~* "br") {
    return 415;
}

Cette mesure ne protège pas contre le vecteur sortant (votre application qui récupère un flux Brotli malveillant depuis un serveur externe). Pour une protection complète, la mise à jour des runtimes reste indispensable. Configurez votre firewall nftables ou UFW pour restreindre les connexions sortantes aux seules adresses IP et ports nécessaires.

Pourquoi les administrateurs de VPS sont directement concernés

Un VPS (machine virtuelle) qui héberge une API Node.js (Express, Fastify, NestJS), un CMS headless (Strapi, Ghost, KeystoneJS), un bot Discord en Python, un scraper Scrapy, un reverse proxy Node.js ou tout serveur web qui accepte ou émet des requêtes HTTP compressées en Brotli est un vecteur d'exploitation potentiel. Sur un serveur dédié qui héberge plusieurs services, la surface d'attaque se multiplie : le serveur web, les scripts d'automatisation Python, les opérations Git, curl et les outils de bases de données peuvent chacun embarquer une copie vulnérable de la bibliothèque.

Les serveurs de jeu FiveM, Minecraft et Rust ne sont pas directement touchés par cette faille (leurs protocoles réseau n'utilisent pas Brotli), mais les panels d'administration web (txAdmin, Pterodactyl) et les scripts d'automatisation Python qui tournent sur le même VPS peuvent l'être. Si votre hébergeur ne gère pas les mises à jour du système d'exploitation et des runtimes à votre place (ce qui est le cas sur un VPS non managé), c'est à vous de les appliquer.

La surface d'attaque est d'autant plus large que la décompression Brotli est activée automatiquement par de nombreuses bibliothèques HTTP, sans que le développeur l'ait explicitement demandée. Le release Node.js d'octobre 2026 corrige au total 11 vulnérabilités, dont des bugs DNS qui permettent de contourner la validation de noms de domaine (CVE-2026-105482). Vérifiez la présence des packages vulnérables sur chaque serveur que vous administrez, appliquez les mises à jour et sécurisez l'accès SSH de vos machines. Pour automatiser les mises à jour de sécurité sur les distributions Ubuntu et Debian, configurez unattended-upgrades. Pour renforcer la sécurité globale de votre infrastructure, consultez notre guide pour sécuriser un serveur dédié et surveiller les ressources (RAM, CPU) de votre VPS.

FAQ

Mon VPS est-il vulnérable à CVE-2026-111497 ?

Connectez-vous en SSH (shell distant) à votre VPS et exécutez node --version dans le terminal pour vérifier la version de Node.js. Si elle est inférieure à 22.23.4, 24.22.1 ou 26.12.1 selon votre branche, votre machine virtuelle est vulnérable. Pour Python, exécutez pip list | grep -i brotli : si le package Brotli ou brotlicffi est installé en version inférieure à 1.2.1, mettez-le à jour ou désinstallez-le.

La faille touche-t-elle les serveurs de jeu FiveM, Minecraft ou Rust ?

Les protocoles réseau de FiveM, Minecraft et Rust n'utilisent pas la compression Brotli. Ces serveurs de jeu ne sont pas directement vulnérables. En revanche, les outils qui tournent sur le même VPS (panel txAdmin, Pterodactyl, scripts Python, bots Discord Node.js) peuvent être exposés si leur runtime n'est pas à jour. Vérifiez tous les composants installés sur votre serveur.

Puis-je désinstaller Brotli au lieu de le mettre à jour ?

Oui, si votre script ou application Python n'a pas besoin de la décompression Brotli. Les bibliothèques urllib3, Requests, aiohttp et httpx fonctionnent sans le package Brotli installé : elles utiliseront gzip et deflate pour la compression HTTP. Exécutez pip uninstall Brotli brotlicffi depuis le terminal pour supprimer le package de votre environnement virtuel Python.

Comment la faille est-elle exploitée concrètement ?

L'attaquant envoie un flux Brotli malformé via une requête ou une réponse HTTP compressée. Le décodeur Brotli vulnérable ne rejette pas le flux invalide et écrit au-delà des limites d'un tampon interne de huit octets. Cette écriture hors limites corrompt la RAM du processus et peut permettre l'exécution de code arbitraire à distance, sans aucune authentification préalable.

Faut-il aussi mettre à jour les images Docker qui contiennent Node.js ou Python ?

Oui. Chaque image Docker embarque sa propre copie du runtime et de ses dépendances. Reconstruisez vos images avec une version corrigée de Node.js (22.23.4, 24.22.1 ou 26.12.1) ou mettez à jour les packages Python Brotli dans le Dockerfile. Relancez ensuite les conteneurs avec docker compose up -d --build pour appliquer le correctif.

Git for Windows est-il touché par cette faille ?

Oui. Git for Windows embarque curl compilé avec le support Brotli. Les opérations git clone, git fetch et git pull via HTTPS décompressent automatiquement les réponses Brotli du serveur distant. La version Git 2.56.0.windows.3 (22 octobre 2026) embarque encore Brotli 1.2.0 vulnérable. Sous Windows, attendez la prochaine mise à jour de Git ou utilisez Git via WSL avec une libbrotli à jour.

Mon VPS Windows est-il concerné ?

Oui, si vous hébergez des applications Node.js ou Python sur votre VPS Windows. Le bug touche le même code C de Brotli quel que soit le système d'exploitation. Vérifiez les versions de Node.js et des packages Python installés. Sous Windows, vérifiez aussi Git for Windows qui embarque une copie vulnérable de la bibliothèque Brotli.

L'extension PHP brotli est-elle vulnérable ?

Oui. L'extension PECL brotli pour PHP embarque le même code C vulnérable de Google Brotli. Si votre serveur web utilise cette extension pour compresser les réponses HTTP ou si un script PHP décompresse des données Brotli, mettez à jour l'extension dès qu'un correctif est disponible. Les applications PHP qui n'utilisent pas cette extension ne sont pas concernées.

Faut-il redémarrer le serveur après la mise à jour ?

Un reboot complet du système d'exploitation n'est pas nécessaire. Redémarrez uniquement les processus qui utilisent Brotli : vos applications Node.js (via systemctl restart), vos scripts Python et vos conteneurs Docker. La libbrotli partagée du système est rechargée au prochain démarrage de chaque processus qui l'utilise.

Comment configurer un firewall pour atténuer le risque ?

Configurez votre reverse proxy (Nginx, Caddy) pour rejeter les requêtes entrantes avec l'en-tête Content-Encoding: br. Cela bloque le vecteur d'attaque entrant (un client malveillant qui envoie un flux Brotli crafté à votre serveur web). Cette mesure ne protège pas contre le vecteur sortant : si votre application récupère des données depuis un serveur externe malveillant, seule la mise à jour du runtime corrige le bug.

Comment détecter automatiquement les packages Python vulnérables ?

Installez pip-audit (pip install pip-audit) et lancez-le dans chaque environnement virtuel Python de votre serveur. L'outil interroge la base GitHub Advisory et signale les packages Brotli et brotlicffi vulnérables avec leurs identifiants PYSEC-2026-4322 et GHSA-9v8h-qqgm-4m35. Pour un audit continu, intégrez pip-audit dans votre pipeline de déploiement.