Sepekan terakhir, satu celah keamanan beredar dengan tiga nama. Node.js mengumumkannya pada 21 Oktober bersama rilis keamanannya, Wiz menyebutnya Broccoli2Shell, dan sejak 23 Oktober sebagian besar media keamanan memakai nama HTTP2Shell. Ketiganya merujuk ke CVE-2026-111497, celah out-of-bounds write di decoder Brotli buatan Google dengan skor 9.2 (kritis) di CVSS 4.0. Namanya sebenarnya menyesatkan karena bug ini tidak ada hubungannya dengan protokol HTTP/2. Yang membuatnya berbahaya adalah banyaknya runtime, library, dan proxy yang diam-diam membuka data Brotli tanpa Anda sadari. Tim Imperva sudah berhasil menjalankan kode di image Node.js yang belum di-patch, dan kode proof-of-concept sudah beredar di publik. Kalau aplikasi Anda berkomunikasi lewat HTTP, sisihkan waktu minggu ini untuk mengeceknya.
Sebenarnya Bug-nya di Mana
Brotli adalah format kompresi di balik header Content-Encoding: br. Browser, CDN, dan hampir semua HTTP client mendukungnya karena hasil kompresi teksnya lebih kecil daripada gzip. Decoder-nya berupa library C kecil yang dikelola Google, dan hampir setiap ekosistem bahasa pemrograman memakai library itu atau membawa salinannya sendiri.
Masalahnya ada di decoder streaming. Saat bertemu block switch yang tidak valid di data terkompresi, decoder melaporkannya sebagai "butuh input lagi", bukan "data ini rusak". Akibatnya decoder terus menunggu dan terus menambahkan byte baru ke buffer internal yang panjangnya hanya delapan byte, sampai menulis melewati batasnya. Tergantung susunan memori, hasilnya bisa berupa crash, kebocoran isi memori, atau, kalau penyerangnya cukup teliti, eksekusi kode.
Versi yang terdampak adalah Brotli 1.0.3 sampai 1.2.0. Google merilis perbaikan untuk tiga jalur sekaligus pada 21 Oktober: 1.0.10, 1.1.1, dan 1.2.1. Menariknya, perbaikan kodenya sudah masuk ke repositori sejak Februari 2026 tanpa label keamanan. Itu sebabnya sebagian kecil vendor ternyata sudah aman, sementara kebanyakan belum.
Dua Jalan Masuk: Request dan Response
Syarat eksploitasinya cuma satu: aplikasi Anda membuka data Brotli yang dikendalikan penyerang. Itu bisa terjadi dari dua arah, dan kebanyakan saran awal yang beredar hanya membahas arah pertama.
- Masuk (inbound): klien mengirim request body dengan Content-Encoding: br, lalu framework, middleware, atau proxy mendekompresinya sebelum sampai ke kode Anda. Contohnya middleware request decompression di ASP.NET Core dan filter decompressor di Envoy.
- Keluar (outbound): aplikasi Anda mengambil data dari sebuah URL, lalu server tujuan membalas dengan response terkompresi Brotli. fetch di Node.js, requests dan urllib3 di Python (kalau paket Brotli terpasang), HttpClient di .NET dengan dekompresi otomatis, dan curl yang di-build dengan Brotli semuanya langsung membukanya. Pengiriman webhook, preview link, crawler, callback ke API pihak ketiga, dan fitur "impor dari URL" termasuk jalur seperti ini.
Jalur keluar inilah yang paling sering terlewat. Peneliti yang mengetes Python menemukan bahwa urllib3 dengan paket Brotli versi lama tetap membuka response br meskipun request-nya jelas meminta Accept-Encoding: identity. Server jahat tidak perlu minta izin untuk mengirim data terkompresi. Memblokir request Brotli di WAF tidak berpengaruh apa pun untuk arah ini.
Jalurnya bahkan tidak harus HTTP. Peneliti JFrog berhasil mencapai decoder yang sama lewat FFmpeg menggunakan gambar JPEG XL yang dimodifikasi, dan lewat Apache Arrow dengan input 534 byte yang membuat pyarrow terjebak di loop tanpa akhir. Selama ada data Brotli dari luar yang dibuka, celah ini relevan.
Versi Aman per Stack
Tabel di bawah merangkum perbaikan yang sudah rilis sampai 27 Oktober. Vendor kadang menerapkan perbaikan ke versi lama tanpa mengganti nomor versinya (backport), jadi kalau distro Anda menyebut sebuah paket sudah aman walaupun nomornya terlihat lama, ikuti advisory-nya, bukan angkanya.
| Stack | Versi aman | Catatan |
|---|---|---|
| Brotli (library C) | 1.0.10, 1.1.1, 1.2.1 | Terdampak: 1.0.3 sampai 1.2.0 |
| Node.js | v22.23.4, v24.22.1, v26.12.1 | Node.js 20 ke bawah sudah end of life dan tidak dapat perbaikan |
| Bun | 1.4.4 | Binary hasil bun build --compile harus di-build ulang |
| Python Brotli / brotlicffi | 1.2.1 / 1.2.1.0 | Ikut terpasang lewat requests, urllib3, httpx[brotli], aiohttp, Scrapy |
| .NET runtime | 8.0.33, 9.0.22, 10.0.14 | .NET Framework tidak terdampak; aplikasi self-contained harus di-publish ulang |
| PowerShell | 7.4.22, 7.5.13, 7.6.9 | Membawa runtime .NET sendiri |
| PHP untuk Windows | 8.5.12-1, 8.4.27-1, 8.3.36-1, 8.2.35-1 | Paket build ulang; php -v tetap menampilkan nomor lama |
| Ekstensi PHP brotli | 0.21.1 | Hanya kalau Anda memasangnya lewat PECL |
| Ruby gem brotli | 0.9.1 | |
| Java brotli4j | 1.24.0 | Sudah membawa Brotli 1.2.1 |
| Go andybalholm/brotli | v1.2.7 | Port murni Go; terdampak sebelum v1.2.7 menurut Wiz |
| Envoy | 1.40.0, 1.39.3, 1.38.6, 1.37.8, 1.36.12 | Atau matikan filter Brotli decompressor |
| Istio | 1.31.2, 1.30.6, 1.29.9 | Memakai Envoy untuk sidecar dan gateway |
| Git for Windows | 2.56.0.windows.4 | curl bawaannya ikut membuka Brotli |
| ClickHouse, DuckDB, Apache Arrow | Perbaikan sudah atau akan di-merge | Belum ada rilis resmi per 26 Oktober |
Kenapa Update Paket Sistem Saja Tidak Cukup
Menjalankan apt upgrade memang memperbaiki libbrotli di server, dan itu penting untuk nginx dengan modul ngx_brotli, curl, serta program lain yang memakai library bersama. Masalahnya, banyak program yang paling sering terpapar justru membawa salinan Brotli sendiri:
- Node.js menanam Brotli langsung di dalam binary node. Hanya rilis Node.js baru yang memperbaikinya, dan proses lama tetap menjalankan kode lama sampai di-restart.
- Paket wheel Python untuk Brotli dan brotlicffi membawa decoder-nya sendiri. Sistem operasi yang sudah bersih tidak menolong virtualenv yang masih berisi Brotli==1.2.0.
- Build .NET self-contained dan NativeAOT menyertakan runtime di dalamnya. Update runtime di level mesin tidak menyentuh aplikasi seperti ini.
- Image container membekukan apa pun yang terpasang saat di-build. Tag node:24 yang Anda pull bulan lalu tetap berisi 24.22.0 atau lebih lama sampai Anda pull ulang dan build ulang.
- Go dan Bun menghasilkan satu binary utuh. Perbaikan baru berlaku setelah Anda build ulang dengan dependensi yang sudah di-patch, lalu deploy.
Cara Menemukan Semua Salinan Brotli
- 1Cek runtime di setiap server dan image: node -v, bun --version, dotnet --list-runtimes, pwsh --version. Jalankan di dalam container, bukan di host, lalu bandingkan dengan tabel di atas.
- 2Cek paket sistem: dpkg -l '*brotli*' di Debian dan Ubuntu, rpm -q brotli di RHEL dan SUSE, apk info -v brotli di Alpine.
- 3Cek dependensi aplikasi: pip show Brotli brotlicffi dan pipdeptree -r -p Brotli untuk Python, gem list brotli untuk Ruby, go list -m all | grep brotli untuk Go, dan cari brotli4j di pom.xml atau build.gradle untuk Java. Periksa juga lockfile, karena paket ini biasanya ikut terpasang sebagai dependensi tidak langsung.
- 4Jalankan scanner yang biasa Anda pakai terhadap image, bukan hanya source code. Trivy, Grype, pip-audit, dan npm audit sudah mengenali CVE ini. Perlu dicatat, npm audit tidak akan menandai Node.js itu sendiri, karena bug-nya ada di runtime, bukan di paket npm.
- 5Untuk kode C yang disalin langsung ke repositori, cari BROTLI_DECODER_ERROR_FORMAT_BLOCK_SWITCH. Kode error itu baru ditambahkan oleh perbaikan ini, jadi salinan decode.c yang tidak memilikinya berarti versi lama.
- 6Build ulang dan deploy, lalu restart semua proses, worker, consumer antrean, dan cron job yang masih menjalankan build lama. File yang sudah di-patch di disk tidak berarti apa-apa untuk proses yang sudah jalan sejak kemarin.
Kalau Belum Bisa Patch Hari Ini
Langkah sementara tetap membantu, tetapi masing-masing hanya menutup sebagian masalah:
- Tolak request dengan Content-Encoding: br di load balancer atau WAF. Cloudflare dan Azure WAF sudah merilis aturan untuk ini, tetapi keduanya hanya melihat lalu lintas masuk.
- Matikan dukungan Brotli untuk panggilan keluar kalau memungkinkan. Di Python, menghapus paket Brotli dan brotlicffi membuat urllib3 dan requests kembali ke gzip. Di Bun, opsi decompress: false mematikan dekompresi otomatis per request.
- Di Envoy dan Istio, matikan filter Brotli decompressor sampai proxy-nya di-upgrade.
- Pantau crash dan restart yang tidak jelas penyebabnya di layanan yang sering melakukan panggilan HTTP keluar. Proses Node.js atau .NET yang tiba-tiba segfault padahal sebelumnya stabil layak diperiksa.
Satu peringatan: tidak lama setelah nama HTTP2Shell populer, muncul token kripto bernama $HTTP2SHELL. Token itu sama sekali tidak ada hubungannya dengan perbaikan. Satu-satunya obat yang sebenarnya adalah update software.
Mulai dari Mana
Wiz melaporkan 91% lingkungan cloud yang mereka pantau memiliki setidaknya satu resource yang rentan. Angka ini wajar untuk library yang dipakai seluas Brotli. Anda tidak perlu membereskan semuanya sekaligus. Mulailah dari layanan publik yang melakukan panggilan HTTP ke URL yang bisa dipengaruhi pengguna, lalu API gateway dan proxy, kemudian layanan internal, dan terakhir laptop developer serta CI runner yang sering menjalankan Node.js dan Git for Windows versi lama selama berbulan-bulan.
Untuk kebanyakan tim di Indonesia, itu berarti tiga pekerjaan konkret minggu ini: naikkan semua server dan image Docker Node.js ke v22.23.4 atau v24.22.1, update Brotli di project Python lalu build ulang image-nya, dan pasang update Debian, Ubuntu, atau Alpine di server yang menjalankan nginx dengan Brotli aktif. Kalau tim Anda tidak punya cukup orang untuk melakukannya di banyak server, pekerjaan rutin seperti inilah yang seharusnya sudah ditangani oleh layanan managed service.
Poin penting
- HTTP2Shell, Node2Shell, dan Broccoli2Shell adalah bug yang sama: CVE-2026-111497, out-of-bounds write di Brotli 1.0.3 sampai 1.2.0, diperbaiki di 1.0.10, 1.1.1, dan 1.2.1.
- Ini bukan celah HTTP/2. Kode apa pun yang membuka data Brotli dari luar bisa terpapar, termasuk response yang diambil aplikasi Anda dari server lain.
- Node.js (v22.23.4, v24.22.1, v26.12.1), Python Brotli 1.2.1, .NET (8.0.33, 9.0.22, 10.0.14), Bun 1.4.4, Envoy, Istio, dan PHP untuk Windows sudah punya rilis perbaikan.
- Update paket sistem operasi tidak cukup untuk runtime yang membawa Brotli sendiri. Build ulang image container, publish ulang aplikasi self-contained, dan restart semua proses yang berjalan.
- Memblokir request Brotli di WAF hanya melindungi lalu lintas masuk. Anggap itu solusi sementara, lalu tetap lakukan patch.


