PHP2Shell (CVE-2026-109618): Kenapa Semua Server PHP Wajib Patch Hari Ini?

• Security • By TryzTech Team
SecurityPHPCVEDevOpsBackendVulnerabilities
Bagikan

Pada pertengahan Oktober 2026, komunitas keamanan siber dan developer web global diguncang oleh pengumuman kerentanan kritis berskala luas pada core runtime PHP. Dijuluki dengan sebutan “PHP2Shell”, sepasang celah keamanan ini diberi kode resmi CVE-2026-109618 dan CVE-2026-109619.

Dengan skor keparahan CVSS v3.1 mencapai 9.2 hingga 9.8 (Critical), kerentanan ini memungkinkan penyerang tanpa autentikasi (unauthenticated remote attacker) mengeksekusi kode arbitrary langsung di server target (Remote Code Execution / RCE) hanya dengan mengirimkan HTTP request yang dimanipulasi.

Jika server produksi kamu menjalankan aplikasi berbasis PHP (seperti Laravel, Symfony, WordPress, atau custom microservices), artikel ini merangkum semua hal esensial yang wajib kamu pahami: mulai dari akar masalah teknis di level Zend Engine, skenario serangan, hingga langkah patch dan mitigasi darurat.


Ringkasan Eksekutif: Mengapa PHP2Shell Sangat Berbahaya?

Kerentanan ini memiliki kemiripan dampak dengan insiden-insiden besar di masa lalu (seperti Log4Shell atau Shellshock) karena sifatnya yang universal di ekosistem PHP:

  1. Eksploitasi Tanpa Autentikasi: Penyerang tidak perlu memiliki akun, token login, atau kredensial apa pun di aplikasi kamu.
  2. Terjadi Sebelum Kode Aplikasi Berjalan: Pada arsitektur tertentu seperti Apache mod_php, celah ini terpicu saat web server mem-parsing incoming body request sebelum routing atau middleware aplikasi kamu sempat dieksekusi.
  3. Rentang Versi Sangat Lebar: Menyerang hampir seluruh cabang PHP, mulai dari warisan PHP 5.4.x hingga rilis modern PHP 8.2, 8.3, 8.4, dan 8.5 yang belum ditambal.
  4. Permukaan Serangan Luas: Setiap endpoint publik yang menerima HTTP POST (terutama yang mengizinkan form data atau upload file) rentan menjadi target eksploitasi.

Analisis Akar Masalah Teknis (Root Cause)

Untuk memahami bagaimana sebuah HTTP request sederhana bisa membobol server, kita perlu melihat ke dalam implementasi internal C pada Zend Engine PHP.

1. Mekanisme longjmp() dan Batas Memori (memory_limit)

Di bahasa C, PHP menangani alokasi memori internal menggunakan custom memory manager (Zend Memory Manager / Zend MM). Ketika sebuah skrip melampaui batas memori yang ditentukan di php.ini (memory_limit = 128M), PHP tidak bisa melakukan pengembalian fungsi secara normal (graceful unwinding).

Sebaliknya, Zend Engine menggunakan fungsi bawaan C standar yaitu setjmp() dan longjmp() untuk langsung melompat keluar dari tumpukan panggilan (call stack) saat kondisi Out-of-Memory (OOM) terjadi.

Normal Call Stack:
Request Parser -> Allocate Buffer -> Validate Structure -> Execute Script
                                          
OOM Exception via longjmp():
Request Parser -> Allocate Buffer -> [OOM Triggered]
                                           ↓ (longjmp jumps directly to bail-out)
                              Request Shutdown Routine (Bypasses normal cleanup!)

2. Titik Celah saat Parsing multipart/form-data (CVE-2026-109618)

Celah CVE-2026-109618 terjadi di modul parsing konten multipart/form-data milik PHP. Saat menerima upload berkas atau data form yang terpecah dalam boundary:

  1. PHP mulai menginisialisasi struktur data internal untuk menampung field dan stream file.
  2. Parser mendaftarkan pointer struktur data tersebut ke dalam tabel global penampung request sebelum seluruh alokasi memori buffer selesai secara utuh (partial initialization).
  3. Penyerang mengirimkan payload multipart bersarang atau berukuran masif dengan boundary yang dimanipulasi secara presisi sehingga alokasi memori berikutnya menabrak batas memory_limit.
  4. Begitu batas memori terlewati, longjmp() dieksekusi seketika. Pemanggilan destruktor normal dan pembersihan variabel lokal terlewati (unwound secara paksa).
  5. Ketika siklus hidup request memasuki fase Request Shutdown (php_request_shutdown), engine berusaha membersihkan tabel global request. Namun, engine memperlakukan pointer yang baru setengah terinisialisasi tersebut seolah-olah valid.
  6. Hal ini memicu kondisi Use-After-Free / Uninitialized Memory Dereference, memungkinkan penyerang menimpa instruction pointer (RIP/EIP) dan mengarahkan alur eksekusi ke shellcode mereka.

3. Kerentanan Pendamping: CVE-2026-109619

Sementara CVE-2026-109618 berpusat pada parser multipart, CVE-2026-109619 terjadi pada penanganan fatal error general di mana pemanggilan longjmp() meninggalkan pointer memori global (dangling pointers) yang mengarah ke region memori yang telah di-free. Akibatnya sama: memory corruption yang dapat dieksploitasi untuk eksekusi kode jarak jauh.


Tingkat Risiko Berdasarkan Arsitektur SAPI

Tingkat kemudahan eksploitasi PHP2Shell sangat dipengaruhi oleh antarmuka server (SAPI - Server Application Programming Interface) yang digunakan:

Tipe SAPI / Web ServerTingkat RisikoCatatan Arsitektur
Apache dengan mod_phpCRITICAL (Tertinggi)Parsing request dilakukan di dalam proses Apache sebelum request diserahkan ke kode aplikasi. WAF level aplikasi (middleware) tidak dapat melindungi celah ini.
PHP-FPM (Nginx / Caddy / Traefik)HIGHWorker PHP-FPM mem-parsing request body saat diteruskan dari fastcgi gateway. Begitu batas tercapai, worker mengalami crash atau dieksploitasi memory corruption.
FrankenPHP & RoadRunnerHIGHRuntime worker berbasis Go/C yang mempertahankan state persisten. Eksploitasi OOM dapat memengaruhi worker pool yang aktif.
LiteSpeed / OpenLiteSpeedHIGHMemanfaatkan engine LSAPI yang memproses buffer stream request serupa dengan PHP-FPM.
PHP CLI (Cron Jobs / Queue Workers)LOWHanya berisiko jika worker CLI kamu mem-parsing data multipart mentah dari sumber input publik yang tidak terpercaya.

Matriks Versi: Mana yang Terdampak dan Versi Penambal?

Tim inti PHP telah merilis pembaruan keamanan darurat serentak untuk seluruh cabang yang didukung. Periksa versi instalasi PHP di server kamu dengan menjalankan php -v.

Cabang PHPStatus DukunganVersi RentanVersi Aman (Patch)
PHP 8.5Aktif< 8.5.128.5.12 atau lebih baru
PHP 8.4Aktif< 8.4.278.4.27 atau lebih baru
PHP 8.3Keamanan< 8.3.368.3.36 atau lebih baru
PHP 8.2Keamanan< 8.2.358.2.35 atau lebih baru
PHP 8.1 / 8.0 / 7.x / 5.xEnd of Life (EOL)Semua VersiButuh backport distro / upgrade OS segera

[!CAUTION] Versi PHP yang sudah End-of-Life (seperti PHP 7.4 atau 8.0) tidak lagi menerima patch resmi dari php.net. Jika server kamu masih menjalankan versi ini, kamu harus mengandalkan patch vendor LTS (misal Ubuntu ESM atau Red Hat ELS) atau segera memigrasikan aplikasi ke PHP 8.2+.


Panduan Langkah Remediasi

Langkah terbaik dan paling tuntas untuk mengatasi PHP2Shell adalah memperbarui binary PHP ke versi patch resmi.

1. Pembaruan di Ubuntu / Debian (PPA Ondřej Surý)

Jika kamu menggunakan repositori populer Ondřej Surý:

# Update repository package index
sudo apt update

# Periksa versi pembaruan yang tersedia
apt list --upgradable | grep php

# Upgrade seluruh paket PHP
sudo apt --only-upgrade install php8.3 php8.3-fpm php8.3-cli php8.3-common

# Restart service web server dan PHP-FPM
sudo systemctl restart php8.3-fpm
sudo systemctl restart nginx # atau apache2

Verifikasi versi setelah restart:

php -v
# Pastikan versi tertera minimal 8.3.36 (atau cabang bersangkutan)

2. Pembaruan di RHEL / Rocky Linux / AlmaLinux (Remi Repo)

# Bersihkan cache dnf/yum
sudo dnf clean all

# Upgrade PHP runtime
sudo dnf upgrade php php-fpm

# Restart layanan
sudo systemctl restart php-fpm
sudo systemctl restart httpd # atau nginx

3. Pembaruan Lingkungan Docker / Container

Jika aplikasi kamu berjalan di atas Docker container, perbarui base image Dockerfile kamu ke tag rilis minor terbaru dan lakukan rebuild:

# Contoh sebelum:
# FROM php:8.3-fpm-alpine

# Jalankan docker pull image terbaru untuk memastikan hash layer ter-update:
# docker pull php:8.3-fpm-alpine

Jalankan redeploy container:

docker compose pull
docker compose up -d --force-recreate

Mitigasi Darurat (Jika Pembaruan Belum Memungkinkan)

Jika server produksi kamu berada dalam masa change freeze atau dependensi legacy menghalangi upgrade instan, terapkan langkah mitigasi sementara berikut:

1. Pembatasan Payload di Level Reverse Proxy / Web Server

Blokir request berukuran abnormal sebelum diteruskan ke PHP backend.

Di Nginx:

# Turunkan batas maksimum ukuran body request
client_max_body_size 10M;

# Batasi ukuran buffer header dan form
client_body_buffer_size 128k;

Di Cloudflare / AWS WAF / ModSecurity: Buat rule WAF untuk memfilter atau menginspeksi header Content-Type: multipart/form-data. Tolak request yang memiliki jumlah part boundary di luar batas wajar (misalnya lebih dari 50 part dalam satu request) atau panjang boundary header yang tidak lazim.

2. Pengaturan Parameter php.ini

Tinjau kembali konfigurasi upload di berkas php.ini:

; Jika aplikasi tidak membutuhkan upload file, matikan sepenuhnya:
file_uploads = Off

; Atau batasi ukuran maksimum form post seketat mungkin:
post_max_size = 8M
upload_max_filesize = 8M

; Hindari menyetel memory_limit terlalu mepet dengan post_max_size
memory_limit = 256M

Checklist Audit dan Deteksi Pascaserangan

Setelah melakukan patching, lakukan pemeriksaan cepat untuk memastikan tidak ada aktivitas mencurigakan yang sempat terjadi:

  1. Periksa Crash Log pada PHP-FPM / Apache: Cari sinyal crash abnormal seperti SIGSEGV (Segmentation fault) atau SIGBUS di /var/log/php-fpm.log atau error log web server.
  2. Audit Web Shell di Direktori Tulis (Writable Dirs): Periksa direktori upload atau temporary (/tmp, /dev/shm, storage/app/public) terhadap kemunculan file .php baru yang dibuat secara otomatis.
  3. Validasi Cron & Systemd Service: Pastikan tidak ada entri tugas cron baru di /etc/cron.* atau /var/spool/cron/crontabs/ yang dibuat oleh user web (www-data atau nginx).

Kesimpulan

Kerentanan PHP2Shell (CVE-2026-109618 & CVE-2026-109619) merupakan pengingat penting bahwa celah keamanan di lapisan runtime dapat mengekspos aplikasi secanggih apa pun jika fondasinya tidak dijaga.

Karena eksploitasi dapat dilakukan secara remote tanpa autentikasi, prioritaskan upgrade PHP pada seluruh infrastruktur server kamu hari ini juga. Terapkan prinsip defense-in-depth dengan memasang WAF dan membatasi ukuran request di reverse proxy untuk memberikan proteksi berlapis.

Lanjutkan membaca topik yang masih satu konteks.

Jangan Ketinggalan Info Terbaru

Dapatkan artikel teknologi, tips, dan insights menarik langsung ke email Kamu.