PHP2Shell: Kerentanan Kritikal Pre-Auth RCE (CVE-2026-109618 & CVE-2026-109619) Goncang Ekosistem Web
Analisis teknikal mendalam mengenai kerentanan PHP2Shell yang membolehkan Pre-Authentication Remote Code Execution (RCE) pada enjin PHP, visual Proof of Concept (PoC), dan langkah pemulihan kecemasan.
Dunia keselamatan siber dan infrastruktur web baru-baru ini dikejutkan dengan pendedahan dua kerentanan berimpak kritikal yang digelar sebagai PHP2Shell (CVE-2026-109618 dan CVE-2026-109619). Kerentanan ini dinilai dengan skor CVSS 9.2 (Critical) dan membolehkan penyerang tanpa pengesahan (unauthenticated) mencapai Remote Code Execution (RCE) secara terus pada pelayan web.
Liputan meluas daripada media sekuriti global seperti The Hacker News serta amaran kecemasan daripada penyedia cloud mengesahkan bahawa kerentanan ini bukan sekadar teori makmal—ia telah dikesan dieksploitasi secara aktif (in the wild) oleh rangkaian botnet dan kumpulan ancaman siber.
Dalam artikel ini, kita akan membedah secara teknikal bagaimana PHP2Shell berfungsi, melihat visual simulasi Proof of Concept (PoC), punca kerentanan (root cause), dan tindakan segera yang perlu diambil oleh sysadmin, DevOps, dan jurutera keselamatan.
Visual Proof of Concept (PoC)
Berikut adalah simulasi pelaksanaan eksploitasi Proof of Concept (PoC) ke atas pelayan sasaran yang menjalankan versi PHP terkesan:

Aliran Serangan Dalam Gambar PoC:
- Target Discovery: Skrip eksploit mengenal pasti pelayan sasaran yang mengendalikan enjin PHP terkesan (contohnya
PHP/8.3.15di atas pelayan Apache/PHP-FPM). - Memory Limit Trigger: Penyerang menghantar aliran data bersegmen (chunked multipart request) bersama pengepala pengesanan progress muat naik (
session.upload_progress). - Out-of-Memory (OOM) Bailout: Permintaan memicu had
memory_limitPHP, memaksa enjin Zend memanggilzend_error()dan melompat keluar melaluilongjmp()tanpa membersihkan pemegang peruntukan memori (memory allocator structures). - Heap Grooming & Pointer Overwrite: Alamat memori yang tertinggal (stale chunk) digunakan untuk membina bingkai data
zend_execute_datapalsu, memintas penunjuk fungsizend_execute_internalkepadasystem()dalam pustaka C standard (libc). - Reverse Shell Drop: Pelayan terdedah terus mengeksekusi arahan sistem dan membuka sesi terminal interaktif di bawah pengguna perkhidmatan web (
uid=33(www-data)).
Mengapa PHP2Shell Begitu Berbahaya?
Kebanyakan kerentanan RCE pada aplikasi web biasanya berlaku di peringkat kod aplikasi atau framework (contohnya kecuaian pada sanitization input dalam WordPress plugin, modul Drupal, atau ralat deserialisasi).
Namun, PHP2Shell berbeza dan jauh lebih berbahaya:
- Peringkat Enjin Teras (Core Zend Engine): Kerentanan ini wujud dalam enjin pelaksanaan C PHP itu sendiri (
zend_alloc.c, pengurusan memori, dan pengendalian ralat pemuatan fail). - Bebas CMS atau Kod Aplikasi: Tidak kira apa jua skrip yang dijalankan—sama ada laman WordPress, aplikasi Laravel moden, mahupun sekadar fail
index.phpkosong—pelayan tetap terdedah selagi enjin PHP memproses permintaan HTTP multipart. - Pre-Authentication: Penyerang tidak memerlukan akaun, kata laluan, atau akses pentadbir. Serangan dilancarkan dari luar sepenuhnya.
- Kebal Saringan WAF Biasa: Muatan eksploitasi tidak menggunakan kod PHP yang mencurigakan seperti
<?php system($_GET['cmd']); ?>yang lazimnya dikesan oleh Web Application Firewall (WAF). Sebaliknya, ia mengeksploitasi tingkah laku peruntukan memori peringkat rendah (low-level memory allocation state).
Anatomi Teknikal: Bedah Siasat CVE-2026-109618 & CVE-2026-109619
Menurut laporan teknikal bersama daripada penyelidik di Wiz, Calif, dan OpenAI (yang memanfaatkan teknik AI-assisted fuzzing dan analisis varian), serangan ini menggabungkan dua kelemahan asas:
[Attacker Request: Chunked Upload]
│
▼
[Trigger PHP memory_limit]
│
▼
[zend_error(E_ERROR) -> longjmp()] <-- CVE-2026-109618
│
(Request cleanup bypassed,
dangling allocator pointers retained)
│
▼
[Subsequent Request: Heap Spray] <-- CVE-2026-109619
│
(Stale session.upload_progress metadata
collides with forged zend_execute_data)
│
▼
[Hijack zend_execute_internal -> system()]
│
▼
[Interactive /bin/sh Shell (www-data)]
1. CVE-2026-109618: Keruntuhan Memori OOM Melalui longjmp
Dalam arkitektur enjin Zend PHP, apabila sesuatu ralat maut (fatal error) berlaku—seperti kehabisan had memori (Allowed memory size of X bytes exhausted)—enjin akan memanggil fungsi zend_bailout().
Fungsi ini menggunakan fungsi C standard setjmp() / longjmp() untuk melompat keluar daripada hierarki panggilan fungsi dan menghentikan pemprosesan permintaan.
Isu timbul apabila permintaan multipart stream yang besar diproses. Sekiranya OOM berlaku di tengah-tengah pengiraan metadata muat naik fail, lompatan longjmp() melangkau pembersihan memori rutin (destructors dan pembebasan memori per-permintaan). Ini menyebabkan penunjuk memori (stale pointers) kekal terapung dalam struktur global atau cache peruntukan memori pelayan yang dikongsi antara permintaan seterusnya (terutamanya dalam persekitaran jangka panjang seperti PHP-FPM atau mod_php).
2. CVE-2026-109619: Eksploitasi Stale State ke Arah RCE
Kelemahan kedua mengeksploitasi ciri terbina dalam PHP: pengesanan kemajuan muat naik fail (session.upload_progress).
Dengan menghantar rentetan nama muat naik yang dikawal rapi, penyerang boleh menyusun susun atur memori (heap grooming / spraying) sehingga penunjuk memori terbiar daripada CVE-2026-109618 bertindih tepat dengan objek boleh laku Zend (zend_function / zend_execute_data).
Apabila pemprosesan ralat backtrace dijana, penunjuk fungsi pelaksanaan dalaman dialihkan kepada fungsi sistem sistem operasi (libc system atau execve), membolehkan penyerang melaksanakan arahan shell bebas.
Contoh corak muatan HTTP yang digunakan oleh penyelidik PoC:
POST /index.php HTTP/1.1
Host: vulnerable-target.com
Content-Type: multipart/form-data; boundary=---------------------------974767299852498929531610575
Content-Length: 2048
Transfer-Encoding: chunked
-----------------------------974767299852498929531610575
Content-Disposition: form-data; name="PHP_SESSION_UPLOAD_PROGRESS"; filename="pwn"
Content-Type: text/plain
AAAA[Controlled Heap Spray Payload...]AAAA
-----------------------------974767299852498929531610575
Content-Disposition: form-data; name="file"; filename="dummy.bin"
[Streamed payload sized precisely to trip 128M/256M memory_limit]
-----------------------------974767299852498929531610575--
Telemetri & Serangan Aktif Di Dunia Sebenar
Sebaik sahaja butiran teknikal bocor ke platform umum, aktiviti eksploitasi automatik mula melonjak:
- Rangkaian Honeypot Amazon (MadPot): Pengkaji keselamatan dari Amazon Web Services (AWS) melaporkan pengesanan cubaan imbasan berskala besar yang menyasarkan pelayan PHP di seluruh dunia dalam tempoh kurang 24 jam selepas berita disiarkan oleh The Hacker News.
- Varian Mirai & Mozi Botnet: Pengendali botnet dikesan mengubah suai skrip penyebaran pantas (droppers) mereka untuk menghantar skrip downloader bash (
curl ... | sh) bagi menukar pelayan web terkompromi menjadi nod serangan DDoS dan ejen perlombongan kripto (cryptominer).
Versi PHP Yang Terkesan & Tampalan Rasmi
Skop kesan kerentanan ini sangat luas kerana logik peruntukan memori ini telah wujud sejak sekian lama dalam kod asas PHP:
| Status | Versi Terkesan | Versi Tampalan Selamat (Patched) |
|---|---|---|
| PHP 8.5 | <= 8.5.11 | PHP 8.5.12 |
| PHP 8.4 | <= 8.4.26 | PHP 8.4.27 |
| PHP 8.3 | <= 8.3.35 | PHP 8.3.36 |
| PHP 8.2 | <= 8.2.34 | PHP 8.2.35 |
| EOL (PHP 5.4 - 8.1) | SEMUA TERKESAN | Tiada tampalan upstream rasmi |
[!WARNING] Bagi sistem yang masih menggunakan versi PHP yang telah mencapai fasa tamat hayat (End-Of-Life seperti PHP 7.4, 8.0, atau 8.1), pihak pembangun PHP rasmi tidak mengeluarkan tampalan keselamatan. Organisasi wajib menaik taraf versi ke cawangan yang disokong atau menggunakan repositori LTS pihak ketiga yang disahkan (seperti Ubuntu Pro ESM atau Red Hat Enterprise Linux backports).
Panduan Mitigasi & Langkah Pemulihan Segera
Bagi memastikan infrastruktur anda selamat daripada serangan PHP2Shell, ikuti langkah keutamaan berikut:
1. Kemaskini Enjin PHP ke Versi Terkini (Langkah Utama)
Pada pelayan berasaskan Debian / Ubuntu:
sudo apt update
sudo apt --only-upgrade install php*-fpm php*-cli php*-common
sudo systemctl restart php*-fpm
sudo systemctl restart nginx # atau apache2
Untuk persekitaran kontena Docker / Kubernetes:
Pastikan fail Dockerfile anda menarik base image versi terkini yang telah mengandungi patch:
# Kemaskini daripada versi terkesan (cth: php:8.3.15-fpm) kepada:
FROM php:8.3.36-fpm-alpine
2. Mitigasi Sementara (Workaround) Jika Kemaskini Segera Terhalang
Sekiranya aplikasi anda memerlukan masa untuk ujian regresi sebelum kemaskini versi boleh dibuat, anda boleh menyahaktifkan ciri pemantauan muat naik sesi dalam php.ini:
; Dalam fail /etc/php/*/fpm/php.ini dan /etc/php/*/cli/php.ini:
session.upload_progress.enabled = Off
Nyahaktifkan ciri ini dan mulakan semula servis PHP-FPM:
sudo sed -i 's/session.upload_progress.enabled = On/session.upload_progress.enabled = Off/g' /etc/php/*/*/php.ini
sudo systemctl reload 'php*-fpm'
Menyahaktifkan session.upload_progress.enabled mematikan vektor grooming memori utama yang diperlukan oleh eksploitasi CVE-2026-109619 untuk mencapai RCE.
3. Pengetatan Peringkat Reverse Proxy (Nginx / Cloudflare)
Sekat permintaan fail multipart yang mencurigakan di peringkat proksi hadapan sebelum ia sampai kepada PHP-FPM:
# Contoh had buffer Nginx untuk mengehadkan saiz request body yang melampau
client_max_body_size 10M;
client_body_buffer_size 128k;
# Hadkan atau sekat header chunked encoding yang tidak diperlukan
if ($http_transfer_encoding ~* "chunked") {
# Nilai risiko mengikut keperluan aplikasi anda
}
4. Prinsip Defense-in-Depth (Kekang Reverse Shell)
Walaupun enjin aplikasi terdedah, sistem operasi tidak sepatutnya membenarkan pelayan web menjalankan arahan pentadbir secara bebas:
- Jalankan proses PHP-FPM dengan
read-only root filesystempada kontena Docker (read_only: true). - Gugurkan semua kebenaran kernel Linux yang tidak diperlukan (
cap_drop: ["ALL"]). - Gunakan profil AppArmor atau SELinux bagi menyekat pengguna
www-datadaripada memanggil/bin/shatau membuat sambungan rangkaian keluar (outbound TCP sockets) ke alamat IP yang tidak dikenali.
Kesimpulan
Penemuan PHP2Shell membuktikan bahawa walaupun teknologi bahasa pengaturcaraan seperti PHP telah matang dan digunakan oleh sebahagian besar laman sesawang dunia, komponen dalaman peringkat memori (low-level runtime) masih boleh menyembunyikan pepijat kritikal yang mampu membuka pintu belakang tanpa disedari.
Dengan kepantasan botnet mengeksploitasi kelemahan ini sebaik sahaja didedahkan oleh portal seperti The Hacker News, tindakan menaik taraf enjin PHP atau mematikan fungsi session.upload_progress.enabled harus dilaksanakan oleh setiap pentadbir sistem tanpa berlengah.