Kompresi Brotli sudah menjadi bagian sehari-hari di dunia web Indonesia: CDN, reverse proxy, dan browser memakainya untuk menghemat bandwidth. Karena itu, celah memori di dekoder Brotli bukan sekadar isu satu pustaka. Pada 21 Oktober 2026, proyek Node.js merilis pembaruan keamanan untuk menambal CVE-2026-111497, yang di kalangan peneliti dijuluki Node2Shell (sebagian vendor menyebutnya Broccoli2Shell). Celah ini adalah out-of-bounds write pada dekoder Brotli dan dapat berujung pada crash proses, kebocoran isi memori, hingga potensi eksekusi kode jarak jauh. Bagi tim web dan backend di Indonesia yang banyak memakai Node.js, Express, dan kontainer, artikel ini merangkum cara kerja celah tersebut, siapa yang benar-benar terpapar, dan langkah praktis yang bisa dikerjakan hari ini.
Ringkasan Cepat
- Jenis celah: out-of-bounds write pada dekoder Brotli (kode C upstream) yang diwarisi banyak produk.
- Prasyarat serangan: aplikasi mendekompresi data Brotli yang dikendalikan penyerang. Tidak perlu autentikasi.
- Versi Node.js yang diperbaiki: 22.23.4, 24.22.1, dan 26.12.1.
- Status eksploitasi: sumber-sumber yang kami tinjau (Akamai, Wiz, Imperva) tidak melaporkan eksploitasi nyata di lapangan; yang ada adalah demonstrasi oleh peneliti. Status ini dapat berubah cepat, sehingga perlu dipantau.
- Tingkat keparahan: Akamai memberi skor CVSS 9,2 (kritis), sedangkan Node.js sendiri menilainya tinggi. Wiz dan Imperva tidak mencantumkan skor numerik. Perbedaan ini wajar dan sebaiknya tidak dijadikan alasan menunda penambalan.
Bagaimana Celah Ini Bekerja
Format Brotli membagi data menjadi blok-blok, dan aliran data dapat memberi sinyal pergantian tipe blok. Menurut analisis Akamai dan Imperva, akar masalahnya ada pada penanganan pergantian blok yang tidak valid. Alih-alih menganggapnya sebagai kesalahan format permanen, dekoder melaporkan bahwa ia "butuh input lebih banyak". Dekoder streaming lalu terus menambahkan input ke sebuah penyangga internal berukuran delapan byte dan menulis melewati ujungnya. Hasilnya adalah korupsi memori yang berada di bawah kendali data masukan.
Perbaikan upstream di proyek google/brotli membuat dekoder mengembalikan galat format khusus untuk kondisi ini dan menolak aliran yang cacat. Node.js mengimpor perbaikan tersebut pada rilis keamanannya.
Catatan realistis: menurut Imperva, demonstrasi eksekusi kode pada Node.js 24.22.0 (Linux arm64) hanya berhasil setelah beberapa kali percobaan dan tidak selalu. PoC publik pertama hanya mencapai eksekusi kode pada build uji yang sengaja dilemahkan; pada build standar hasilnya crash dan pembacaan memori terbatas. Artinya, risiko paling mendesak saat ini adalah gangguan layanan dan kebocoran memori, namun jangan menganggap RCE mustahil.
Jalur Paparan yang Perlu Diperiksa
Server HTTP Node.js polos tidak mendekode isi permintaan Brotli dengan sendirinya. Paparan muncul lewat beberapa jalur berikut.
1. Parser body Express 5 dan body-parser 2
Parser express.json(), express.urlencoded(), express.text(), dan express.raw() mendekompresi isi permintaan dengan header Content-Encoding: br karena opsi inflate bernilai true secara bawaan. Imperva menguji Express 5.0.0 hingga 5.3.0 dan body-parser 2.0.0 hingga 2.3.0. Penyerang cukup mengirim permintaan POST bertubuh Brotli cacat ke rute mana pun yang memakai parser tersebut, tanpa login.
2. fetch() bawaan Node.js
API fetch() otomatis mendekompresi respons Brotli. Server yang dikuasai atau dibajak penyerang dapat membalas dengan data cacat, sehingga klien Anda yang menjadi korban. Ini relevan untuk layanan yang memanggil API pihak ketiga, webhook, pengambil URL (misalnya fitur pratinjau tautan), dan agen AI yang mengambil halaman web.
3. Pemanggilan langsung modul zlib
Kode yang meneruskan data tak tepercaya ke zlib.brotliDecompress() atau zlib.createBrotliDecompress() terpapar langsung.
4. Komponen lain yang memakai pustaka Brotli
Wiz mencatat bahwa celah ada di dekoder C upstream, sehingga dampaknya meluas. Versi yang diperbaiki antara lain: Google Brotli 1.0.10, 1.1.1, dan 1.2.1; paket Python Brotli 1.2.1 dan brotlicffi 1.2.1.0; Bun 1.4.4; Envoy 1.36.12, 1.37.8, 1.38.6, 1.39.3, dan 1.40.0; Istio 1.29.9, 1.30.6, dan 1.31.2; serta pustaka Go andybalholm/brotli v1.2.7. Salinan yang ditautkan statis atau dibundel di dalam produk lain juga bisa terdampak.
Versi yang Terdampak dan Masalah End-of-Life
Jalur Node.js 22.x, 24.x, dan 26.x terdampak sebelum versi perbaikan di atas. Jalur yang sudah dihentikan, seperti 25.x, 23.x, 20.x, dan yang lebih lama, tidak akan menerima perbaikan. Banyak perusahaan di Indonesia masih menjalankan Node 18 atau 20 di kontainer lama; bagi mereka, satu-satunya jalan adalah pindah ke jalur yang masih didukung. Akamai memperkirakan 61% jaringan yang ditelemetrinya menjalankan versi Node.js yang terdampak, gambaran betapa luasnya permukaan serangan ini.
Langkah 1: Inventarisasi, Termasuk yang Tersembunyi
Daftar paket di repositori saja tidak cukup, sebab biner Node.js sering dibundel di dalam image kontainer atau artefak lain. Mulailah dari yang menghadap internet.
# Versi Node.js pada host
node --version
# Versi Node.js di dalam image kontainer yang berjalan
docker ps --format '{{.Names}}' | while read c; do
echo -n "$c: "; docker exec "$c" node --version 2>/dev/null || echo "tidak ada node"
done
# Versi Express dan body-parser pada proyek
npm ls express body-parser
# Pustaka Brotli pada proyek Python
pip show Brotli brotlicffi 2>/dev/null | grep -E "Name|Version"
Di Kubernetes, periksa juga sidecar dan gateway seperti Envoy dan Istio, karena keduanya ada dalam daftar versi terdampak. Catat layanan yang menerima permintaan dari internet atau mengambil konten dari sumber eksternal.
Langkah 2: Tambal dan Bangun Ulang
- Naikkan Node.js ke 22.23.4, 24.22.1, atau 26.12.1 (atau yang lebih baru) pada jalur yang Anda pakai.
- Perbarui image dasar, lockfile, dan pustaka yang dibundel, lalu bangun ulang dan sebarkan ulang.
- Mulai ulang proses dan pastikan versi yang dimuat memang sudah yang baru. Menambal paket tanpa restart tidak menutup celah.
- Untuk jalur end-of-life, rencanakan migrasi ke jalur yang didukung; tidak ada perbaikan yang akan datang.
Langkah 3: Mitigasi Sementara Bila Belum Bisa Menambal
Node.js tidak menyediakan solusi sementara di dalam runtime, sehingga pembaruan tetap satu-satunya perbaikan menyeluruh. Selama menunggu jendela perawatan, beberapa langkah berikut dapat menekan risiko.
- Nonaktifkan dekompresi isi permintaan bila aplikasi tidak membutuhkannya. Pada body-parser, atur
inflate: false; permintaan terkompresi akan menerima HTTP 415. - Tolak
Content-Encoding: brdi tepi (WAF, reverse proxy, atau API gateway) sebelum sampai ke aplikasi. - Batasi lalu lintas keluar dari host rentan dan lakukan segmentasi jaringan agar layanan Node.js tidak dapat dijangkau sembarangan, seperti yang disarankan Akamai.
- Manfaatkan aturan penyedia: Imperva menambahkan aturan WAF dan Vercel menambahkan aturan masuk pada 21 Oktober. Keduanya bukan pengganti pembaruan, dan aturan Vercel tidak mencakup respons Brotli yang diambil dari server lain.
Contoh konfigurasi Express 5 yang menonaktifkan dekompresi isi permintaan:
import express from 'express';
const app = express();
// Sementara: tolak body terkompresi (HTTP 415) sampai Node.js ditambal
app.use(express.json({ inflate: false }));
app.use(express.urlencoded({ extended: false, inflate: false }));
Langkah 4: Deteksi dan Pemantauan
Belum ada indikator kompromi (IoC) spesifik yang dipublikasikan. Fokuskan pemantauan pada perilaku.
- Lonjakan crash atau restart proses Node.js yang tidak biasa, terutama setelah permintaan POST ke rute ber-parser body.
- Permintaan masuk dengan
Content-Encoding: brpada layanan yang sebelumnya tidak pernah menerimanya. - Anomali pada proses Node.js: proses anak yang tidak lazim, koneksi keluar baru, atau akses berkas di luar kebiasaan.
- Pada layanan yang memakai
fetch()ke sumber eksternal, tinjau pula crash yang bertepatan dengan pengambilan konten dari domain yang tidak dikenal.
Jika ada indikasi eksploitasi, perlakukan sebagai insiden: isolasi host, amankan log dan citra memori untuk analisis forensik, lalu rotasi seluruh rahasia (kunci API, token, kredensial basis data) yang dapat diakses proses tersebut.
Konteks Indonesia: Kewajiban Hukum dan Prioritas
Bagi penyelenggara sistem elektronik, penambalan celah kritis bukan hanya urusan teknis. Pasal 35 UU Pelindungan Data Pribadi (UU No. 27 Tahun 2022) mewajibkan pengendali data menjaga keamanan data pribadi dari pengaksesan tidak sah, dan pasal 46 mengatur pemberitahuan kegagalan pelindungan data pribadi. Aplikasi web yang menyimpan data pelanggan dan berjalan di Node.js yang belum ditambal akan sulit dibela bila terjadi kebocoran. Dari sisi UU ITE, akses ilegal ke sistem elektronik adalah tindak pidana bagi penyerang; sebaliknya, pengujian kerentanan di sistem milik pihak lain tanpa izin juga berisiko hukum. Uji celah ini hanya pada lingkungan milik Anda sendiri atau yang sudah memberi izin tertulis.
Untuk menentukan urutan kerja, gunakan prioritas sederhana: (1) layanan yang menerima permintaan dari internet dan memakai Express 5 atau body-parser 2; (2) layanan yang memakai fetch() untuk mengambil konten dari sumber tak tepercaya, termasuk agen AI dan fitur pratinjau tautan; (3) gateway dan service mesh seperti Envoy dan Istio; (4) layanan internal; (5) lingkungan pengembangan dan CI.
Pelajaran yang Lebih Luas
Node2Shell mengulang pola yang sering muncul: celah di pustaka kecil yang tertanam jauh di dalam rantai dependensi, lalu muncul di mana-mana. Tiga pelajaran praktis. Pertama, miliki inventaris perangkat lunak yang mencakup biner yang dibundel, bukan hanya daftar paket; SBOM membantu di sini. Kedua, anggap dekompresi sebagai pemrosesan input tak tepercaya: parser, dekoder, dan dekompresor adalah permukaan serangan klasik. Ketiga, siapkan proses penambalan yang bisa menjangkau image kontainer dalam hitungan jam, bukan minggu. Menariknya, celah ini ditemukan oleh peneliti dari OpenAI Codex Security, menandakan bahwa penemuan kerentanan berbantuan AI makin mempercepat siklus pengungkapan; pembela perlu mempercepat siklus penambalannya.
Penutup
Hingga sumber-sumber yang kami tinjau terbit, belum ada laporan eksploitasi nyata CVE-2026-111497, dan eksekusi kode pada build standar masih sulit dicapai. Namun jendela ini biasanya singkat, karena detail teknis sudah publik dan PoC telah beredar. Tim web sebaiknya segera memeriksa versi Node.js, Express, dan body-parser, menambal ke versi yang diperbaiki, dan memasang mitigasi sementara di tepi jaringan bila penambalan perlu waktu. Tim Siberindo siap membantu audit inventaris perangkat lunak, threat hunting, dan penguatan pipeline penambalan bagi organisasi Anda.
Sumber: Akamai Security Research (analisis CVE-2026-111497), Wiz (advisori Broccoli2Shell), Imperva Red Team via The Hacker News, dan SecurityWeek. Periksa selalu advisori resmi Node.js untuk versi terkini.



