🔍 Contexte

Publié le 8 avril 2026 par Bobby Gould et Michael DePlante sur le blog de la Zero Day Initiative (ZDI), cet article détaille une vulnérabilité structurelle dans la résolution de modules Node.js sur Windows, initialement signalée en septembre 2024 par un chercheur anonyme.

⚙️ Cause racine

Lorsqu’une application Node.js appelle require('bar'), le runtime parcourt une liste de chemins jusqu’à atteindre C:\node_modules. Sur Windows, tout utilisateur peu privilégié peut créer ce répertoire et y déposer un module malveillant. Si la dépendance légitime est absente (optionnelle, supprimée en production, ou non installée), Node.js charge et exécute le fichier malveillant dans le contexte de l’utilisateur courant.

Node.js considère ce comportement comme intentionnel (CWE-427 non traité comme vulnérabilité) avec la position : “Node.js trusts the file system.”

🎯 Cas d’exploitation documentés

Cas 1 — npm CLI (CVE-2026-0775 / ZDI-26-043 / ZDI-CAN-25430)

  • Avant la version 11.2.0, npm CLI utilisait la bibliothèque promise-inflight avec une dépendance optionnelle sur bluebird, non incluse dans l’installation standard de Node.js.
  • La suppression de bluebird via une pull request (github.com/npm/cli/pull/1438) a créé involontairement cette surface d’attaque.
  • Les commandes npm install, npm -l, npm prune déclenchent toutes le chargement du module malveillant C:\node_modules\bluebird.js.

Cas 2 — Discord (CVE-2026-0776 / ZDI-26-040 / ZDI-CAN-27057) — NON CORRIGÉ

  • Signalé le 22 avril 2025 par T. Doğa Gelişli.
  • Discord utilise la bibliothèque ws (WebSocket) qui contient une dépendance optionnelle sur utf-8-validate, non embarquée dans Discord.
  • À chaque lancement de Discord, C:\node_modules\utf-8-validate.js contrôlé par l’attaquant est exécuté.
  • Discord se lance automatiquement à la connexion Windows, rendant l’exécution de code immédiate et sans interaction utilisateur.

🌐 Périmètre élargi

D’autres applications sont mentionnées comme affectées : MongoDB Compass, MongoDB Shell, ainsi que tout projet utilisant Electron, Next.js ou React sur Windows avec des dépendances manquantes.

🚫 Positions des éditeurs

  • Node.js : comportement intentionnel, non-vulnérabilité.
  • npm : les exploits nécessitant un accès local sont inéligibles.
  • Discord : les attaques physiques/locales ne sont pas considérées comme des problèmes de sécurité.

📄 Nature de l’article

Il s’agit d’une publication de recherche technique de ZDI visant à documenter et exposer publiquement une classe de vulnérabilités d’escalade de privilèges locaux affectant l’écosystème Node.js sur Windows, avec des preuves de concept sur des applications réelles.

🧠 TTPs et IOCs détectés

TTP

  • T1574.008 — Hijack Execution Flow: Path Interception by Search Order Hijacking (Persistence)
  • T1574 — Hijack Execution Flow (Privilege Escalation)
  • T1059.007 — Command and Scripting Interpreter: JavaScript (Execution)

IOC

  • CVEs : CVE-2026-0775NVD · CIRCL
  • CVEs : CVE-2026-0776NVD · CIRCL
  • Fichiers : bluebird.js
  • Fichiers : utf-8-validate.js
  • Chemins : C:\node_modules\bluebird.js
  • Chemins : C:\node_modules\utf-8-validate.js
  • Chemins : C:\node_modules

🔗 Source originale : https://www.zerodayinitiative.com/blog/2026/4/8/nodejs-trust-falls-dangerous-module-resolution-on-windows