HTTP2Shell (CVE-2026-111497): Satu Celah Brotli, Update Darurat di Node.js, Python, .NET, PHP, dan Lainnya

HTTP2Shell bukan celah di protokol HTTP/2. Ini bug memori di decoder Brotli milik Google, dan bisa dijangkau oleh aplikasi apa pun yang membuka data Brotli dari luar. Stack mana yang terdampak, versi perbaikannya, cara menemukan salinan Brotli yang tersembunyi, dan kenapa update satu paket hampir tidak pernah cukup.

Dipublikasikan 9 menit baca
Kabel jaringan biru dan abu-abu tertancap di patch panel bernomor

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.

StackVersi amanCatatan
Brotli (library C)1.0.10, 1.1.1, 1.2.1Terdampak: 1.0.3 sampai 1.2.0
Node.jsv22.23.4, v24.22.1, v26.12.1Node.js 20 ke bawah sudah end of life dan tidak dapat perbaikan
Bun1.4.4Binary hasil bun build --compile harus di-build ulang
Python Brotli / brotlicffi1.2.1 / 1.2.1.0Ikut terpasang lewat requests, urllib3, httpx[brotli], aiohttp, Scrapy
.NET runtime8.0.33, 9.0.22, 10.0.14.NET Framework tidak terdampak; aplikasi self-contained harus di-publish ulang
PowerShell7.4.22, 7.5.13, 7.6.9Membawa runtime .NET sendiri
PHP untuk Windows8.5.12-1, 8.4.27-1, 8.3.36-1, 8.2.35-1Paket build ulang; php -v tetap menampilkan nomor lama
Ekstensi PHP brotli0.21.1Hanya kalau Anda memasangnya lewat PECL
Ruby gem brotli0.9.1
Java brotli4j1.24.0Sudah membawa Brotli 1.2.1
Go andybalholm/brotliv1.2.7Port murni Go; terdampak sebelum v1.2.7 menurut Wiz
Envoy1.40.0, 1.39.3, 1.38.6, 1.37.8, 1.36.12Atau matikan filter Brotli decompressor
Istio1.31.2, 1.30.6, 1.29.9Memakai Envoy untuk sidecar dan gateway
Git for Windows2.56.0.windows.4curl bawaannya ikut membuka Brotli
ClickHouse, DuckDB, Apache ArrowPerbaikan sudah atau akan di-mergeBelum 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

  1. 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.
  2. 2Cek paket sistem: dpkg -l '*brotli*' di Debian dan Ubuntu, rpm -q brotli di RHEL dan SUSE, apk info -v brotli di Alpine.
  3. 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.
  4. 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.
  5. 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.
  6. 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.
Bagikan artikel ini

Artikel terkait

Artikel lain tentang software development, AI, cloud, dan infrastruktur.

Deretan laci katalog perpustakaan dari kayu dengan pegangan logam dan label kertasKeamanan

8 menit baca

phpMyAdmin dan PHP2Shell: Tidak Ada CVE Baru phpMyAdmin, tapi Instalasi Anda Tetap Terancam

Bulan ini tidak ada CVE baru untuk phpMyAdmin, dan tidak ada versi phpMyAdmin baru untuk di-install. Namun phpMyAdmin 5.2.3 termasuk aplikasi yang terbukti bisa diambil alih lewat PHP2Shell tanpa login. PHP mana yang sebenarnya menjalankan phpMyAdmin Anda, cara patch di Debian, Docker, cPanel, Plesk, dan Synology, langkah darurat yang hampir tanpa biaya, dan cara mengecek apakah server Anda sudah dimasuki.

Kode PHP di layar editor berlatar gelap, difoto dari sampingKeamanan

9 menit baca

Celah Keamanan Laravel Oktober 2026: Bypass Login TokenGuard, Perbaikan Livewire, dan PHP2Shell

Pada 19 Oktober Laravel mengumumkan celah kritis di TokenGuard (CVE-2026-114509) yang memungkinkan login sebagai user lain, ditambah satu bug penghapusan data. Livewire menambal bypass otorisasi di #[Authorize], dan PHP sendiri perlu di-patch untuk PHP2Shell. Aplikasi mana yang terdampak, versi yang harus dipasang, dan langkah update yang tidak melupakan queue worker.

Mari berdiskusi

Sedang mencari partner untuk pengembangan software?

Ceritakan proyek yang sedang Anda bangun, kebutuhan yang ingin diselesaikan, dan tantangan yang dihadapi. Kami dapat membantu membahas pendekatan teknis, scope, timeline, dan estimasi biaya.

Mulai diskusi