FlawOpen

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

● CVE-2024-27980 · CVSS 8.1 · Hoch
Sicherheitsforschung · FlawOpen

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.

💡 Einfache Erklärung (ELI5)

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

Schritt 1

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.

Schritt 2

Ziel ist eine Batchdatei

Batchdateien unterliegen Shell-Regeln; ein Argumentvektor verhindert die Interpretation von Metazeichen nicht automatisch.

Schritt 3

Windows interpretiert Argumente

Das verwundbare Verhalten konnte ein Argument auch bei shell: false als Befehlssyntax interpretieren lassen.

Schritt 4

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

VERWUNDBARE IMPLEMENTIERUNG
// 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.
GEHÄRTETER SICHERHEITS-PATCH
// 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

Quellen