Une entrée Brotli forgée permet l'exécution de code sur un build standard de Node.js 24, selon Imperva

Selon Imperva, des données Brotli forgées ont permis en laboratoire d'exécuter du code sur un build standard de Node.js via le décodeur.

Ajoutez CyberWorldOpsà vos sources préférées sur Google
Une entrée Brotli forgée permet l'exécution de code sur un build standard de Node.js 24, selon Imperva
Vulnérabilités

Image d’illustration générée par IA

Les chercheurs d'Imperva ont démontré que des données Brotli malformées peuvent conduire à l'exécution de code contrôlé par un attaquant sur un build ordinaire de Node.js, non modifié. C'est une étape au-delà des expérimentations précédentes, qui ne fonctionnaient que sur un binaire de test volontairement affaibli.

La preuve de concept, baptisée « Node2Shell », exploite CVE-2026-111497, une faille du décodeur Brotli intégré au runtime. Node.js a divulgué la faille et publié les correctifs le 21 octobre 2026.

Dans le laboratoire d'Imperva, la charge utile s'est exécutée sur l'image officielle Node.js 24.22.0 pour Linux arm64. Rien n'a été recompilé et aucun débogueur n'a été attaché : la seule entrée était une donnée Brotli forgée, transmise au décodeur fourni avec le runtime. Le résultat n'était pas constant, l'exécution de code n'a eu lieu qu'après plusieurs tentatives. Imperva n'a travaillé qu'avec un seul build et une seule configuration applicative, et n'a examiné ni d'autres architectures de processeur ni les branches 22.x et 26.x. Soumise à la version 24.22.1, qui contient le correctif, la même donnée a été rejetée et rien ne s'est exécuté.

La première preuve de concept publique n'avait atteint l'exécution de code que sur un build volontairement modifié pour faciliter le déclenchement du bug. Sur un build normal, son auteur a signalé un plantage et une lecture partielle de la mémoire du processus, et non une exécution de code, reconnaissant qu'il n'était pas parvenu à une attaque fonctionnelle dans ce cas.

Au 22 octobre, aucune exploitation de la faille dans des attaques réelles n'avait été signalée, selon The Hacker News.

Deux chemins vers le décodeur

Comme le décodeur vulnérable fait partie de Node.js lui-même, l'exposition touche les applications des branches 22.x, 24.x et 26.x, et pas seulement la version testée par Imperva. Le trafic peut atteindre le décodeur dans les deux sens d'un échange HTTP : soit via la fonction intégrée fetch() de Node.js, qui décompresse une réponse encodée en Brotli provenant d'un autre serveur, soit via un middleware qui décompresse le corps d'une requête encodée en Brotli.

Dans Express 5, les parseurs express.json(), express.urlencoded(), express.text() et express.raw() traitent les corps de requête Brotli, comme ils le faisaient déjà pour gzip et deflate, une fois rattachés à une route. Un simple serveur HTTP Node.js ne décode pas un corps Brotli du seul fait qu'il en reçoit un : cela exige un tel middleware ou un appel explicite.

Imperva a reproduit l'exécution par les deux chemins, celui du corps de requête comme celui de la réponse. Ses tests ont porté sur des versions situées dans les plages Express 5.0.0 à 5.3.0 et body-parser 2.0.0 à 2.3.0, sans couvrir chaque version de ces plages.

Un changement de bloc que le format interdit

Le déclencheur réside dans la façon dont le décodeur réagit à un état qu'un flux Brotli valide ne peut pas atteindre. Un flux déclare les types de blocs qu'il utilisera au fur et à mesure du décodage, et l'entrée d'Imperva arrivait à un changement de bloc que la structure même du flux exclut. Au lieu de rejeter le flux, le décodeur a traité cette situation comme une demande de données supplémentaires et a continué dans un état invalide.

Une exécution séparée sous un sanitizer de mémoire a montré la conséquence : une écriture au-delà de la fin du tampon prévu, à l'origine de la corruption mémoire qui sous-tend le bug. Node.js a corrigé le problème en important un correctif amont de Brotli, qui fait échouer le décodeur avec une erreur de format à cet endroit.

L'entrée CVE décrit la faille comme un dépassement de tampon dans le fichier source du décodeur Brotli c/dec/decode.c, affectant Google Brotli de la version 1.0.3 à la version 1.2.0 incluse, sur toutes les plateformes. Selon cette entrée, un flux compressé forgé permet à un attaquant distant non authentifié de corrompre la mémoire adjacente de l'état du décodeur, de divulguer le contenu sensible de la mémoire, de provoquer un déni de service ou, potentiellement, d'exécuter du code arbitraire. Elle invite les utilisateurs de la bibliothèque à passer à la version 1.0.10, 1.1.1 ou 1.2.1.

Correctifs, et les artefacts qu'un inventaire peut manquer

La solution consiste à passer à une version corrigée de Node.js. Comme les binaires Node sont souvent intégrés aux images de conteneurs et à d'autres artefacts de build, un inventaire des dépendances peut passer à côté. La branche 20.x et les versions antérieures sont en fin de vie et ne recevront pas le correctif : les applications qui s'y trouvent doivent migrer vers une branche prise en charge.

L'avis de Node.js ne mentionne aucune solution de contournement dans le runtime, ce qui laisse sans recours immédiat les applications qui ne peuvent pas être mises à jour tout de suite. Imperva recommande de limiter le trafic Brotli non fiable sur les chemins concernés, lorsque c'est possible, tout en insistant sur le fait que seule une mise à jour supprime la faille. L'entreprise indique avoir ajouté des règles à son pare-feu applicatif web et les avoir testées contre les attaques qu'elle a reproduites.

Vercel, qui exécute des charges de travail de Node.js pour ses clients, a déclaré avoir introduit le 21 octobre des règles bloquant l'attaque dans les requêtes entrantes. Ces règles ne couvrent pas les réponses Brotli que une application récupère auprès d'autres serveurs, et elles ne remplacent pas la mise à jour.

À lire aussi

Sources

Cet article est une réécriture originale fondée sur les sources ci-dessous.

CVE traitées dans cet article

Retour à l'accueil

Dernières actualités cybersécurité

Toutes les actualités cybersécurité →