flawopen.com/Teardowns/cve-2024-27980-nodejs-windows-batch-injection
CVE-2024-27980: Node.js unter Windows
Unter Windows konnten spawn() und spawnSync() beim Start von Batchdateien Befehlsinjektion ermöglichen, auch ohne die Option shell.
Stell dir vor, ein Programm übergibt Argumente an eine Batchdatei, aber Windows benötigt zum Start einen Kommandointerpreter. Dieser kann Argumente als Befehlssyntax lesen. Node.js behob das Problem, indem es den direkten Start von Batchdateien ablehnt, statt eine vermeintlich sichere Maskierung jedes Arguments zu erraten.
Kernkonzepte & Begriffe
child_process.spawn()- Asynchrone Node.js-API zum Starten eines Prozesses mit ausführbarer Datei und Argumentliste.
Batchdatei- Eine .bat- oder .cmd-Datei, die von der Windows-Shell interpretiert wird und kein gewöhnliches Programm mit universellem argv-Parsing ist.
Shell-Metazeichen- Zeichen, deren Bedeutung vom Kommandointerpreter abhängt und die Befehlsstruktur verändern können.
EINVAL- Fehlercode, mit dem Node.js den unsicheren direkten Start von Batchdateien ablehnt.
Framework-Zuordnungen
- CWE-Referenz für die in diesem Leitfaden beschriebene Schwachstelle: CWE-77
Ursachenanalyse
Unter Windows werden .bat- und .cmd-Dateien von einer Shell interpretiert; ihre Argumente lassen sich nicht immer eindeutig maskieren. Laut Node.js-Sicherheitsmeldung konnten schädliche Argumente über child_process.spawn() und spawnSync() Befehle einschleusen, selbst wenn shell nicht aktiviert war. Der Upstream-Patch erkennt Dateinamen mit der Endung .bat oder .cmd ohne Beachtung der Groß-/Kleinschreibung und liefert vor uv_spawn() EINVAL zurück. Der Patch implementiert kein sanitizeBatchArg() und belegt nicht, dass shell: true sicher ist. Eine spätere Meldung fand eine unvollständige Korrektur für weitere Batch-Endungen (CVE-2024-36138); installiere eine Version mit beiden Korrekturen.
Schritt-für-Schritt Angriffsablauf
Anwendung ruft Prozess-API auf
Unter Windows startet die Anwendung mit child_process.spawn() oder spawnSync() eine .bat- oder .cmd-Datei mit möglicherweise extern beeinflussten Argumenten.
Ziel ist eine Batchdatei
Batchdateien unterliegen Shell-Regeln; ein Argumentvektor verhindert die Interpretation von Metazeichen nicht automatisch.
Windows interpretiert Argumente
Das verwundbare Verhalten konnte ein Argument auch bei shell: false als Befehlssyntax interpretieren lassen.
Node.js blockiert den Direktstart
Der Patch liefert bei direktem Start von .bat/.cmd EINVAL zurück. CVE-2024-36138 zeigte eine Restlücke bei anderen Endungen; installiere Versionen mit beiden Korrekturen.
Quellcode: Verwundbar vs. Sicher
// Auszug aus src/process_wrap.cc vor dem Sicherheitspatch
node::Utf8Value file(env->isolate(), file_v);
options.file = *file;
// Der Dateiname wurde an uv_spawn() übergeben, ohne Batchdateien abzulehnen.
// Auszug aus dem Upstream-Patch für CVE-2024-27980
node::Utf8Value file(env->isolate(), file_v);
options.file = *file;
// Argumente für Batchdateien lassen sich nicht immer eindeutig maskieren.
if (IsWindowsBatchFile(options.file))
err = UV_EINVAL;
if (err == 0) {
err = uv_spawn(env->event_loop(), &wrap->process_, &options);
wrap->MarkAsInitialized();
}
Checkliste für Engineering & Systemsicherheit
- ✓Aktualisiere auf eine unterstützte Node.js-Version mit den Korrekturen für
CVE-2024-27980undCVE-2024-36138. - ✓Starte Batchskripte nicht mit extern beeinflussten Daten; verwende möglichst eine direkte ausführbare Datei mit validierten Argumenten.
- ✓Falls eine Shell nötig ist, behandle shell: true als Befehlsausführung und setze strikte Validierung und Autorisierung ein.
- ✓Ergänze Windows-Tests für
spawn()undspawnSync()mit Batch-Endungen und prüfe die sichere Ablehnung per EINVAL.