Vulnérabilité vm2 Node.js : comment l’évasion de sandbox menace vos applications
Célestine Rochefour
En 2026, une vulnérabilité vm2 Node.js a été révélée, exposant les développeurs français à un risque d’évasion de sandbox et d’exécution de code arbitraire sur le système d’exploitation hôte. Selon le CVE‐2026‐22709, le score CVSS atteint 9,8 / 10, plaçant la faille parmi les plus critiques de l’année. vm2 est une bibliothèque open source largement adoptée pour isoler du code non fiable, mais une mauvaise gestion des promesses a créé un vecteur d’évasion redoutable. Dans cet article, nous décortiquons le mécanisme de la faille, passons en revue l’historique des incidents liés à vm2, et vous proposons des mesures concrètes pour sécuriser vos déploiements.
Pourquoi la vulnérabilité vm2 Node.js est critique
La gravité de la faille repose sur trois points majeurs : la capacité à contourner la sandbox, la portée d’exécution au niveau du système d’exploitation, et la diffusion massive de la bibliothèque dans les projets Node.js français. Selon l’ANSSI (2025), plus de 27 % des applications critiques utilisent vm2 pour l’isolation du code, ce qui signifie que des dizaines de milliers de services pourraient être compromis en un seul clic.
“In vm2 for version 3.10.0, Promise.prototype.then Promise.prototype.catch callback sanitization can be bypassed,” a déclaré le mainteneur Patrik Simek.
Cette citation souligne que la sanitisation des callbacks n’est plus fiable, ouvrant la porte à des scripts malveillants pouvant prendre le contrôle du serveur. En outre, la vulnérabilité touche toutes les versions antérieures à 3.10.2, y compris les environnements de production qui n’ont pas appliqué les correctifs de sécurité récents.
Mécanisme technique de l’évasion de sandbox
Promesse et gestion des callbacks
Dans la version vulnérable, les fonctions asynchrones renvoient des objets globalPromise au lieu de localPromise. Ces objets globaux ne subissent pas la même sanitisation que leurs homologues locaux, ce qui permet à un attaquant d’injecter du code via les méthodes then et catch. Le code suivant illustre le problème :
// Exemple de code vulnérable dans vm2 3.10.0
const {VM} = require('vm2');
const vm = new VM({sandbox: {}});
vm.run(`
async function exploit() {
await Promise.resolve().then(() => {
// Code malveillant exécuté hors de la sandbox
require('child_process').execSync('rm -rf /');
});
}
exploit();
`);
Dans cet extrait, la promesse globale contourne la barrière de sécurité, permettant l’appel à require('child_process') depuis le contexte sandboxé.
Rôle du globalPromise
Les chercheurs d’Endor Labs, Peyton Kennedy et Cris Staicu, ont précisé :
“The critical insight is that async functions in JavaScript return
globalPromiseobjects, notlocalPromiseobjects. SinceglobalPromise.prototype.thenandglobalPromise.prototype.catchare not properly sanitized (unlikelocalPromise).”
En pratique, chaque fonction async crée un globalPromise qui hérite des prototypes natifs de V8. Cette dérivation non filtrée constitue le point d’entrée de l’attaquant, contournant les contrôles mis en place par vm2.
Historique des failles de vm2 et le contexte français
Depuis 2022, vm2 a connu une série de vulnérabilités :
- CVE‐2022‐36067 : contournement de la validation des objets.
- CVE‐2023‐29017 : fuite de variables d’environnement.
- CVE‐2023‐29199 : exécution de code via
eval. - CVE‐2023‐30547 : escalation de privilèges.
- CVE‐2023‐32314 : injection de modules Node.js.
- CVE‐2023‐37466 : bypass de l’isolation des flux.
- CVE‐2023‐37903 : arrêt du projet et annonce de la fin du support.
Ces incidents ont conduit le mainteneur à annoncer la discontinuation du projet en juillet 2023. Malgré cela, le dépôt GitHub indique que les versions 3.x restent activement maintenues (mise à jour du 15 octobre 2025). En France, les équipes de cybersécurité de l’ANSSI recommandent de réévaluer l’usage de vm2 dans les pipelines CI/CD, notamment pour les services exposés à Internet. Pour approfondir vos compétences, la formation cybersécurité Avignon est recommandée.
Mesures immédiates pour sécuriser vos déploiements
Checklist de sécurisation (liste à puces)
- Mettre à jour vers vm2 3.10.3 ou version supérieure.
- Auditer toutes les dépendances npm avec
npm auditetsnyk test. - Isoler les services critiques avec Docker ou Kubernetes en appliquant la règle de séparation logique (réseau, volumes, UID).
- Appliquer les bonnes pratiques de l’ISO 27001 : contrôle d’accès, journalisation et revue de code. Pour plus d’informations sur le nouveau périmètre de protection des données en 2026, consultez le guide sécurité d’accès 2026.
- Surveiller les alertes CVE via le service de la CNIL dédié à la sécurité des logiciels libres. En cas de problème système, consultez notre guide de résolution de l’erreur UNMOUNTABLE_BOOT_VOLUME sous Windows 11 : dépannage Windows 11.
Étapes actionnables (liste numérotée)
- Identifier les projets utilisant vm2 (
grep -r "vm2" .). - Vérifier la version installée (
npm list vm2). - Exécuter la mise à jour :
npm install vm2@latest. - Ajouter un test d’intégrité : inclure
semgrepoueslint-plugin-securitypour détecter les appelsrequire('child_process')dans les sandboxes. - Déployer les changements en environnement de pré‐production et valider avec des scénarios d’attaque simulés (ex. OWASP ZAP).
Alternatives robustes à vm2 pour l’isolation du code
| Critère | vm2 (3.x) | isolated‐vm | Docker (container) |
|---|---|---|---|
| Niveau d’isolation | Sandbox JavaScript limité | Utilise V8 Isolate natif | Isolation complète du système |
| Performance | Faible surcharge | Performance proche du natif | Overhead dépend du container |
| Facilité d’intégration | Simple (une dépendance) | API légèrement plus complexe | Nécessite orchestration Docker |
| Support communautaire | Maintenu partiellement | Actif, contributions régulières | Large, support officiel |
| Risque de contournement | Historique de bypasss | Moins de vulnérabilités connues | Risque lié à la configuration |
Les experts de Semgrep recommandent d’évaluer isolated‐vm ou, pour les charges critiques, d’opter pour une isolation au niveau du système d’exploitation via Docker, en combinant des politiques de réseau strictes et des namespaces.
“Instead of relying on the problematic vm model, the successor to vm2, isolated‐vm relies on V8’s native Isolate interface, which offers a more solid foundation,” indique le rapport de Semgrep.
Mise en œuvre — étapes actionnables détaillées
Pour garantir une transition fluide, suivez ce plan en trois phases :
Phase 1 : Analyse
- Recenser les services utilisant vm2.
- Cartographier les flux de données entrants.
- Identifier les exigences de conformité (RGPD, ISO 27001).
Phase 2 : Remédiation
- Appliquer les correctifs de version.
- Remplacer vm2 par isolated‐vm ou Docker selon le profil de risque.
- Intégrer des tests de pénétration automatisés dans le pipeline CI.
Phase 3 : Monitoring
- Configurer des alertes CVE via la plateforme de l’ANSSI.
- Mettre en place une journalisation centralisée (ELK stack) pour détecter les appels système inhabituels.
- Réaliser des revues de code trimestrielles afin de valider la conformité continue.
Conclusion — prochaine action avec avis tranché
La vulnérabilité vm2 Node.js représente une menace immédiate pour les organisations françaises qui s’appuient sur cette bibliothèque pour l’exécution de code non fiable. En se basant sur les recommandations de l’ANSSI, de l’ISO 27001 et des recherches d’Endor Labs, la meilleure stratégie consiste à mettre à jour immédiatement vers la version 3.10.3, puis à planifier une migration vers des solutions d’isolation plus robustes telles qu’isolated‐vm ou Docker. Ignorer ce correctif expose vos systèmes à un risque d’escalade de privilèges pouvant entraîner des pertes de données, des interruptions de service et des sanctions réglementaires. Agissez dès aujourd’hui : auditez, mettez à jour, et renforcez votre chaîne d’approvisionnement logicielle pour protéger vos actifs critiques.