Node2Shell: Bukti Nyata Eksekusi Kode Jarak Jauh pada Runtime Node.js Resmi
Analisis teknis CVE-2026-111497, eksploitasi decoder Brotli bawaan Node.js, dan implikasinya bagi ekosistem backend di Indonesia.
Anggapan bahwa menggunakan build resmi dari sebuah runtime populer berarti sepenuhnya aman kini terbantahkan. Tim peneliti keamanan dari Imperva baru-baru ini mendemonstrasikan bahwa data Brotli yang dirancang khusus dapat memaksa aplikasi yang berjalan di atas build resmi Node.js 24.22.0 untuk mengeksekusi kode yang dikirimkan oleh penyerang. Eksploitasi ini diberi nama Node2Shell.
Yang membuat temuan ini sangat signifikan adalah eksekusi tersebut berhasil dilakukan pada image resmi Node.js untuk arsitektur Linux arm64—tanpa debugger, tanpa build kustom—hanya dengan menyuapkan data yang dirancang khusus ke decoder Brotli bawaan. Node.js sendiri telah mengungkap celah ini sebagai CVE-2026-111497 dan merilis perbaikannya pada 21 Oktober 2026.
Daftar Isi
- Ringkasan Temuan Kunci
- Aplikasi Apa Saja yang Terdampak?
- Anatomi Kerentanan
- Bagaimana Node.js Memperbaikinya?
- Langkah Mitigasi untuk Tim Developer
- Mengapa Ini Penting bagi Developer Indonesia?
Ringkasan Temuan Kunci
Demonstrasi Imperva ini melampaui proof-of-concept publik pertama yang sebelumnya hanya berhasil mengeksploitasi build pengujian yang sengaja dilemahkan. Pada build standar, PoC pertama dilaporkan hanya menyebabkan crash dan pembacaan memori terbatas—bukan eksekusi kode. Yang membuat temuan Imperva berbeda: mereka berhasil melakukannya di build resmi yang dipakai produksi.
Meski berhasil, uji Imperva tidak selalu sukses di setiap percobaan. Eksekusi kode membutuhkan beberapa kali percobaan pada setup Linux arm64 mereka. Hasil ini hanya mencakup satu build dan satu konfigurasi aplikasi—arsitektur lain serta lini Node.js 22.x dan 26.x belum diuji secara menyeluruh.
Pada rilis yang sudah diperbaiki (24.22.1), data yang sama berhasil ditolak dan tidak ada kode yang dieksekusi.
Aplikasi Apa Saja yang Terdampak?
Celah ini berada pada decoder Brotli yang dibundel Node.js. Artinya, dampaknya tidak terbatas pada satu build yang diuji Imperva, melainkan mencakup aplikasi yang berjalan di lini Node.js 22.x, 24.x, dan 26.x. Sebuah layanan bisa mencapai decoder tersebut dari dua sisi pertukaran HTTP:
- Sisi Response: Ketika aplikasi membaca response berkompresi Brotli melalui fungsi bawaan
fetch()milik Node.js. - Sisi Request: Ketika middleware melakukan decoding terhadap request body yang dikompresi Brotli. Express 5 adalah salah satu contoh paling umum.
Body parser Express 5—seperti express.json(), express.urlencoded(), express.text(), dan express.raw()—kini melakukan decoding terhadap request body Brotli saat diterapkan pada sebuah rute. Jika aplikasi Express 5 Anda menerima payload Brotli dari klien yang tidak dipercaya, Anda berpotensi terdampak.
Sebaliknya, plain Node.js HTTP server tidak otomatis melakukan decoding terhadap request body Brotli hanya dengan menerimanya. Proses decoding membutuhkan middleware tersebut, atau pemanggilan eksplisit di kode aplikasi.
Anatomi Kerentanan
Imperva menelusuri akar masalahnya hingga ke cara decoder menangani sebuah titik yang mustahil dalam stream Brotli. Stream Brotli mengumumkan jenis-jenis blok yang akan digunakan saat decoding berjalan. Dalam input uji mereka, data mencapai sebuah perubahan blok yang secara struktural tidak mungkin terjadi menurut aturan stream itu sendiri.
Decoder yang rentan membaca situasi itu sebagai permintaan untuk lebih banyak input—lalu terus berjalan dalam state yang tidak valid. Dalam pengujian terpisah menggunakan memory sanitizer, kelanjutan dari state tersebut menulis melewati batas buffer yang seharusnya—inilah out-of-bounds write yang menjadi inti dari celah ini.
Eksploitasi memanfaatkan logika internal decoder yang salah menafsirkan data rusak sebagai instruksi sah. Ini klasik "state confusion" yang berujung pada kerusakan memori.
Bagaimana Node.js Memperbaikinya?
Node.js memperbaiki celah ini dengan mengimpor patch Brotli dari upstream (hulu). Patch tersebut membuat decoder berhenti dengan format error pada titik tersebut, bukan melanjutkan dalam state yang tidak valid. Sederhananya: alih-alih "mencoba terus" saat menemukan data aneh, decoder sekarang memilih "berhenti dan lapor error". Ini mematikan celah eksploitasi.
Langkah Mitigasi untuk Tim Developer
Perbaikannya adalah dengan segera pindah ke rilis yang sudah di-patch:
- Update Node.js: Pindah ke Node.js 24.22.1 atau rilis patch terkait di lini 22.x dan 26.x.
- Periksa Container Image: Update juga perlu mencapai container image dan artefak lain yang membundel binary Node—hal yang sering terlewat dalam inventarisasi paket.
- Lini End-of-Life: Node.js 20.x dan versi sebelumnya tidak menerima fix. Harus dipindahkan ke lini yang masih didukung.
- Tidak Ada Workaround di Runtime: Advisory resmi tidak menyebutkan workaround dalam Node.js. Hanya update yang benar-benar menghilangkan celah.
Jika belum bisa segera update, aplikasi harus mencari mitigasi tambahan di lapisan lain. Imperva menyarankan membatasi traffic Brotli yang tidak dipercaya pada jalur-jalur yang terdampak, dan menambahkan aturan pada Web Application Firewall (WAF) untuk memblokir payload eksploitasi. Namun, hanya update yang benar-benar menghilangkan celah. WAF hanya lapisan pertahanan sementara.
Mengapa Ini Penting bagi Developer Indonesia?
Node.js adalah salah satu runtime paling populer untuk backend di Indonesia. Express 5 dengan mudah ditemukan di proyek-proyek startup, fintech, e-commerce, hingga pemerintahan daerah. Banyak developer mengasumsikan bahwa menggunakan build resmi dari Docker Hub berarti aman. Temuan Node2Shell membuktikan bahwa build resmi pun bisa memiliki celah yang bisa dieksploitasi jika input yang diproses tidak dipercaya.
Rekomendasi praktis untuk tim developer:
- Audit versi Node.js di semua layanan produksi hari ini juga—jangan menunggu.
- Identifikasi penggunaan Express 5 dengan body parser yang melakukan decoding Brotli secara otomatis.
- Periksa pemakaian
fetch()untuk memanggil API eksternal yang mungkin mengembalikan data terkompresi Brotli. - Update container image—jangan hanya
npm update, karena celah ada di binary Node, bukan di paket NPM. - Verifikasi build ulang setelah update—pastikan image baru benar-benar menggunakan Node 24.22.1 atau versi patch lain yang sesuai.
- Terapkan WAF sebagai lapisan tambahan selama proses rollout.
- Perketat kebijakan Content-Encoding—jika aplikasi Anda tidak membutuhkan Brotli dari klien, tolak atau batasi header
Content-Encoding: br.
Node2Shell adalah pengingat bahwa rantai pasok perangkat lunak—termasuk decoder yang dianggap "sudah teruji"—tetap bisa memiliki celah. Update bukan opsional; itu bagian dari pekerjaan.
Celah semacam ini mengingatkan kita bahwa keamanan bukan hanya soal menulis kode yang benar. Ini soal memastikan seluruh rantai pasok—runtime, library, dan container—selalu dalam kondisi paling aman. Bagi tim developer di Indonesia, langkah paling penting hari ini adalah segera update ke Node.js 24.22.1 atau rilis patch terkait. Jangan menunggu insiden terjadi pada aplikasi Anda.
Artikel Terverifikasi
Artikel ini terdaftar resmi di Data Cyber Indonesia.
DCY-ART-2026-009
Verifikasi keaslian →