Le 21 octobre 2026, le projet Node.js a publié des mises à jour de sécurité qui corrigent dix failles d’un coup. La plus grave, surnommée Node2Shell, se cache dans le décompresseur Brotli intégré et peut mener à une exécution de code à distance. Voici ce qui s’est passé, qui est concerné et comment mettre ton Node.js à jour.

🚨 Haute · CVSS v4 9.2🟩 Node.js 22 · 24 · 26🛡️ CVE-2026-111497⏱️ 11 min de lecture

Cette faille Node.js mérite ton attention, même si tu n’as jamais écrit une ligne de compression de ta vie. Le défaut se trouve dans le décodeur Brotli embarqué dans Node.js, utilisé dès qu’un serveur décompresse une requête HTTP ou qu’un programme lit une réponse compressée avec fetch(). Les branches 22, 24 et 26 sont touchées, et le même bulletin corrige neuf autres vulnérabilités dans TLS, DNS, HTTP, la cryptographie et le modèle de permissions.

Dans cet article de veille, on reprend l’histoire dans l’ordre : la découverte, ce que fait chaque faille Node.js (sans entrer dans l’exploitation), puis la correction et la liste précise de ce que tu dois faire sur ton poste, tes serveurs et tes conteneurs.

Faille Node.js Node2Shell CVE-2026-111497 corrigée dans Node.js 26.12.1, 24.22.1 et 22.23.4
La faille Node.js du 21 octobre 2026 en un coup d’œil : gravité, type et versions corrigées.
⚠️
En une phrase

Passe à Node.js 26.12.1, 24.22.1 ou 22.23.4 (ou une version plus récente de ta branche), puis redémarre tes processus et reconstruis tes images Docker. Node.js 20 et les versions plus anciennes ne recevront aucun correctif.

Chronologie de la faille Node.js

Avant le 21 octobre 2026 : la faille Brotli est signalée en privé à l’équipe de sécurité de Node.js. Le bulletin officiel crédite OpenAI Codex Security pour la découverte de CVE-2026-111497.

21 octobre 2026 : publication du bulletin de sécurité Node.js et sortie simultanée de Node.js 26.12.1 (Current), 24.22.1 et 22.23.4 (LTS). Le même jour, Vercel publie un bulletin pour ses clients et Imperva déploie des signatures de détection.

22 octobre 2026 : Imperva publie une analyse technique. Ses chercheurs indiquent avoir reproduit une exécution de code sur Node.js 24.22.0 (image Linux ARM64 officielle), sans que l’attaque réussisse à chaque tentative. Les mêmes données sont rejetées par Node.js 24.22.1.

Aujourd’hui : aucune exploitation massive en production n’a été confirmée publiquement, mais la démonstration existe. Il reste à toi de vérifier chaque environnement qui fait tourner Node.js.

Chronologie de la faille Node.js Node2Shell, du signalement à l’analyse Imperva
De la découverte à la démonstration publique : la chronologie de la faille Node.js.

Comme pour la faille PHP publiée le même jour, la divulgation a été coordonnée : quand le grand public a découvert la faille Node.js, les versions corrigées étaient déjà téléchargeables. Le vrai danger concerne les environnements oubliés : un vieux conteneur, une pipeline CI, un serveur de préproduction.

En bref : la faille Node.js en chiffres

CVE-2026-111497 (Node2Shell)
ComposantDécodeur Brotli intégré à Node.js
TypeÉcriture hors limites (out-of-bounds write)
GravitéHaute selon Node.js · CVSS v4 9.2 dans la fiche CVE
Authentification requiseNon : il suffit de faire décompresser des données
Branches touchées22, 24 et 26
Versions corrigées22.23.4 · 24.22.1 · 26.12.1
DécouverteOpenAI Codex Security
Date de publication21 octobre 2026

Ne t’étonne pas de voir deux niveaux de gravité : le projet Node.js classe la faille en « High » avec sa propre méthode, tandis que la fiche CVE lui attribue un score CVSS 4.0 de 9.2, soit « Critique ». Ce sont deux façons de mesurer le même problème. Dans les deux cas, la consigne est identique : mettre à jour rapidement.

Node2Shell : la faille Node.js dans le décodeur Brotli

Brotli est un format de compression créé par Google, très utilisé sur le web parce qu’il compresse mieux que gzip. Node.js embarque son propre décodeur Brotli, accessible via le module zlib et utilisé par de nombreux outils : middlewares HTTP qui décompressent le corps des requêtes, clients HTTP qui lisent des réponses compressées, scripts de traitement de fichiers.

Le bulletin décrit une écriture hors limites dans ce décodeur : avec des données Brotli spécialement fabriquées, le décodeur écrit en dehors de la zone mémoire qui lui est réservée. Selon les cas, le résultat va du simple plantage à la fuite de mémoire, et jusqu’à l’exécution de code choisi par l’attaquant.

Imperva a testé deux scénarios, et les deux aboutissent au même décodeur vulnérable :

  • Côté serveur : une application reçoit une requête HTTP compressée en Brotli (en-tête Content-Encoding: br) et la décompresse, par exemple avec Express 5 et body-parser 2.
  • Côté client : un programme Node.js télécharge une ressource sur un serveur contrôlé par l’attaquant, et la réponse compressée est décodée automatiquement (cas de fetch()).
Les 10 failles Node.js du 21 octobre 2026 classées par gravité et par branche
La faille Node.js Brotli n’est pas seule : dix CVE sont corrigées, réparties différemment selon les branches.
🧠
Pourquoi un pare-feu ne suffit pas

Un WAF peut filtrer les requêtes Brotli entrantes suspectes, mais il ne voit pas les réponses que ton application télécharge puis décompresse. Le scénario fetch() passe donc sous son radar.

Les 9 autres failles Node.js corrigées le même jour

Le bulletin du 21 octobre compte dix CVE : quatre de gravité haute, trois moyennes et trois faibles. La branche 26 est concernée par les dix, la 24 par huit et la 22 par sept.

CVEGravitéComposant et problèmeBranches
CVE-2026-111497HauteBrotli : écriture hors limites dans le décodeur22, 24, 26
CVE-2026-105482HauteDNS : nom tronqué s’il contient un caractère NUL22, 24, 26
CVE-2026-105483HauteTLS : vérification du nom d’hôte et certificats génériques24, 26
CVE-2026-106069HauteTLS : vérification du nom d’hôte face à une adresse IP22, 24, 26
CVE-2026-105481MoyenneHTTP : réponse anticipée sur une connexion persistante22, 24, 26
CVE-2026-106072MoyenneTLS : validation des adresses IPv4 et des noms DNS du certificat22, 24, 26
CVE-2026-106074MoyenneCrypto : valeurs répétées de randomUUID() et randomInt() dans les snapshots et SEA22, 24, 26
CVE-2026-106070FaibleZIP : données renvoyées après une validation échouée26
CVE-2026-106071FaiblePermissions : droits fichiers trop larges avec les jokers26
CVE-2026-106073FaiblePermissions : contournement via fs.realpathSync22, 24, 26

Les trois failles TLS sont à prendre au sérieux : dans certains cas, Node.js pouvait accepter un certificat qui ne correspond pas vraiment au serveur contacté, par exemple avec une adresse IP au format inhabituel. Pour une application qui appelle des API externes, c’est exactement le genre de défaut qui ouvre la porte à une interception de trafic. Les versions corrigées intègrent aussi des mises à jour d’OpenSSL, c-ares, Undici et des certificats racines embarqués.

La faille crypto CVE-2026-106074 concerne un cas précis mais piégeux : si tu construis un snapshot ou une application exécutable unique (SEA), des valeurs aléatoires mises en cache au moment de la construction pouvaient se répéter d’une exécution à l’autre. Un randomUUID() qui revient à l’identique n’a plus rien d’aléatoire.

Suis-je concerné par cette faille Node.js ?

Commence par vérifier la version exacte de Node.js utilisée. Sur ton poste ou ton serveur :

node -v
# Exemple de sortie vulnérable :
# v24.22.0
# Versions corrigées : v22.23.4, v24.22.1, v26.12.1 ou plus

Attention : node -v affiche la version du binaire appelé dans ton terminal. Ton service en production peut utiliser un autre binaire (gestionnaire de versions, image Docker, chemin système). Pour être certain, fais afficher la version par l’application elle-même :

// Au démarrage de ton application
console.log(`Node.js ${process.version} (${process.platform}/${process.arch})`);

// Dans un conteneur en cours d’exécution
// docker exec -it mon-conteneur node -v
  • API Express ou serveur HTTP : concerné si ton application accepte des corps compressés en Brotli. Si tu as suivi notre tutoriel API REST avec Node.js, Express et MySQL, vérifie ta version de Node.js et de body-parser.
  • Bots et scripts qui appellent des sites externes : concernés via fetch(). C’est le cas d’un bot Node.js qui surveille un site.
  • Next.js, Nuxt, Vite en production : le framework n’y est pour rien, c’est le binaire Node.js qui doit être mis à jour.
  • Node.js 18 ou 20 : fin de vie atteinte (30 avril 2025 et 30 avril 2026). Aucun correctif n’est annoncé, il faut migrer.

Comment corriger la faille Node.js : mettre à jour

Avec nvm (Linux, macOS) ou nvm-windows

# Installer la dernière version de ta branche LTS
nvm install 24
nvm alias default 24
node -v   # doit afficher v24.22.1 ou plus

# Sous Windows (nvm-windows)
nvm install 24.22.1
nvm use 24.22.1

Debian / Ubuntu (dépôt NodeSource)

sudo apt update
sudo apt install --only-upgrade nodejs
node -v
# Redémarre ensuite ton service, par exemple :
sudo systemctl restart mon-app   # ou : pm2 restart all

Si tu utilises le paquet nodejs fourni par ta distribution, consulte plutôt son bulletin de sécurité : les distributions appliquent souvent le correctif sur leur propre numéro de version, qui ne correspond pas forcément à 24.22.1.

Docker

# Dans ton Dockerfile, épingle une version corrigée :
FROM node:24.22.1-alpine

# Reconstruis sans cache, puis redéploie :
docker build --pull --no-cache -t mon-app .
docker compose up -d --force-recreate

# Vérifie dans le nouveau conteneur :
docker exec -it mon-app node -v

Windows et macOS (installateur officiel)

Télécharge l’installateur de ta branche sur nodejs.org, installe-le par-dessus l’ancienne version, puis ferme et rouvre ton terminal et ton éditeur (VS Code garde parfois l’ancien chemin en mémoire).

✅
Après la mise à jour

Redémarre tous les processus Node.js (PM2, systemd, conteneurs). Tant qu’un ancien processus tourne, l’ancien décodeur Brotli vulnérable reste en mémoire. Mettre à jour tes paquets npm ne change rien : c’est le binaire Node.js qui compte.

Pas de mise à jour possible tout de suite ? Les mesures temporaires

Rien ne remplace la mise à jour, mais ces mesures réduisent l’exposition à la faille Node.js pendant le déploiement :

  • Refuser temporairement les requêtes entrantes compressées en Brotli si ton application n’en a pas besoin.
  • Activer les règles WAF ou les signatures publiées par ton hébergeur ou ton fournisseur de sécurité (Vercel et Imperva en ont publié dès le 21 octobre).
  • Limiter les appels fetch() vers des serveurs que tu ne contrôles pas, ou désactiver l’acceptation de Brotli côté client si ton outil le permet.
// Express : rejeter les corps compressés en Brotli en attendant la mise à jour
app.use((req, res, next) => {
  const encoding = (req.headers['content-encoding'] || '').toLowerCase();
  if (encoding.includes('br')) {
    return res.status(415).json({ error: 'Encodage non pris en charge' });
  }
  next();
});
🚫
Fausse bonne idée

Les règles de pare-feu ne couvrent pas les réponses que ton application télécharge puis décompresse. Elles achètent du temps, elles ne corrigent pas la faille Node.js.

Comprendre une écriture hors limites en 2 minutes

Imagine un parking où chaque voiture a une place numérotée. Le décodeur reçoit une place de 10 mètres pour déposer les données décompressées. Si un calcul de taille est faux, il continue à garer des voitures après le 10e mètre, sur les places du voisin. En mémoire, ces « places du voisin » contiennent d’autres données du programme, parfois des informations qui décident de ce que le programme va exécuter ensuite.

Un attaquant qui contrôle les données compressées peut essayer de choisir ce qui sera écrit et où. C’est pour ça qu’un défaut de calcul dans un décompresseur peut devenir une exécution de code. JavaScript est un langage sûr pour la mémoire, mais Node.js repose sur du code C et C++ (V8, OpenSSL, Brotli, zlib) qui, lui, ne l’est pas.

🔐
Pourquoi on ne publie pas d’exemple d’attaque

Sur LM-Code, la veille sécurité explique le fonctionnement et la défense, jamais l’exploitation. L’essentiel pour toi : quelles versions de Node.js sont touchées et comment corriger.

Checklist complète après la faille Node.js

  • Inventorie tous tes Node.js : poste de développement, serveurs, conteneurs, runners CI/CD, fonctions serverless, outils de build.
  • Reconstruis et redéploie tes images Docker : reconstruire sans redéployer ne protège rien.
  • Teste tes appels HTTPS sortants : les correctifs TLS sont plus stricts. Garde la vérification des certificats activée, ne la désactive jamais pour « faire passer » une erreur.
  • Teste la résolution DNS, la décompression légitime et les connexions HTTP persistantes après la mise à jour.
  • Régénère tes snapshots et applications SEA si tu en produis, à cause de la faille crypto CVE-2026-106074.
  • Planifie la migration de tout ce qui tourne encore sur Node.js 18 ou 20.
# Lister les versions de Node.js utilisées dans tes Dockerfile
grep -rn "FROM node" --include=Dockerfile* .

# Vérifier la version utilisée par tes workflows GitHub Actions
grep -rn "node-version" .github/workflows/

Faille Node.js : les erreurs à éviter

  • Lancer npm update et s’arrêter là : tes dépendances n’y sont pour rien, c’est le moteur Node.js qu’il faut remplacer.
  • Oublier la CI : une pipeline qui construit tes artefacts avec un Node.js vulnérable peut traiter des données externes compressées.
  • Désactiver la vérification TLS parce qu’un appel échoue après la mise à jour : c’est précisément ce que les correctifs renforcent.
  • Croire qu’un petit projet n’intéresse personne : les scans sont automatisés et visent toutes les versions de Node.js exposées.
💡
Le bon réflexe

Épingle ta version de Node.js dans un fichier .nvmrc et dans tes Dockerfile. Le jour où une faille Node.js tombe, une seule ligne à changer suffit.

FAQ

Mon application est-elle touchée si je n’utilise pas Brotli ?

Pour la faille Brotli, le risque baisse fortement, mais fetch() peut décompresser automatiquement une réponse Brotli sans que tu l’aies demandé. Et les neuf autres failles Node.js (TLS, DNS, HTTP) te concernent de toute façon : mets à jour.

Et Node.js 18 ou 20 ?

Ces branches sont en fin de vie et ne reçoivent plus de correctifs officiels. Il faut migrer vers Node.js 22, 24 ou 26, ou passer par un support commercial étendu.

La faille Node.js est-elle exploitée activement ?

Au 21 octobre 2026, les sources Node.js ne signalaient aucune exploitation observée. Imperva a ensuite reproduit une exécution de code en laboratoire, de façon non systématique. Aucune exploitation massive en production n’a été confirmée publiquement, mais le risque augmente chaque jour.

Mon hébergeur Node.js s’en occupe-t-il ?

Sur une plateforme gérée, consulte ses annonces : certaines mettent à jour automatiquement, d’autres attendent que tu redéploies. Sur un VPS ou un conteneur, c’est à toi de le faire.

Pour résumer la situation, la faille Node.js Node2Shell n’est pas un cas isolé : chaque faille Node.js de ce bulletin touche une brique différente du moteur. C’est pour ça qu’une seule action couvre tout le reste : installer la version corrigée de ta branche. Une faille Node.js corrigée sur ton poste mais pas dans ta CI reste une faille Node.js exploitable.

Garde aussi en tête que cette faille Node.js a été trouvée par un outil d’analyse automatisé. D’autres suivront, et la meilleure défense reste une routine simple : vérifier tes versions chaque mois et lire le bulletin de sécurité dès qu’une nouvelle faille Node.js est annoncée.

Faille Node.js : le résumé à retenir

  • La faille Node.js CVE-2026-111497, dite Node2Shell, est une écriture hors limites dans le décodeur Brotli intégré.
  • Elle peut être déclenchée côté serveur (requête compressée) comme côté client (fetch() vers un serveur malveillant).
  • Neuf autres failles Node.js sont corrigées le même jour, dont trois dans la vérification TLS.
  • Les versions corrigées sont 22.23.4, 24.22.1 et 26.12.1, publiées le 21 octobre 2026. Node.js 20 et plus ancien ne sont pas corrigés.
  • Mettre à jour les paquets npm ne suffit pas : il faut remplacer le binaire, redémarrer les processus et redéployer les conteneurs.

Si tu ne retiens qu’une chose de cette faille Node.js : la version du moteur fait partie de la sécurité de ton application, au même titre que tes dépendances. Traite la faille Node.js aujourd’hui, puis mets en place une vérification mensuelle de tes versions.

Conclusion

Le 21 octobre 2026 restera une journée chargée pour les développeurs web : la faille critique PHP et cette faille Node.js ont été corrigées le même jour. Prends dix minutes pour vérifier tes versions, reconstruire tes images et redémarrer tes services. Si tu travailles avec des conteneurs, notre guide Docker pour développeur web t’aidera à garder des images propres et faciles à mettre à jour.

Sources

Comments

No comments yet. Why don’t you start the discussion?

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *