FlawOpen

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

● CVE-2024-27980 · CVSS 8.1 · Tinggi
Riset Keamanan · FlawOpen

CVE-2024-27980: Node.js di Windows

Di Windows, spawn() dan spawnSync() dapat memungkinkan injeksi perintah saat menjalankan file batch, meski opsi shell tidak aktif.

💡 Penjelasan Sederhana (ELI5)

Bayangkan program memberikan argumen ke file batch, tetapi Windows menjalankannya melalui interpreter perintah. Interpreter dapat membaca argumen sebagai sintaks perintah. Node.js memperbaikinya dengan menolak eksekusi langsung file batch, bukan menebak cara meng-escape setiap argumen dengan aman.

Konsep Kunci & Istilah

child_process.spawn()
API asinkron Node.js untuk menjalankan proses dengan executable dan daftar argumen.
File batch
File .bat atau .cmd yang ditafsirkan shell Windows, bukan executable biasa dengan parsing argv universal.
Metakarakter shell
Karakter yang maknanya bergantung pada interpreter perintah dan dapat mengubah struktur perintah.
EINVAL
Kode error yang digunakan Node.js untuk menolak eksekusi langsung file batch yang tidak aman.

Pemetaan kerangka kerja

  • Referensi CWE untuk kelemahan yang dijelaskan dalam panduan ini: CWE-77

Analisis Akar Masalah (Root Cause)

Di Windows, file .bat dan .cmd ditafsirkan oleh shell; argumennya tidak selalu dapat di-escape secara tidak ambigu. Pemberitahuan keamanan Node.js menyebut argumen berbahaya dapat menyisipkan perintah melalui child_process.spawn() dan spawnSync() meskipun shell tidak diaktifkan. Patch upstream mendeteksi akhiran .bat atau .cmd tanpa membedakan kapitalisasi, lalu mengembalikan EINVAL sebelum memanggil uv_spawn(). Perbaikan ini tidak menerapkan sanitizeBatchArg() dan tidak membuktikan shell: true aman. Pemberitahuan berikutnya menemukan perbaikan yang belum lengkap untuk ekstensi file batch lain (CVE-2024-36138); gunakan versi yang memuat kedua perbaikan.

Alur Serangan Langkah demi Langkah

Langkah 1

Aplikasi memanggil API proses

Di Windows, aplikasi memakai child_process.spawn() atau spawnSync() untuk menjalankan .bat/.cmd dengan argumen yang mungkin dipengaruhi input eksternal.

Langkah 2

Targetnya file batch

File batch mengikuti aturan shell; daftar argumen saja tidak mencegah interpretasi metakarakter.

Langkah 3

Windows menafsirkan argumen

Perilaku rentan dapat menafsirkan argumen sebagai sintaks perintah meskipun shell: false.

Langkah 4

Node.js menolak eksekusi langsung

Patch mengembalikan EINVAL untuk eksekusi langsung .bat/.cmd. CVE-2024-36138 menunjukkan celah tersisa pada ekstensi lain; gunakan versi dengan kedua perbaikan.

Kode Sumber: Rentan vs Aman

IMPLEMENTASI RENTAN
// Kutipan src/process_wrap.cc sebelum patch keamanan
node::Utf8Value file(env->isolate(), file_v);
options.file = *file;

// Nama file diteruskan ke uv_spawn() tanpa menolak file batch.
PERBAIKAN AMAN & KUAT
// Kutipan patch upstream CVE-2024-27980
node::Utf8Value file(env->isolate(), file_v);
options.file = *file;

// Argumen file batch tidak selalu dapat di-escape tanpa ambiguitas.
if (IsWindowsBatchFile(options.file))
  err = UV_EINVAL;

if (err == 0) {
  err = uv_spawn(env->event_loop(), &wrap->process_, &options);
  wrap->MarkAsInitialized();
}

Daftar Periksa Penguatan Sistem Rekayasa

Sumber