PHP 8.5.12 RCE Patch: The Checklist I Run on Every Server

Petang semalam, saya baru minum separuh kopi bila nasihat keselamatan PHP muncul dalam feed saya, dan kopi itu tak sempat bertahan sampai sepuluh minit kemudian. Dua pepijat remote code execution kritikal, tanpa pengesahan, dan kata-kata pasukan PHP sendiri ialah “update immediately”. Tiada “consider upgrading when convenient”. Ungkapan itu cukup jarang sampai saya berhenti buat kerja.

Versi ringkas untuk yang tak sabar: naik taraf ke PHP 8.5.12, 8.4.27, 8.3.36 atau 8.2.35, mulakan semula worker anda, dan sahkan dengan php -v. Semua di bawah ialah senarai semak yang saya guna, tetapan sementara kalau anda belum boleh patch, dan beberapa tempat yang saya rasa ramai akan tersilap langkah.

Saya bukan penyelidik keselamatan. Saya pembangun yang deploy aplikasi PHP untuk klien dan uruskan beberapa server sendiri, jadi tulisan ini ditulis dari sudut “saya kena patch hari ini dan buktikan ia jalan”. Baca juga sumber utama. Saya letak link sambil jalan.

Apa yang nasihat itu sebenarnya beritahu

Nasihat rasmi di php.net namakan dua pepijat. Yang pertama ialah CVE-2026-109618, yang pasukan itu huraikan sebagai RCE melalui kerosakan out-of-memory. Bila PHP kehabisan memori pada masa yang salah, ia boleh terganggu semasa data permintaan dalaman baru separuh dimulakan, dan kod pembersihan kemudian percaya pada data tidak sah itu. Yang kedua ialah CVE-2026-109619, RCE melalui keadaan global basi. Sesetengah keadaan dalaman milik permintaan masih hidup selepas memorinya dibebaskan, dan permintaan seterusnya pada worker yang sama boleh mengambilnya sebelum proses permulaan biasa menetapkan semula keadaan itu.

Kedua-duanya tanpa pengesahan. Pasukan itu kata risiko paling tinggi untuk mod_php, di mana mereka sudah tunjukkan exploit yang terbukti dan berjalan sebelum sebarang kod aplikasi sempat jalan. Bahagian terakhir itu penting untuk cara anda memandang isu ini. Middleware framework anda, peraturan WAF yang ditulis berdasarkan route anda, halaman login anda: tiada satu pun berada dalam laluan. Pepijat itu duduk di bawah kod anda.

Senarai terjejas luas. PHP-FPM, Apache dengan mod_php, php-cgi, FrankenPHP dan LiteSpeed semuanya dinamakan. Kalau PHP anda menyahut permintaan web, anda termasuk dalam skop. Laravel News liputi keluaran itu dengan status setiap platform, cara paling cepat untuk lihat posisi Forge, Vapor, Cloud dan Envoyer.

Saya sengaja tidak akan huraikan butiran eksploitasi. Saya tidak tahu lebih daripada apa yang dinyatakan dalam nasihat keselamatan, dan meneka lagi buruk daripada berdiam diri.

Versi yang anda guna menentukan langkah anda dalam sejam akan datang.

Inilah cara saya mengasingkan anda, kerana kerja untuk setiap kelompok berbeza.

Jika anda guna 8.2 hingga 8.5, pembaikannya cuma kemas kini pakej atau imej biasa. Changelog 8.5.12 menyenaraikan pembaikan untuk kedua-dua nasihat keselamatan di bawah Core sebagai “Avoid state corruption via bailout”, bersama banyak pembaikan lain, termasuk bug use-after-free dalam DOM dan BZ2 serta kebocoran file descriptor dalam pelayan terbina dalam. Jadi, walaupun bug RCE entah bagaimana tidak menjejaskan anda, ini bukan keluaran yang patut diabaikan.

Jika anda guna 8.1 atau lebih lama, projek PHP sudah tidak mengeluarkan kemas kini untuk anda. Pasukan keselamatan telah menerbitkan backport sumber minimum untuk 7.4, 8.0 dan 8.1 bagi mereka yang membina daripada sumber. Itu memang bermurah hati, tapi saya tidak akan anggap itu sebagai rancangan. Jika anda ada distribusi atau vendor LTS, tanya mereka tentang backport mereka. Jika tidak, inilah minggu ticket “kita akan naik taraf PHP suku tahun depan” menjadi ticket minggu ini. Saya pernah tulis tentang cara saya merancang tempoh naik taraf itu dalam post tentang tempoh sokongan Laravel 13 saya, dan versi ringkasnya ialah menunggu keluaran keselamatan untuk memaksa isu ini diselesaikan merupakan cara yang mahal.

Jika anda guna repo Remi yang diselenggara secara sukarela, baca notis itu dengan teliti. Menurut Laravel News, ia tidak akan menerima kemas kini hari ini, dan pasukan PHP menasihatkan pakej distribusi atau membina daripada sumber sementara itu. Perkara ini sering memerangkap orang kerana “apt upgrade kata tiada apa untuk dilakukan” terasa seperti berita baik.

Senarai semak yang saya guna

Urutan penting di sini, jadi saya kekalkan senarai ini ringkas dan berurutan.

Pertama, cari tahu apa yang anda benar-benar jalankan. Bukan apa yang anda sangka anda jalankan. Pada setiap pelayan:

php -v
php-fpm8.4 -v 2>/dev/null
apachectl -M 2>/dev/null | grep -i php
ps aux | grep -E 'php-fpm|php-cgi|frankenphp|lsphp' | grep -v grep

Versi CLI dan versi FPM boleh berbeza, dan saya pernah tergelincir kerana itu. Sebuah mesin boleh menunjukkan php -v yang sudah ditampal, sementara pool FPM masih menjalankan binary lama kerana tiada siapa memulakan semula pool itu. Itu membawa saya ke langkah kedua: menampal pakej tidak menampal proses yang sedang berjalan. Worker yang dimulakan sebelum kemas kini akan terus menjalankan kod lama sehingga ia dimulakan semula.

sudo apt update && sudo apt install --only-upgrade php8.4-fpm php8.4-cli
sudo systemctl restart php8.4-fpm
# containers: pull the new base image, rebuild, redeploy
docker compose pull && docker compose up -d --build

Ketiga, semak dengan apa yang sedang berjalan, bukan dengan package manager. Untuk FPM, saya semak binary proses master dan masa mula. Untuk container, saya semak image digest bagi apa yang benar-benar aktif.

php-fpm8.4 -v
systemctl show php8.4-fpm --property=ActiveEnterTimestamp
docker compose exec app php -v

Keempat, ingat platform yang tidak menampal sistem anda secara automatik. Menurut catatan status Laravel, Cloud ditampal di tempat, tetapi anda perlu klik Update PHP pada setiap pelayan Forge, dan Vapor perlukan redeploy (deployment baharu, bukan sekadar redeploy, jika anda menggunakan runtime image tersuai atau Docker). Laravel juga menyatakan Forge tiada tampalan untuk PHP 8.0 atau 8.1 dan pelayan Ubuntu 20.04 atau lebih lama tidak boleh mendapatkan update sama sekali. Untuk itu, anda perlukan pelayan baharu pada versi Ubuntu yang disokong. Saya akan matikan pelayan lama sampai anda selesai berpindah.

Kelima, tampal Node juga jika pelayan yang sama menjalankannya. Artikel Laravel News menyebut Node.js security releases dikeluarkan sekali, dan Forge tidak mengemas kini Node untuk anda. Saya belum membaca advisory Node cukup teliti untuk menambah apa-apa, jadi sila baca sendiri.

Jika anda tidak dapat menampal hari ini

Advisory itu ada bahagian untuk situasi ini, dan saya akan membacanya di php.net, bukan daripada ringkasan saya, kerana perincian penting. Pasukan PHP berterus-terang bahawa langkah ini mengurangkan pendedahan kepada laluan serangan tertentu dan tidak menjadikan pemasangan selamat. Anggap ia seperti tali pinggang keledar dalam perjalanan menuju update, bukan pengganti.

Untuk ralat OOM, advisory itu mencadangkan anda menetapkan memory_limit=-1 di tempat yang aplikasi tidak boleh override, dan menetapkan post_max_size yang rendah. Bahagian yang melawan logik ialah had memori tanpa had. Saya boleh bertaruh langkah lebih selamat ialah had yang lebih ketat. Alasannya, had memori PHP yang terhad ialah cara terkawal untuk mencetuskan kegagalan out-of-memory, jadi membuangnya bermakna menyingkirkan tuil itu. Mereka juga menyatakan kegagalan peruntukan asas masih boleh sampai ke laluan yang terdedah, jadi ini setakat separuh jalan sahaja. Mereka juga memberi amaran agar tidak menggunakan RLIMIT_AS atau RLIMIT_DATA sebagai pengganti, kerana ia sendiri boleh mencetuskan kegagalan peruntukan yang terdedah itu.

Beginilah rupa dalam FPM pool, di mana php_admin_value tidak boleh di-override oleh kod aplikasi:

; /etc/php/8.4/fpm/pool.d/www.conf
php_admin_value[memory_limit] = -1
php_admin_value[post_max_size] = 8M
php_admin_value[upload_max_filesize] = 6M
php_admin_value[session.upload_progress.enabled] = 0

Angka 8M itu cadangan advisory untuk aplikasi tanpa muat naik fail, dan 32M untuk aplikasi yang perlukan muat naik, dengan upload_max_filesize tetap di bawah post_max_size. Sesuaikan dengan aplikasi anda.

Untuk bug stale global state, advisory itu menasihatkan anda menetapkan session.upload_progress.enabled=0 dan restart setiap worker, melalui php.ini, FPM pool atau konfigurasi server yang berkuat kuasa sebelum parsing request. Ia secara khusus menyatakan jangan bergantung pada ini_set() atau .user.ini, sebab ia berkuat kuasa terlalu lewat. Ada juga item PHP 8.5 tentang fatal_error_backtraces=0. Sila baca teks penuh, sebab saya cuma merumuskan sebahagian sahaja.

Satu perkara yang saya nak tambah berdasarkan tabiat sendiri, dan ini pendapat, bukan advisory: kalau memori tanpa had buat anda gugup pada VPS kecil, padankan dengan had memori cgroup atau container yang hanya mematikan worker. Advisory itu sendiri mengesyorkan had container atau cgroup sebagai sempadan availability. Pada box saya sendiri, ia berbentuk systemd drop-in dengan MemoryMax pada unit FPM, yang saya bahaskan dalam VPS hardening baseline saya.

Yang saya masih belum pasti

Saya belum tahu berapa banyak pemasangan yang sedang di-probe. Saya belum nampak trafik exploit pada server saya sendiri, dan ketiadaan bukti pada beberapa box tidak bermakna apa-apa. Saya juga tidak boleh beritahu anda sama ada tetapan sementara itu bertahan, sebab advisory itu sendiri tidak terlalu tegas tentangnya.

Soalan terbuka lain ialah log. Kalau penyerang sudah masuk sebelum anda patch, php -v yang bersih tidak beritahu apa-apa tentang masa lalu. Saya sedang periksa log akses web server untuk request yang luar biasa besar atau luar biasa bentuknya sejak 21hb, dan mencari fail serta proses tidak dijangka di bawah web user. Kalau anda menjalankan apa-apa yang ada data klien, anda mungkin perlukan semakan insiden yang sewajarnya, bukan grep one-liners saya. Untuk kerja klien, saya lebih baik tulis e-mel itu sekarang daripada kemudian.

Buat empat perkara ini sebelum anda tutup laptop

Semak versi PHP pada setiap server dan container yang anda miliki, kemudian restart FPM atau Apache dan semak semula versi pada proses yang sedang berjalan. Pindahkan apa sahaja yang masih guna PHP 8.1 atau lebih lama ke versi yang disokong, atau dapatkan komitmen backport bertulis daripada vendor anda. Jika sesuatu server tidak dapat ditampal malam ini, guna tetapan sementara daripada nasihat keselamatan dan jadualkan tampalan dalam kalendar. Dan jika anda jaga laman web klien, hantar nota dua baris kepada setiap klien yang menyatakan apa yang anda tampal dan bila, kerana mereka akan dengar tentang ini dari tempat lain, dan lebih baik makluman datang daripada anda. Jika anda perlukan bantuan untuk sapuan tampalan atau rancangan naik taraf di belakangnya, kerja dan maklumat hubungan saya ada di abrarqasim.com.

Diterbitkan asal di abrarqasim.com. Saya menulis di sana tentang React, PHP, Rust, Go dan perkakas AI di sekelilingnya.


Sumber Rujukan:

  • Artikel asal: Dev.to PHP
  • Diterjemah daripada artikel asal ke Bahasa Melayu oleh AI Editorial – haqis.com
Comments

Similar Posts