flawopen.com/Teardowns/cve-2024-27980-nodejs-windows-batch-injection
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.
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
Aplikasi memanggil API proses
Di Windows, aplikasi memakai child_process.spawn() atau spawnSync() untuk menjalankan .bat/.cmd dengan argumen yang mungkin dipengaruhi input eksternal.
Targetnya file batch
File batch mengikuti aturan shell; daftar argumen saja tidak mencegah interpretasi metakarakter.
Windows menafsirkan argumen
Perilaku rentan dapat menafsirkan argumen sebagai sintaks perintah meskipun shell: false.
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
// 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.
// 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
- ✓Perbarui ke Node.js yang masih didukung dan memuat perbaikan
CVE-2024-27980sertaCVE-2024-36138. - ✓Hindari menjalankan skrip batch dengan input eksternal; utamakan executable langsung dengan argumen tervalidasi.
- ✓Jika shell tak dapat dihindari, perlakukan shell: true sebagai eksekusi perintah dan terapkan validasi serta otorisasi ketat.
- ✓Tambahkan tes regresi Windows untuk
spawn(),spawnSync(), dan ekstensi batch serta pastikan penolakan aman dengan EINVAL.