PHP2Shell: Ketika Celah di “Mesin” PHP Bisa Berujung pada Pengambilalihan Server




CVSS 9.2 · CRITICAL

Pembaruan Keamanan Kritis PHP – CVE-2026-109618 & CVE-2026-109619

PHP2Shell: Ketika Celah di “Mesin” PHP Bisa Berujung pada Pengambilalihan Server

Ringkasan Cepat

Dua celah kritis tanpa autentikasi memengaruhi core PHP. Patch resmi tersedia untuk PHP 8.5.12, 8.4.27, 8.3.36, dan 8.2.35. Setelah patch, restart PHP-FPM/Apache. Jika belum bisa patch, lakukan mitigasi sementara dan prioritaskan migrasi dari versi EOL.

Bayangkan punya rumah dengan pintu depan yang terlihat kokoh, tapi engselnya ternyata terbuat dari bahan yang mudah lapuk. Itulah gambaran sederhana dari dua celah keamanan yang baru-baru ini mengguncang dunia PHP: CVE-2026-109618 dan CVE-2026-109619. Keduanya mendapat skor CVSS v4.0 9.2 (Critical), dan yang membuatnya semakin serius, celah ini tidak butuh autentikasi apa pun. Cukup koneksi jaringan ke aplikasi PHP yang rentan, dan penyerang berpotensi menjalankan kode sesuka hati di server Anda.

Artikel ini bukan sekadar daftar CVE. Kita akan bedah apa yang sebenarnya terjadi, mengapa celah ini begitu berbahaya, dan yang paling penting: apa yang harus Anda lakukan mulai detik ini.

Dua Celah, Satu Akar Masalah

Kedua CVE ini sering disebut dengan nama sandi “PHP2Shell”. Meskipun diberi dua nomor berbeda, keduanya bermuara pada satu titik lemah yang sama: bagaimana PHP menangani kondisi kehabisan memori (out-of-memory) saat sedang memproses permintaan HTTP.

CVE-2026-109618 terjadi ketika PHP kehabisan memori di tengah proses parsing request. Alih-alih membersihkan semuanya dengan rapi, PHP justru meninggalkan sebagian data internal dalam kondisi “setengah jadi”. Data yang tidak valid ini kemudian diperlakukan seolah-olah valid saat proses pembersihan berikutnya.

Sementara itu, CVE-2026-109619 adalah kelanjutan dari mimpi buruk yang sama. State internal yang seharusnya sudah dibebaskan dari memori ternyata masih “menempel” dan bisa dipakai oleh request berikutnya yang kebetulan ditangani oleh worker PHP yang sama. Jika penyerang bisa mengatur kapan request pertama gagal dan request kedua datang, ia bisa menanam benih eksekusi kode di sela-sela state yang rusak tersebut.

Yang membuat keduanya sulit diabaikan: ini bukan bug di aplikasi. Ini bug di level core PHP, di lapisan C. Artinya, tidak ada framework, library, atau baris kode aplikasi yang bisa menambal celah ini. Satu-satunya obat yang benar-benar menyembuhkan adalah memperbarui PHP itu sendiri.

Siapa yang Terdampak?

Jawaban singkatnya: hampir semua orang yang menjalankan PHP untuk melayani request web. Mulai dari WordPress, Drupal, Magento, Laravel, hingga aplikasi kustom buatan sendiri—semuanya berdiri di atas fondasi yang sama. Celah ini dilaporkan hadir sejak PHP 5.4.0 dan memengaruhi semua versi hingga PHP 8.5.11.

Yang perlu digarisbawahi, PHP-FPM dan Apache mod_php sama-sama terpapar. Bahkan, PHP sendiri menandai mod_php sebagai SAPI dengan risiko tertinggi karena eksploitasi bisa terpicu bahkan sebelum kode aplikasi sempat berjalan.

Langkah Penanganan: Patch adalah Harga Mati

Jika ada satu hal yang harus Anda ingat dari artikel ini, itu adalah: segera perbarui PHP ke versi yang sudah ditambal. PHP telah merilis perbaikan resmi pada 21 Oktober 2026 untuk cabang-cabang berikut:

Cabang PHP Versi yang Sudah Ditambal
PHP 8.58.5.12
PHP 8.48.4.27
PHP 8.38.3.36
PHP 8.28.2.35

Prosesnya tidak berhenti di apt upgrade atau composer update. Setelah paket PHP diperbarui, Anda wajib me-restart layanan yang memuat PHP, entah itu PHP-FPM, Apache, atau container yang menjalankan aplikasi. Tanpa restart, proses lama masih berjalan dengan binary yang rentan.

Bagi pengguna Ubuntu, perintah berikut bisa menjadi titik awal:

bash
$ sudo apt update && sudo apt upgrade
$ sudo systemctl restart apache2   # atau php8.x-fpm

Jika Anda menggunakan container, pastikan base image PHP yang dipakai sudah merujuk ke versi yang ditambal, lalu rebuild dan redeploy container tersebut.

Mitigasi Sementara: Ketika Patch Belum Bisa Langsung Turun

Realitas di lapangan tidak selalu memungkinkan patch dalam hitungan menit. Mungkin ada proses change management, atau ada sistem legacy yang sulit disentuh. Untuk kondisi darurat seperti ini, ada beberapa langkah mitigasi sementara yang bisa memperkecil peluang eksploitasi. Tapi perlu ditegaskan: ini bukan pengganti patch. Ini hanya rem darurat.

1. Matikan session.upload_progress

Celah ini mengeksploitasi mekanisme upload progress di sesi PHP. Jika fitur ini tidak benar-benar Anda butuhkan, matikan lewat php.ini atau konfigurasi pool PHP-FPM:

php.ini
session.upload_progress.enabled = Off

Langkah ini memutus salah satu jalur pemicu yang paling sering dibahas dalam advisori awal.

2. Batasi memory_limit dengan Bijak

Akar masalahnya adalah kondisi kehabisan memori. Untuk sementara, Anda bisa menetapkan memory_limit yang wajar, misalnya -1 (tanpa batas) tetapi dibarengi dengan batas memori di level container atau cgroup. Pendekatan ini mencegah PHP “menyerah” di tengah parsing karena kehabisan memori, tanpa membiarkan prosesnya rakus memori secara tak terkendali.

3. Perketat post_max_size

Batasi ukuran body request agar penyerang tidak leluasa mengirim payload besar yang memicu kondisi OOM. Untuk endpoint yang tidak memerlukan upload, nilai seperti 8M sudah lebih dari cukup. Jika memang ada fitur upload, sesuaikan dengan kebutuhan riil, misalnya 32M.

4. Blokir multipart/form-data di Endpoint yang Tidak Memerlukannya

Tidak semua endpoint perlu menerima upload file. Di level Nginx atau Apache, Anda bisa menolak request multipart/form-data ke path yang seharusnya hanya menerima JSON atau form-urlencoded. Ini adalah lapisan pertahanan tambahan yang mengurangi permukaan serangan secara signifikan.

Antisipasi: Membangun Ketahanan Jangka Panjang

Patch darurat menyelesaikan masalah hari ini. Tapi tanpa antisipasi yang matang, kejadian serupa bisa terulang. Berikut beberapa hal yang layak masuk dalam rencana jangka panjang Anda.

1. Inventarisasi PHP di Seluruh Infrastruktur

Jangan berasumsi bahwa “aplikasi PHP” hanya ada di server web utama. PHP juga bisa bersembunyi di panel admin produk pihak ketiga, container Docker, appliance jaringan, hingga runtime yang tertanam di layanan SaaS. Lakukan pemetaan menyeluruh: di mana saja PHP berjalan, versi berapa, dan siapa yang bertanggung jawab atasnya.

2. Rencanakan Migrasi dari Versi EOL

PHP 8.1 dan versi yang lebih lama tidak menerima patch resmi untuk celah ini. Jika masih ada sistem yang berjalan di versi tersebut, Anda berada di zona merah. Meskipun beberapa vendor Linux menyediakan backport, solusi yang berkelanjutan tetaplah upgrade ke PHP 8.2 atau lebih baru. PHP 8.2 sendiri akan mencapai akhir masa dukungan pada Desember 2026, jadi ini adalah momen yang tepat untuk merencanakan lompatan ke versi yang lebih panjang umurnya.

3. Jadikan Patching sebagai Proses, Bukan Insiden

Insiden PHP2Shell menunjukkan bahwa patch bisa datang dalam hitungan jam setelah kebocoran informasi. Organisasi yang memiliki prosedur patch darurat—siapa yang harus menghubungi siapa, bagaimana cara rollout ke lingkungan produksi tanpa merusak layanan—akan jauh lebih cepat merespons dibandingkan mereka yang harus membangun proses dari nol di tengah krisis.

4. Aktifkan Deteksi, Bukan Hanya Pencegahan

Eksploitasi yang berhasil sering kali meninggalkan jejak: proses web server yang tiba-tiba memunculkan shell, koneksi keluar yang tidak wajar, atau file webshell yang baru muncul. Pastikan logging dan monitoring Anda cukup sensitif untuk menangkap sinyal-sinyal ini. Beberapa vendor keamanan telah merilis aturan deteksi untuk WAF dan SIEM, tapi jangan bergantung sepenuhnya pada pihak ketiga—verifikasi sendiri apakah aturan tersebut benar-benar menangkap pola eksploitasi yang relevan.

!

Action Required

Yang Harus Segera Dilakukan

5 Langkah
  1. 1
    Prioritas 1

    Cek versi PHP di seluruh server dan container. Cocokkan dengan daftar versi yang sudah ditambal.

  2. 2
    Prioritas 1

    Patch ke 8.5.12 / 8.4.27 / 8.3.36 / 8.2.35 sesuai cabang yang Anda gunakan.

  3. 3
    Wajib

    Restart PHP-FPM, Apache, atau redeploy container. Tanpa restart, proses lama masih memakai binary rentan.

  4. 4
    Sementara

    Aktifkan mitigasi sementara jika patch belum bisa langsung turun—matikan session.upload_progress, perketat post_max_size, dan batasi memory di level container.

  5. 5
    Monitoring

    Pantau log untuk indikasi eksploitasi: proses web server yang memunculkan shell, koneksi keluar tidak wajar, atau file webshell baru.

Penutup

CVE-2026-109618 dan CVE-2026-109619 adalah pengingat keras bahwa bahkan fondasi paling matang pun bisa memiliki celah. PHP telah menjadi tulang punggung web selama puluhan tahun, dan justru karena itu, satu bug di level core-nya berdampak luar biasa luas.

Jika Anda hanya bisa melakukan satu hal setelah membaca artikel ini, lakukan ini: periksa versi PHP di server Anda sekarang. Jika masih di bawah 8.2.35, 8.3.36, 8.4.27, atau 8.5.12, jadwalkan patch secepatnya. Mitigasi sementara boleh dijalankan, tapi jangan pernah menganggapnya sebagai tujuan akhir. Celah ini sudah memiliki eksploitasi publik, dan waktu adalah faktor yang tidak berpihak pada sistem yang belum ditambal.

Selalu cocokkan informasi versi patch dan detail teknis dengan advisori resmi PHP serta vendor distribusi yang Anda gunakan sebelum melakukan perubahan di lingkungan produksi.

Tetap aman, dan jangan biarkan “mesin” yang menjalankan aplikasi Anda menjadi pintu masuk yang lupa dikunci.