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 |

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 |

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:
- Restart semua proses. Proses yang sedang berjalan tetap menyimpan binary lama di dalam memori. Mengupgrade versi pada disk tidak mengubah apa pun sampai pm2, systemd, atau orchestrator Anda me-restart proses tersebut.
- Bangun ulang image yang telah di-deploy. Image lama tetap membawa runtime lama, dan container image yang dikunci menggunakan hash digest perlu dipindai ulang karena tag versi saja tidak bisa memastikan keamanannya.
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.
- Tolak header
brdi level edge. Blokir headerContent-Encoding: brdi reverse proxy atau load balancer Anda, dengan pencocokan case-insensitive dan pemeriksaan nilai gabungan sepertigzip, br. - 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();
});
- 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. - 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. - 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.
