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 :
| Logiciel | Plateforme | Exposition | Correctif |
|---|---|---|---|
| Git for Windows | Windows, desktop | Le 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 |
| curl | Linux, macOS, Windows | Les 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 brotli | Linux, Windows | Les 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 |
| Bun | Linux, macOS | Le runtime JavaScript alternatif embarquait une copie vulnérable de Brotli. | Bun 1.4.4 |
| Envoy | Linux | Le 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, DuckDB | Multi-plateforme | Ces 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.
| Composant | Versions vulnérables | Version corrigée |
|---|---|---|
| Node.js 22.x (LTS) | < 22.23.4 | 22.23.4 |
| Node.js 24.x (LTS) | < 24.22.1 | 24.22.1 |
| Node.js 26.x (Current) | < 26.12.1 | 26.12.1 |
Python brotli (PyPI) | ≤ 1.2.0 | 1.2.1 (publiée le 22 oct.) |
Python brotlicffi (PyPI) | ≤ 1.2.0.x | 1.2.1.0 (publiée le 23 oct.) |
| Bun | < 1.4.4 | 1.4.4 |
| Bibliothèque C Brotli (Google) | 1.0.3 – 1.2.0 | 1.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.
FiveM
Minecraft
Rust
RedM
Hytale