Apakah Versi Node.js Anda Rentan terhadap RCE Brotli? Cek dalam 2 Menit

CVE-2026-111497 adalah bug pada dekoder Brotli di Node.js yang tengah aktif dieksploitasi. Periksa versi Anda hanya dalam dua menit, cari tahu framework dan HTTP client mana saja yang mengakses dekoder tersebut, lakukan patching sesuai metode instalasi, dan terapkan mitigasi jika Anda belum bisa...

Ashley Innocent

Ashley Innocent

5 November 2026

Apakah Versi Node.js Anda Rentan terhadap RCE Brotli? Cek dalam 2 Menit

Apidog untuk Perusahaan

Penerapan On-Premises

SSO & RBAC

Sesuai SOC 2

Jelajahi Apidog Enterprise

Jalankan perintah ini sekarang. Jika versi Anda berada di bawah batas minimum pada tabel berikut, kerentanan RCE Brotli pada Node.js (CVE-2026-111497) berdampak pada sistem Anda, dan para penyerang sudah mulai mengeksploitasinya secara aktif.

node -v
Lini Rilis Rentan Versi Perbaikan Terbaru (5 Nov 2026)
26.x Di bawah 26.12.1 26.12.1 26.13.0
24.x Di bawah 24.22.1 24.22.1 24.22.2
22.x Di bawah 22.23.4 22.23.4 22.23.4
25.x, 20.x, dan versi lebih lama End-of-Life: tidak ditambal dan tidak dinilai Tidak ada perbaikan Beralihlah ke versi 24 atau 26

Untuk memastikannya lebih lanjut, periksa langsung ke binary-nya:

node -p "require('node:zlib').constants.BROTLI_DECODER_ERROR_FORMAT_BLOCK_SWITCH"

Patch perbaikan menambahkan konstanta ini. Kami mengujinya pada sembilan build resmi macOS dari tiga lini rilis yang didukung: setiap build yang telah diperbaiki mencetak -17, sedangkan setiap build lama mencetak undefined. Utamakan hasil dari node -v, karena distro Linux yang melakukan backport patch mungkin tidak menambahkan konstanta tersebut.

Abaikan process.versions.brotli. Nilainya tetap menampilkan 1.2.0 baik pada 24.21.0 maupun 24.22.1, serta 1.1.0 pada 22.23.3 dan 22.23.4. Node.js melakukan cherry-pick terhadap patch tersebut tanpa mengubah versi yang dilaporkan, sehingga nilai ini tidak dapat menunjukkan apakah sistem Anda sudah ditambal atau belum.

Ringkasan Singkat (TL;DR)

Pertanyaan Jawaban
Apa kerentanan ini? Out-of-bounds write pada dekoder Brotli bawaan Node.js, dikenal juga sebagai Node2Shell atau HTTP2Shell
Dampak Crash, kebocoran memori (memory disclosure), atau eksekusi kode jarak jauh (RCE)
Tingkat Keparahan HIGH menurut Node.js; 9.8 CRITICAL (CVSS 3.1) menurut NVD
Sudah dieksploitasi? Ya. CISA KEV memasukkannya ke katalog pada 27 Oktober 2026
Perlu login/autentikasi? Tidak, berdasarkan vektor NVD dan analisis Akamai
Siapa yang terdampak? Aplikasi yang mendekode data Brotli dari sumber yang tidak tepercaya: body request Express 5, respons fetch(), pemanggilan langsung node:zlib
Solusi perbaikan Tingkatkan versi runtime, bangun ulang container image, restart proses
Apakah ada mitigasi sementara? Pemberitahuan resmi tidak mencantumkannya. Langkah mitigasi sementara di bawah dapat mengurangi paparan risiko tetapi tidak mencakup semuanya
Timeline of CVE-2026-111497: Node.js fixes on October 21, CVE published October 22, exploit traffic reported October 26, CISA KEV listing October 27, KEV due date November 10, next Node.js security release November 11

ELLIO melaporkan adanya lalu lintas eksploitasi pada sensor mereka per 26 Oktober, lima hari setelah patch dirilis. Payload yang tertangkap menargetkan Node.js 24.22.0 pada arsitektur x86-64. Tahap akhir payload tersebut gagal dalam pengujian ELLIO, tetapi ELLIO juga mengonfirmasi bahwa eksekusi kode memang dapat dicapai pada build standar 24.22.0. CISA memberikan tenggat waktu bagi lembaga federal AS hingga 10 November untuk mengambil tindakan, dan menandai status penggunaan ransomware sebagai "Unknown". Telemetri Akamai mencatat bahwa 61% jaringan menjalankan versi yang terdampak per 26 Oktober.

Memahami Node2Shell: Cara Kerja Bug Brotli

Node2Shell merupakan kerentanan out-of-bounds write pada dekoder Brotli bawaan runtime Node.js. Aliran data terkompresi yang rusak (malformed) menyebabkan dekoder menulis melampaui batas akhir buffer internal berukuran delapan bita, sehingga merusak memori proses. Dampaknya bisa berupa aplikasi crash, kebocoran memori, hingga eksekusi kode arbitrer yang dikendalikan penyerang di server Anda.

Penyebab utamanya adalah klasifikasi error yang keliru. Switch blok yang tidak valid teridentifikasi sebagai pesan "membutuhkan lebih banyak input" dan bukannya "data ini rusak", sehingga dekoder streaming terus menambahkan bita ke dalam buffer kecil tersebut.

Bug ini berasal dari pustaka Brotli milik Google, versi 1.0.3 hingga 1.2.0, sehingga masalah ini tidak hanya terbatas pada Node.js. Node.js memperbaikinya dengan melakukan cherry-pick terhadap commit upstream 0ed4268a ke dalam rilis 24.22.1 dan lini rilis sejenis lainnya. Peneliti OpenAI Codex Security, Khai Tran dan Sylvie Mayer, adalah pihak yang pertama kali melaporkannya.

Pemindai dependensi Anda tidak akan mendeteksi kerentanan ini, karena dekoder terpasang langsung di dalam runtime, bukan sebagai dependensi paket. Perintah npm install melaporkan 0 kerentanan pada proyek uji Express 5 kami saat dijalankan pada Node.js 24.15.0 yang belum ditambal.

Siapa Saja yang Rentan Terdampak

Runtime yang rentan barulah separuh dari faktor pemicu. Separuh lainnya adalah adanya jalur yang meneruskan data Brotli dari sumber yang tidak tepercaya ke dalam dekoder. Kami menguji setiap jalur pada Node.js 24.22.1 dengan mengirimkan request body rusak yang tidak berbahaya (teks not-valid-brotli) dengan header Content-Encoding: br, serta menyajikan data Brotli yang valid ke setiap klien.

Jalur Versi yang Diuji Menjalankan Dekoder? Hasil yang Terlihat
Express 5 express.json() 5.3.0 (body-parser 2.4.0) Ya, secara default 400, “Decompression failed”
Express 4 express.json() 4.22.3 (body-parser 1.20.9) Tidak 415, unsupported encoding
Koa @koa/bodyparser 6.1.0 Ya, secara default 500, error BrotliDecoder pada log
Fastify dengan @fastify/compress 9.3.0 Ya, setelah didaftarkan 400, FST_CP_ERR_INVALID_CONTENT
Fastify standar (plain) 5.12.8 Tidak 400, invalid JSON
Server dasar node:http atau http.get 24.22.1 Tidak Bita mentah diteruskan langsung
Fungsi bawaan fetch() 24.22.1 Ya, selalu Mendekode respons
axios, got, node-fetch 1.21.0, 16.2.0, 3.3.2 Ya, secara default Mendekode respons
zlib.brotliDecompress*, createBrotliDecompress Semua versi Ya Ini merupakan API dekoder langsung
Diagram of paths into the Brotli decoder in node:zlib: Express 5 parsers, Koa body parsers and Fastify with @fastify/compress on the inbound side, fetch, axios and got on the outbound side, while Express 4, plain Fastify and bare node:http do not reach it

Ada dua temuan yang perlu diperhatikan lebih cermat. fetch() tetap mendekode Brotli meski request menyertakan header Accept-Encoding: identity, karena ia membaca header respons dari server, bukan permintaan dari klien. Server luar mana pun yang dihubungi oleh aplikasi Anda dapat memicu dekoder ini, sehingga fitur penguji webhook, penampil pratinjau tautan, atau pengimpor URL menjadi sangat rentan. Selain itu, status 400 saja tidak membuktikan apa-apa: Express 5 dan Fastify standar sama-sama mengembalikan status 400, tetapi hanya Express 5 yang benar-benar mengeksekusi dekoder. Periksa pesan error-nya secara detail.

Temukan jalur yang berisiko pada proyek Anda menggunakan tiga perintah berikut:

# Penggunaan dekoder langsung
grep -rnE "brotliDecompress|createBrotliDecompress" src/

# Parser yang mendekode body request
npm ls express body-parser @koa/bodyparser @fastify/compress

# Base image dan versi yang dikunci
grep -rnE "^FROM .*node" --include='Dockerfile*' .

Cukup satu pemanggilan fetch() baru untuk mengubah seluruh kondisi ini. Jadi, status "tidak terdampak saat ini" tetap berarti Anda harus segera melakukan patch.

Cara Menambal (Patch) CVE-2026-111497

Tingkatkan ke build terbaru pada lini rilis yang Anda gunakan, jangan hanya berhenti pada batas versi minimum. Sumber-sumber berikut telah menyediakan build yang diperbaiki per 5 November:

Metode Instalasi Langkah yang Harus Dilakukan
nvm nvm install 24 && nvm alias default 24
Homebrew brew upgrade node (atau node@24, node@22)
Docker FROM node:24.22.2-slim, lalu jalankan docker build --pull
Paket distro Linux Ikuti panduan keamanan dari distro Anda, karena mereka mungkin melakukan backport patch di bawah nomor versi lama
CI Perbarui .nvmrc, engines, dan node-version, lalu bangun ulang (rebuild)
Serverless Cetak log process.version dari fungsi yang telah di-deploy; jangan berasumsi platform otomatis memperbaruinya

Kemudian tangani dua celah yang sering terlewatkan:

Terakhir, jalankan pemeriksaan yang tertera di bagian awal artikel ini di dalam container yang berjalan, lalu di runner CI serta perangkat para developer. Untuk melihat build keamanan terbaru per lini rilis:

curl -s https://nodejs.org/dist/index.json | jq -r '[.[] | select(.security == true and (.version | test("^v(22|24|26)\\.")))] | group_by(.version | split(".")[0]) | .[] | max_by(.date) | "\(.version)  \(.date)"'

Masih menggunakan Node.js versi 20 atau 25? Tidak ada build perbaikan yang tersedia untuk Anda. Baca rencana End-of-Life Node.js 20 dan segera lakukan migrasi.

Mitigasi Brotli Node.js Jika Belum Bisa Melakukan Patch Hari Ini

Langkah-langkah ini dapat mengulur waktu, tetapi tidak ada yang bisa menggantikan pembaruan versi secara menyeluruh.

  1. Tolak header br di level edge. Blokir header Content-Encoding: br di reverse proxy atau load balancer Anda, dengan pencocokan case-insensitive dan pemeriksaan nilai gabungan seperti gzip, br.
  2. Tolak di tingkat aplikasi. Tempatkan middleware ini sebelum parser request body Anda. Middleware ini mengembalikan respons 415 pada pengujian Express 5 kami:
app.use((req, res, next) => {
  const encoding = req.headers['content-encoding'] || '';
  if (/\bbr\b/i.test(encoding)) return res.status(415).end();
  next();
});
  1. Nonaktifkan dekompresi otomatis (inflation). Opsi express.json({ inflate: false }) mengembalikan 415 untuk request yang sama. Cara ini juga menolak body terkompresi gzip, jadi pastikan dampaknya terhadap klien Anda terlebih dahulu.
  2. Kendalikan respons keluar (outbound responses). axios mendukung konfigurasi decompress: false, yang dalam pengujian kami membiarkan bita tetap dalam bentuk aslinya tanpa didekode. fetch() tidak memiliki opsi penonaktifan standar, jadi batasi host mana saja yang dapat diaksesnya menggunakan allowlist dan aturan egress jaringan.
  3. Batasi dampak kerusakan (blast radius). Terapkan segmentasi pada layanan Node.js, dan batasi izin akses terhadap file core dump, mengingat ELLIO mencatat bahwa insiden crash dapat mengekspos data memori di dalam dump tersebut.

Waspadai anomali yang pertama kali diamati oleh ELLIO: lonjakan request body terenkripsi Brotli yang bertujuan memetakan host mana saja yang mengeksekusi dekoder tersebut. Kemunculan trafik Content-Encoding: br yang tidak terduga pada API JSON, atau lonjakan crash pada proses worker, patut segera diinvestigasi.

Pastikan API Anda Berjalan Normal Pasca-Upgrade: Manfaatkan AI Agent

Peningkatan versi runtime dapat memengaruhi perilaku TLS, DNS, dan HTTP, dan pembaruan Oktober menyentuh ketiganya sekaligus. Jangan membandingkan perubahannya secara manual. Biarkan coding agent Anda menjalankan Apidog CLI sebelum dan sesudah upgrade, lalu laporkan jika ada anomali atau perubahan perilaku.

npm install -g apidog-cli@latest
apidog login --with-token <YOUR_TOKEN>
npx -y skills add https://apidog.com   # pick your agent when prompted

Berikan instruksi (prompt) berikut kepada agent Anda:

Run Apidog test suite <id> in project <id> against staging and save the
results to reports/before. After I upgrade Node.js, add a test case for
POST /orders that sends the plain text "not-valid-brotli" with
Content-Encoding: br, asserts a 4xx status, then checks GET /health
returns 200. Rerun the suite to reports/after and list every request
whose result changed.

Agent akan menjalankan rangkaian perintah berikut:

apidog run --test-suite <id> --project <id> -e <envId> -r cli,junit --out-dir reports/before
apidog cli-schema get test-case-create
apidog cli-schema validate test-case-create --file case.json
apidog test-case create --project <id> --file case.json
apidog run --test-case <caseId> --project <id> -e <envId> -r cli,json
apidog run --test-suite <id> --project <id> -e <envId> -r cli,junit --out-dir reports/after

Test case tambahan tersebut berfungsi sebagai health check dan bukan exploit: body-nya hanyalah teks biasa, dan pada pengujian kami menghasilkan error padding yang serupa baik pada build rentan maupun build yang telah diperbaiki. Namun, tes ini berhasil mengungkap celah nyata: pengujian Koa kami mengembalikan 500 karena decode error tidak ditangani dengan benar, padahal API publik seharusnya mengembalikan status 4xx. Jalankan pengujian ini hanya di lingkungan staging.

Halaman referensi perintah run memuat daftar seluruh parameter yang tersedia, dan panduan CI/CD membantu Anda mengintegrasikan eksekusi laporan JUnit yang sama ke pipeline pengujian. Paket Gratis Apidog mencakup hingga 4 pengguna.

Mengapa Rilis 11 November Patut Diantisipasi

Proyek Node.js telah mengumumkan jadwal rilis keamanan berikutnya untuk lini 26.x, 24.x, dan 22.x pada atau sekitar 11 November 2026, yang kembali mencakup tingkat keparahan HIGH. Belum ada nomor CVE yang dipublikasikan saat ini. Panduan rilis November kami menjelaskan langkah-langkah persiapan yang perlu dilakukan.

Terapkan patch untuk bug Brotli sekarang juga alih-alih menundanya hingga jadwal rilis tersebut tiba. Detail bug dan lalu lintas serangan aktif sudah terjadi di lapangan hari ini, dan proses upgrade yang Anda lakukan minggu ini dapat menjadi latihan berharga untuk rilis mendatang: inventaris dependensi yang sama, pembangunan ulang image yang sama, serta test suite yang sama. Pola serangan PHP2Shell dan React2Shell sebelumnya juga berkembang dengan cara yang serupa.

Tanya Jawab (FAQ)

Apakah CVE-2026-111497 saat ini sedang dieksploitasi? Ya. CISA telah memasukkannya ke dalam katalog Known Exploited Vulnerabilities pada 27 Oktober 2026 di bawah entri Google Brotli, dan ELLIO telah mencatat lalu lintas eksploitasi aktif sejak 26 Oktober.

Apakah tingkat keparahannya masuk kategori High atau Critical? Kedua label tersebut valid. Tim Node.js menetapkannya sebagai HIGH. NVD memberikan skor 9.8 CRITICAL berdasarkan CVSS 3.1, dan metrik CVSS 4.0 yang dirilis Google memberinya skor 9.2. Antisipasi langkah penanganan Anda berdasarkan fakta bahwa celah ini sudah dieksploitasi di dunia nyata.

Saya masih menggunakan Express 4. Apakah sistem saya aman? Request body pada aplikasi Anda memang tidak mencapai dekoder, namun panggilan keluar melalui fetch(), axios, maupun penggunaan langsung pustaka node:zlib tetap dapat memicunya. Selain itu, rilis patch ini juga memperbaiki sembilan CVE lainnya, jadi Anda tetap disarankan untuk segera melakukan upgrade.

Apakah Node.js versi 20 terdampak? Tim pengembang Node.js tidak lagi mengevaluasi lini rilis yang sudah End-of-Life (EOL), dan versi tersebut tidak menerima perbaikan keamanan. Perlakukan Node.js 20.x dan 25.x sebagai versi yang rentan dan belum ditambal, lalu segera rencanakan migrasi.

Apakah celah ini berdampak pada komponen di luar Node.js? Ya. Pemberitahuan keamanan GitHub mencakup paket PyPI brotli dan brotlicffi, serta perbaikan resmi juga telah dilaporkan untuk Bun 1.4.4 dan .NET. Perbarui masing-masing dekoder tersebut secara terpisah, karena upgrade pada Node.js hanya menambal pustaka internal miliknya sendiri.

Mengembangkan API dengan Apidog

Apidog adalah alat pengembangan API yang membantu Anda mengembangkan API dengan lebih mudah dan efisien.