PHP Luncurkan Pembaruan Keamanan Windows Kedua dalam Lima Hari Tangani Celah Brotli

PHP telah membangun ulang paket resmi Windows untuk versi PHP 8.2 hingga 8.5 guna mengatasi CVE-2026-111497, sebuah kerentanan pada pustaka kompresi Brotli bawaan paket tersebut. Celah keamanan ini dapat memungkinkan penyerang merusak memori dan berpotensi mengeksekusi kode berbahaya.

Pihak PHP menyatakan bahwa kelemahan ini dapat diakses melalui ekstensi cURL ketika ekstensi tersebut mendekonstruksi atau mengekstrak respons HTTP secara otomatis. Meskipun cURL menonaktifkan fitur tersebut secara bawaan, berbagai aplikasi dan pustaka klien HTTP dapat mengaktifkannya.

Paket kompilasi ulang bernomor 8.5.12-1, 8.4.27-1, 8.3.36-1, serta 8.2.35-1 ini diluncurkan lima hari setelah rilis 21 Oktober yang menambal dua celah remote code execution PHP2Shell. Paket-paket tersebut menggunakan kode sumber PHP yang persis sama sehingga perbaikan sebelumnya tetap bertahan, dan kini menyertakan Brotli 1.2.1 sebagai versi yang telah diperbaiki.

PHP menerbitkan software bill of materials, yang berisi daftar perincian komponen di dalamnya, bersama setiap paket instalasi. Pada kompilasi x64 Non Thread Safe pekan lalu dari keempat versi tersebut, daftar komponen memperlihatkan keberadaan Brotli 1.2.0, salah satu versi yang terpengaruh.

Pihak PHP mengimbau para pengguna sistem Windows untuk segera mengunduh dan memasang build terbaru dari laman unduhan resminya. Oleh karena nomor rilis PHP itu sendiri tidak mengalami perubahan, perintah php -v akan memperlihatkan angka yang identik sebelum maupun sesudah pembaruan. Penambahan angka -1 pada nama berkas, contohnya php-8.5.12-1-nts-Win32-vs17-x64.zip, beserta hash SHA-256 pada halaman unduhan menjadi pembeda untuk build anyar tersebut.

Mekanisme dekompresi otomatis berarti cURL meminta respons terkompresi dari peladen lalu mengekstraknya secara langsung. Pada kode PHP, opsi CURLOPT_ENCODING mengaktifkan perilaku tersebut, dan pengisian nilai kosong berarti menerima seluruh format yang didukung oleh cURL.

Guzzle, salah satu pustaka klien HTTP untuk PHP, menetapkan konfigurasi nilai kosong tersebut secara default untuk panggilan yang dikirimkan via cURL, merujuk kode pada versi 7.16.1 dan 8.3.1. Berdasarkan baris kode itu serta penjelasan PHP sendiri, aplikasi yang mempertahankan preferensi standar Guzzle memenuhi kriteria kerentanan pada kompilasi Windows pekan lalu. Pihak The Hacker News belum menguji skenario ini di lingkungan Windows.

Serangan siber akan hadir berupa payload respons kompresi khusus dari server luar yang dihubungi oleh aplikasi PHP korban.

Google memberikan penilaian tingkat keparahan celah ini pada skor 9.2 dari 10, atau Kritis, berdasarkan skala CVSS 4.0. Sementara itu, Red Hat memberi peringkat 8.1, atau Penting, menurut standar CVSS 3.1.

Peneliti keamanan dari Imperva berhasil melancarkan eksekusi kode melalui celah tersebut pada salah satu paket resmi Node.js setelah beberapa kali percobaan. Pemberitahuan PHP tidak mencatat insiden serangan di dunia nyata. Penilaian CISA per 23 Oktober juga mencatat nihil eksploitasi aktif, serta celah tersebut belum tercantum dalam katalog Known Exploited Vulnerabilities mereka pada pembaruan tanggal terkait.

Para peneliti di OpenAI merupakan pihak pertama yang menemukan bug keamanan ini. Google segera memperbaikinya di Brotli versi 1.2.1, 1.1.1, dan 1.0.10 ketika diumumkan pertama kali pada tanggal 21 Oktober. Node.js, Bun, serta perangkat lunak lain yang menyertakan salinan pustaka Brotli mandiri juga telah membagikan paket perbaikan mereka.

Pengumuman PHP tidak menyajikan langkah mitigasi sementara bagi infrastruktur yang belum memungkinkan untuk diperbarui secara langsung saat ini. OpenAI merekomendasikan penonaktifan dekompresi otomatis Brotli di seluruh klien HTTP sampai penambalan selesai dipasang, serta memperingatkan bahwa langkah menghapus br, pengenal Brotli pada tajuk Accept-Encoding, “sendirian tidak menghentikan server untuk tetap mengirimkannya.”

Dalam skrip PHP, mematuhi instruksi tersebut berarti tidak menyetel parameter CURLOPT_ENCODING sama sekali, sebab cURL tidak mengekstrak data balasan tanpa opsi tersebut. Pada pustaka Guzzle, ini dilakukan dengan mengubah setelan opsi permintaan decode_content ke false, yang sepenuhnya meniadakan proses pembacaan otomatis, sehingga respons kompresi gzip juga akan diterima dalam format terkompresi.