flawopen.com/Teardowns/cve-2024-27980-nodejs-windows-batch-injection
CVE-2024-27980 : Node.js sous Windows
Sous Windows, spawn() et spawnSync() pouvaient permettre une injection de commande lors du lancement de fichiers batch, même sans l’option shell.
Imaginez qu’un programme transmette des arguments à un fichier batch, mais que Windows ait besoin d’un interpréteur de commandes pour l’exécuter. Celui-ci peut lire les arguments comme une syntaxe de commande. Node.js a corrigé le problème en refusant le lancement direct des fichiers batch, au lieu d’essayer de deviner comment échapper chaque argument.
Concepts Clés et Termes
child_process.spawn()- API asynchrone Node.js pour lancer un processus à partir d’un exécutable et d’une liste d’arguments.
Fichier batch- Fichier .bat ou .cmd interprété par le shell Windows, et non exécutable standard avec parsing argv universel.
Métacaractère shell- Caractère dont le sens dépend de l’interpréteur de commandes et peut modifier la structure de la commande.
EINVAL- Code d’erreur utilisé par Node.js pour refuser le lancement direct non sûr de fichiers batch.
Correspondances de référentiels
- Référence CWE pour la faiblesse décrite dans ce guide : CWE-77
Analyse de Cause Racine
Sous Windows, les fichiers .bat et .cmd sont interprétés par un shell ; il n’est pas toujours possible d’échapper leurs arguments sans ambiguïté. L’avis Node.js indique que des arguments malveillants pouvaient injecter des commandes via child_process.spawn() et spawnSync(), même sans shell activé. Le correctif upstream détecte les noms se terminant par .bat ou .cmd, sans tenir compte de la casse, et renvoie EINVAL avant uv_spawn(). Le correctif n’implémente pas sanitizeBatchArg() et ne prouve pas que shell: true est sûr. Un avis ultérieur a signalé une correction incomplète pour d’autres extensions de fichiers batch (CVE-2024-36138) ; installez une version contenant également ce second correctif.
Déroulement de l'Attaque Étape par Étape
L’application appelle l’API de processus
Sous Windows, l’application utilise child_process.spawn() ou spawnSync() pour lancer un fichier .bat ou .cmd avec des arguments pouvant contenir des données externes.
La cible est un fichier batch
Les fichiers batch suivent les règles du shell ; une liste d’arguments n’empêche pas à elle seule l’interprétation des métacaractères.
Windows interprète les arguments
Le comportement vulnérable pouvait faire interpréter un argument comme syntaxe de commande, même avec shell: false.
Node.js bloque le lancement direct
Le correctif renvoie EINVAL lors du lancement direct de .bat/.cmd. CVE-2024-36138 a révélé une lacune résiduelle pour d’autres extensions ; installez une version contenant les deux correctifs.
Code Source : Vulnérable vs Sécurisé
// Extrait de src/process_wrap.cc avant le correctif de sécurité
node::Utf8Value file(env->isolate(), file_v);
options.file = *file;
// Le nom de fichier était transmis à uv_spawn() sans rejeter les fichiers batch.
// Extrait du correctif amont de CVE-2024-27980
node::Utf8Value file(env->isolate(), file_v);
options.file = *file;
// Les arguments des fichiers batch ne peuvent pas toujours être échappés sans ambiguïté.
if (IsWindowsBatchFile(options.file))
err = UV_EINVAL;
if (err == 0) {
err = uv_spawn(env->event_loop(), &wrap->process_, &options);
wrap->MarkAsInitialized();
}
Liste de Contrôle de Sécurité pour l'Ingénierie
- ✓Mettez à jour vers une version Node.js prise en charge contenant les correctifs
CVE-2024-27980etCVE-2024-36138. - ✓Évitez de lancer des scripts batch avec des données externes ; préférez un exécutable direct avec des arguments validés.
- ✓Si le shell est indispensable, traitez shell: true comme une exécution de commandes et appliquez validation stricte et autorisation.
- ✓Ajoutez des tests Windows pour
spawn()etspawnSync()avec des extensions batch et vérifiez le rejet sûr par EINVAL.