FlawOpen

flawopen.com/Teardowns/cve-2024-27980-nodejs-windows-batch-injection

● CVE-2024-27980 · CVSS 8.1 · Haute
Recherche · FlawOpen

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.

💡 Explication en Langage Simple (ELI5)

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

Étape 1

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.

Étape 2

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.

Étape 3

Windows interprète les arguments

Le comportement vulnérable pouvait faire interpréter un argument comme syntaxe de commande, même avec shell: false.

Étape 4

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é

IMPLÉMENTATION VULNÉRABLE
// 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.
PATCH SÉCURISÉ ET ROBUSTE
// 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

Sources