Une vulnérabilité « shell » est une faille de logiciel permettant l'exécution de code à distance (RCE). Le suffixe « -Shell » s'est imposé avec Log4Shell (CVE-2021-44228) en décembre 2021. React2Shell a remplacé le 4 par un 2 en décembre 2025, et la communauté des chercheurs a suivi cette convention de nommage pour baptiser les failles découvertes en octobre. PHP a révélé PHP2Shell le 21 octobre 2026, et Node.js a publié ses correctifs pour Node2Shell le même jour. Chacune de ces failles aurait pu, à elle seule, constituer l'événement de l'année en matière de sécurité.
Si votre pile utilise PHP, Node.js, React ou Java, il y avait probablement au moins l'un de ces langages dedans si vous l'utilisiez il y a quelques années.
Qu'est-ce que toutes les vulnérabilités du shell ont en commun ?
Toutes les vulnérabilités de type « shell » se situent en aval de l’application, dans une bibliothèque de journalisation, un framework d’interface utilisateur, un moteur d’exécution de langage ou un décodeur de compression. Dans l’exploit démontré et signalé pour PHP contre Apache avec mod_php, PHP2Shell se déclenche alors que PHP est encore en train de traiter la requête entrante, avant même qu’une seule ligne de votre application ne soit exécutée. React2Shell a touché des applications qui n’avaient jamais défini leur propre fonction serveur. Une équipe peut écrire un code soigné et minutieusement relu tout en restant exposée, car la partie vulnérable n’est pas celle qu’elle a écrite.
Dans toutes ces vulnérabilités de type « shell », les données d'entrée contrôlées par l'attaquant ont pu atteindre du code qui les traitait comme étant sûres. Log4j a interprété du texte qu'il était uniquement censé enregistrer, et React a reconstruit des objets à partir de charges utiles « Flight » sans vérifier leur structure. Express 5 et body-parser 2.x décodent les corps de requête Brotli provenant de n'importe quel client qui en envoie un, souvent avant même qu'un contrôle d'authentification ne soit effectué.
Aucune de ces vulnérabilités ne nécessite que l'attaquant se connecte. Une seule requête spécialement conçue suffit pour exécuter du code sur le serveur. Node2Shell présentait également une deuxième voie d'exploitation, puisqu'une réponse spécialement conçue à une requête émise par votre application peut également la déclencher.
La plupart des équipes héritent également de ce composant vulnérable sans jamais l’avoir choisi. Log4j est généralement présent en tant que dépendance d’une dépendance, tandis que Node.js et PHP sont intégrés dans des images de conteneurs qui sont rarement reconstruites, sauf en cas de nécessité absolue. Brotli va encore plus loin, puisque son décodeur est intégré dans des environnements d’exécution et des proxys tels que Node.js, Bun, .NET et Envoy. En Python, les clients HTTP populaires tels que requests et httpx chargent automatiquement Brotli lorsqu’il est présent, et certains paquets, comme Scrapy, l’installent en tant que dépendance ; une application peut donc être exposée sans que Brotli soit importé nulle part dans son propre code.
Aperçu des vulnérabilités du shell
Vulnérabilités de type « shell » liées à une corruption de mémoire (PHP2Shell et Node2Shell)
PHP2Shell est intégré au code C du moteur de PHP lui-même, tandis que Node2Shell est intégré à Brotli, une bibliothèque de compression en C que Node.js et de nombreuses autres plateformes intègrent dans leur propre code. Ces deux failles ont été rendues publiques grâce à des recherches menées à l'aide de l'IA, même si, dans le cas de PHP2Shell, les modèles ont mené à bien un travail que des humains avaient commencé des années auparavant.
PHP2Shell (CVE-2026-109618 et CVE-2026-109619)
Un processus PHP traite les requêtes les unes après les autres, en réservant de la mémoire pour chacune d’entre elles et en la libérant une fois la requête terminée. Les deux failles PHP2Shell forcent PHP à atteindre ses limites de mémoire à un moment précis ; ainsi, une requête s’interrompt en cours d’exécution et laisse un pointeur vers de la mémoire qui a déjà été libérée. La requête suivante de l’attaquant remplit cette mémoire avec des données spécialement conçues, et PHP les interprète comme l’un de ses propres objets internes.
La vulnérabilité CVE-2026-109618 se déclenche pendant que PHP prépare les données de la requête, tandis que la vulnérabilité CVE-2026-109619 exploite l'état conservé par le worker entre deux requêtes ; la progression du téléchargement de la session, activée par défaut, constitue l'une des voies d'exploitation confirmées.
Le code vulnérable remonte à la version PHP 5.4, sortie en 2012, et son origine s'explique par un bug lié à la limite de mémoire découvert par Stefan Esser en 2004. Un audit réalisé en 2024 a mis en évidence le même problème, mais personne n’a pu prouver qu’il était exploitable, et la correction a donc été mise en attente. En août 2026, Ryan Austin, un chercheur californien, a utilisé l’IA pour réussir là où l’audit avait échoué et a transformé ce bug en une exécution de code fonctionnelle.
Des informations ont fuité avant la divulgation prévue; les correctifs PHP ont été publiés avec un jour d'avance, le 21 octobre, et Cloudflare a signalé que l'exploitation avait commencé le jour même. Notre avis de sécurité « PHP2Shell » répertorie les versions concernées, les mesures d'atténuation et la procédure d'application des correctifs ; nous le mettons à jour au fur et à mesure que les recommandations évoluent.
Node2Shell (CVE-2026-111497)
Node.js intègre sa propre version de Brotli, la bibliothèque de compression de Google, et Node2Shell est un bug du décodeur de Brotli : des données compressées spécialement conçues le poussent à écrire au-delà de la fin d'un tampon mémoire.
L'équipe de sécurité Codex d'OpenAI a signalé qu'il s'agissait d'une vulnérabilité permettant l'exécution de code à distance dans les deux sens : ainsi, un client malveillant peut prendre le contrôle d'un serveur non corrigé, et un serveur malveillant peut prendre le contrôle d'un client non corrigé qui accepte les réponses compressées. Dans Node.js, Express 5 et body-parser 2.x décodent automatiquement les corps de requêtes Brotli, et la fonction `fetch()` fait de même pour les réponses.
Les chercheurs ont réussi à exécuter du code sur une image Node.js 24.22.0 non modifiée, mais leur exploit n'a pas fonctionné à chaque tentative ; dans la pratique, un plantage ou une fuite de mémoire est donc le scénario le plus probable. Notre avis de sécurité « Node2Shell » répertorie les versions corrigées pour chaque branche de publication.
HTTP2Shell et Broccoli2Shell

Le décodeur Brotli est intégré à bien d’autres projets que Node.js, ce qui explique pourquoi ce même bug a reçu des noms tels que HTTP2Shell et Broccoli2Shell (HTTP2Shell et Broccoli2Shell font référence au même bug Brotli présent dans Node.js). Des correctifs sont désormais disponibles pour Node.js, Bun, Envoy, Istio, .NET, Python, Java (brotli4j), libbrotli, Ubuntu et plusieurs distributions Linux, tandis que SUSE et les dépôts standard de Red Hat Enterprise Linux ne disposent pas encore de correctif.
Les responsables de Brotli avaient déjà corrigé ce bogue dans leur code source le 27 février, mais personne ne l’avait identifié comme un problème de sécurité ; il n’a donc été intégré à une version officielle qu’à partir du 21 octobre. Les projets intégrant Brotli dans leurs versions publiées ont ainsi vu toutes leurs copies en circulation rester vulnérables pendant huit mois, et chacun a dû déployer sa propre mise à jour selon son calendrier. La rubrique « Sécurité » du site Aikido suit l’évolution de chacune d’entre elles dans un tableau en temps réel sur l’état des correctifs.
Vulnérabilités Logic 2Shell (Log4Shell et React2Shell)
Les vulnérabilités Log4Shell et React2Shell ont été découvertes dans Java et JavaScript, des langages qui gèrent la mémoire à votre place, ce qui évite toute corruption de données. Ces failles résident dans la conception d’une fonctionnalité, qui permettait à une entrée fournie par un attaquant de déterminer le code exécuté par le serveur. Elles ont toutes deux obtenu la note parfaite de 10,0 au CVSS 🏆.
Log4Shell (CVE-2021-44228)
Log4j est une bibliothèque de journalisation Java. Log4j 2 prenait en charge les recherches (lookups), c'est-à-dire des espaces réservés écrits sous la forme ${...} qu'il remplaçait par une valeur réelle, telle qu'une variable d'environnement, chaque fois qu'il écrivait un message. Il procédait ainsi pour tout texte qu'il enregistrait, y compris celui provenant des utilisateurs. L'un de ces types de recherche, ${jndi}, ordonne à Java de récupérer un objet depuis un serveur d'annuaire. Ainsi, un attaquant qui aurait glissé une recherche ${jndi} pointant vers son propre serveur dans l'en-tête d'un navigateur ou dans un message de chat de Minecraft aurait pu amener Log4j à télécharger une classe Java et à l'exécuter.
La plupart des applications enregistrent certaines saisies des utilisateurs, ce qui faisait de presque tous les champs de texte sur Internet une porte d'entrée potentielle. Log4j avait également tendance à se trouver à plusieurs niveaux de profondeur dans les arborescences de dépendances, si bien que de nombreuses équipes ont passé les premiers jours simplement à déterminer si elles l'utilisaient. Les chercheurs ont ensuite découvert des failles dans le premier correctif (2.15.0) et dans celui qui a suivi, et les équipes ont continué à effectuer des mises à jour jusqu'à ce que la version 2.17.1 les comble.
React2Shell (CVE-2025-55182)
Les composants serveur React s'exécutent sur le serveur et envoient leur sortie au navigateur, lequel peut appeler directement des fonctions serveur. React gère tous ces échanges dans un format appelé « Flight ». Lorsqu'une requête Flight arrive, le serveur la retransforme en objets, une étape appelée « désérialisation », et React se fie à la structure de ces données. Un attaquant pourrait façonner une requête qui atteindrait des fonctions intégrées de Node.js telles que `child_process.execSync` et exécuterait des commandes shell sans avoir à se connecter.
Les applications étaient exposées même si elles n’avaient jamais défini de fonction serveur, car le code de décodage Flight s’exécute dès lors que les composants serveur sont pris en charge. Les configurations par défaut de React 19 étaient vulnérables, et la CISA (Agence américaine de cybersécurité et de sécurité des infrastructures) a ajouté cette faille à sa liste des vulnérabilités exploitées lors d’attaques réelles. Un bug consécutif, CVE-2025-67779, a contourné le correctif initial, obligeant les équipes à effectuer une deuxième mise à jour.
Pourquoi les bugs de 2Shell ne cessent d'apparaître ?
PHP2Shell, Node2Shell et HTTP2Shell ont fait leur apparition la même semaine que des failles critiques dans eMudhra, GitLab, NGINX, Plex, Railway et OpenCode. N'importe laquelle d'entre elles aurait pu constituer le plus gros événement de l'année en matière de sécurité, et les gens ont commencé à parler d'« octobre noir ».
L'IA permet de détecter plus rapidement les anciens bugs
PHP est au cœur d’une grande partie du Web depuis trois décennies ; la plupart des gens pensaient donc que ses failles graves avaient été découvertes depuis longtemps, et pourtant, PHP2Shell est resté caché dans le code pendant 14 ans. Après la divulgation de cette faille, nous avons orienté l’outil analyse de code par IA d’ Aikidovers le code source de PHP, et celui-ci a redécouvert PHP2Shell en l’espace de quelques heures. Si un outil de défense peut détecter une faille comme celle-ci en un après-midi, les outils des attaquants ne tarderont pas à en faire de même.
Comment la solution « Aikido Security » vous aide à gérer les vulnérabilités 2Shell
Aikido analyse de la composition logicielle , de Security (SCA) et analyse d’images de conteneurs indiquent quels dépôts et quelles images utilisent encore un environnement d'exécution ou une bibliothèque vulnérable, y compris les paquets Brotli transitifs.
Si vous ne pouvez pas effectuer la mise à niveau immédiatement, des imagesAikido corrigées et gratuites, disponibles sur le registre public Amazon Elastic Container Registry de Aikido, couvrent les versions PHP 5.5 à 8.5, à l’exception des versions 8.0 et 8.1 pour le moment. Pour les versions pour lesquelles aucun correctif n’est disponible en amont, les correctifs sont rétroportés afin que vous puissiez conserver votre numéro de version. Concernant la faille Brotli, les images Node.js et Ubuntu corrigées disponibles sur Aikidovous permettent de conserver votre version actuelle sur les plateformes pour lesquelles aucun correctif n’est proposé par le fournisseur, notamment Node.js 18 et 20.
L'outil gratuit PHP2Shell Checker analyse une URL publique et vous indique son niveau de sécurité, allant de « vulnérable » à « entièrement corrigé ».
{{walkthrough}}
