Verdict: PHP2Shell bukan sekadar dua celah baru. Di balik CVE-2026-109618 dan CVE-2026-109619 ada bug berumur 14 tahun yang tandanya sudah terlihat sejak 2024, sebuah perlombaan penemuan yang dimenangkan alat AI, dan percobaan serangan yang tercatat empat hari sebelum publik tahu apa-apa. Artikel ini membedah sisanya: akar masalah teknisnya, kenapa baru sekarang ditemukan, contoh dampak nyata di lapangan, dan penanganan lengkapnya. Untuk ringkasan berita dan daftar versi aman, silakan baca dulu liputan awal PHP2Shell di grafisify.
Tiga fakta membuat kasus ini berbeda dari pengumuman kerentanan biasa. Pertama, kode yang rentan sudah ada di PHP sejak versi 5.4.0 tahun 2012 dan aktif secara bawaan di hampir semua instalasi. Kedua, bug ini ditemukan bukan oleh satu tim, melainkan tiga pihak secara independen dalam bulan yang sama, dan semuanya dibantu model AI. Ketiga, tambalan belum juga dirilis ketika alat bukti konsep beredar dan honeypot mulai mencatat percobaan eksploitasi. Artinya, kerangka berpikir lama bahwa pengumuman resmi adalah titik awal risiko tidak lagi berlaku. Penanganan PHP2Shell harus dimulai dari asumsi bahwa pengintaian sudah berjalan.
Kedua CVE adalah bug use-after-free, kelas kesalahan pengelolaan memori pada bahasa C. Sederhananya, sebuah program membebaskan area memori karena mengira pekerjaannya selesai, padahal bagian lain masih menyimpan alamat area itu dan memakainya lagi. Siapa pun yang berhasil mengatur isi area bekas itu dapat mengendalikan perilaku program. Pada PHP, konteksnya diperberat oleh model worker: satu proses PHP melayani request demi request secara bergantian, dan mesin wajib membersihkan seluruh state milik request sebelum request berikutnya masuk. PHP2Shell adalah dua cara berbeda untuk membuat pembersihan itu gagal.
CVE-2026-109618, korupsi lewat kehabisan memori. Ketika sebuah request kehabisan jatah memory_limit di tengah proses penyiapan, PHP melompat keluar dari alur normal dan meninggalkan struktur data internal dalam keadaan setengah jadi. Kode pembersih di akhir request tetap memercayai struktur itu. Penyerang memicu keadaan ini lewat request unggahan multipart/form-data yang direkayasa, misalnya header part yang tidak kunjung selesai, field file kosong dengan nama bersarang, atau bagian tanpa panjang yang dapat dipakai. Salah satu jalur yang terkonfirmasi melewati pengurai data progres unggahan sesi, dan jalur ini punya bonus berbahaya: handler progres unggahan dapat mengembalikan memori bekas milik worker kepada penyerang di dalam cookie PHPSESSID. Isi memori itu bisa berupa kata sandi, token sesi, kunci API, sampai kunci privat TLS dari request milik pengunjung lain, mirip pola kebocoran Heartbleed. Mode Apache mod_php adalah yang paling terpapar karena tahap penutupan request tetap berjalan walaupun tahap awal gagal, sehingga satu request tanpa login dapat mencapai kode eksekusi sebelum kode aplikasi apa pun berjalan. PHP-FPM lebih terlindungi di jalur awal ini, tetapi eksekusi kode tetap terkonfirmasi lewat jalur level aplikasi.
CVE-2026-109619, state global basi. Pada celah kedua, sebagian state global PHP, antara lain state error, sesi, dan serializer, hidup lebih lama daripada memori request yang ditunjuknya. Kesalahan fatal seperti timeout atau kehabisan memori dapat membuat pembersihan terlewat, dan sebuah warning yang muncul saat penutupan bahkan dapat menghidupkan kembali state yang sebenarnya sudah dibersihkan. Request berikutnya yang kebetulan dilayani worker yang sama lalu mengikuti penunjuk ke memori yang sudah bebas. Dua konsumen state basi ini terkonfirmasi: progres unggahan sesi, yang aktif secara bawaan dan berjalan pada setiap unggahan multipart bahkan ketika aplikasi tidak pernah memanggil session_start(), serta khusus PHP 8.5, fitur baru bernama fatal_error_backtraces yang juga aktif secara bawaan. Jalur progres unggahan terkonfirmasi dapat dieksekusi pada mod_php maupun PHP-FPM. Rincian teknis kedua mekanisme ini didokumentasikan dalam riset Sansec tentang PHP2Shell.
| Aspek | CVE-2026-109618 | CVE-2026-109619 |
|---|---|---|
| Mekanisme | Korupsi saat kehabisan memori, struktur internal setengah jadi | Use-after-free dari state global basi antar request |
| Pemicu | Request multipart rekayasa yang menguras memori | Kesalahan fatal yang membuat pembersihan terlewat |
| Dampak terkonfirmasi | Eksekusi kode dan kebocoran memori worker | Eksekusi kode lewat progres unggahan sesi |
| Paling terpapar | Apache mod_php, sebelum kode aplikasi berjalan | mod_php dan PHP-FPM, ditambah jalur khusus PHP 8.5 |
Satu benang merah menyatukan keduanya: fitur progres unggahan sesi yang hampir tidak pernah dipakai aplikasi modern, jarang diawasi admin, tetapi menyala secara bawaan sejak PHP 5.4 dan ikut memproses setiap unggahan. Permukaan serangan yang terlupakan seperti inilah yang membuat kedua bug lolos dari perhatian selama bertahun-tahun.
Jejaknya sebenarnya panjang. Kelas bug ini sudah disinggung dalam advisori keamanan PHP era 2004 oleh Stefan Esser. Sebuah laporan bug terkait tercatat pada 2019. Lalu pada 2024, audit keamanan eksternal pertama PHP yang dijalankan Quarkslab lewat OSTIF menemukan tanda awal masalah kehabisan memori ketika seorang pengembang inti sedang memperbaiki laporan lain. Temuan itu tidak berujung tambalan: tim tidak sepakat soal bentuk perbaikannya, dan yang lebih menentukan, belum ada yang membuktikan bug tersebut bisa dieksploitasi. Tanpa bukti senjata, bug masuk daftar tunggu.
Yang berubah pada 2026 adalah ekonomi pembuktian itu. Pada Agustus 2026, tiga pihak menemukan keluarga bug yang sama secara independen dan semuanya memakai AI. Calif, firma riset ofensif yang diundang OpenAI ke program Patch the Planet, memulai audit pada 30 Juli; peneliti Ryan Austin melaporkan jalur eksekusi kode tanpa syarat ke tim PHP pada 11 Agustus dengan bantuan GPT-5.6 Sol. Wiz Research menemukan bug pertamanya pada 19 Agustus, membuktikan eksekusi kode tanpa autentikasi terhadap Drupal keesokan harinya dan WordPress sehari setelahnya, lalu melapor pada 24 Agustus. Wiz memakai sistem riset Atlas miliknya bersama Gemini 4 Argon dan GPT-5.6 Sol, dan menyebut pekerjaan itu diselesaikan satu peneliti dalam waktu sekitar sepekan. Tim internal OpenAI kemudian melaporkan vektor serangan tambahan pada 18 September.
Peran AI yang paling menentukan bukan sekadar menemukan bug, melainkan mengerjakan bagian yang dulu paling mahal: mengubah anomali memori menjadi exploit yang andal. Exploit korupsi memori harus disesuaikan dengan versi PHP, konfigurasi, dan tata letak memori setiap target, dan exploit yang bekerja di satu mesin bisa langsung gagal di mesin lain. Model membantu menulis exploit, menyesuaikannya lintas versi dan konfigurasi, menganalisis kenapa sebuah percobaan gagal, lalu mencoba lagi. Pekerjaan yang dulu membutuhkan tim kelas dunia selama berbulan-bulan kini selesai dalam hitungan hari. Manusia tetap memegang peran kunci: merangkai bug menjadi rantai serangan dan melakukan debugging per target. Austin sendiri menekankan tidak ada harness khusus atau model rahasia dalam penemuan awalnya; keunggulannya adalah pengetahuan tentang sejarah kerentanan PHP yang dipakai untuk mengarahkan model ke sudut kode yang jarang disentuh. Pemindaian AI tanpa arahan dari banyak laboratorium sebelumnya justru pulang dengan tangan kosong. Tim keamanan PHP di sisi bertahan juga memakai AI, untuk memvalidasi dan mengelompokkan laporan yang masuk, dengan penegasan bahwa setiap keputusan dan setiap tambalan tetap dikerjakan manusia. Fenomena pemakaian AI di dua sisi ini sejalan dengan tren yang lebih luas, termasuk di dunia kernel Linux.
Ada sisi gelap dari percepatan yang sama. CEO Calif, Thai Duong, mengingatkan bahwa begitu tambalan terbit, siapa pun dapat membandingkannya dengan kode lama dan meminta AI menjelaskan persis di mana letak bugnya. Itu terbukti: bukti konsep publik muncul pada 10:44 UTC tanggal 21 Oktober, sekitar tiga jam sebelum rilis perbaikan resmi pukul 14:00 UTC. Jendela antara tambalan tersedia dan exploit beredar kini menyempit menjadi hitungan jam, bukan hari.
Di laboratorium, dampaknya tidak menyisakan ruang debat. Eksekusi kode pra-autentikasi terkonfirmasi terhadap rilis mutakhir WordPress 7.1.2, Drupal 11.4.3, Joomla 6.1.4, Magento 2.4.9, Nextcloud 35.0.1, Laravel 13.11, dan Symfony 8.1, selain WooCommerce, MediaWiki, Roundcube, phpMyAdmin, dan WHMCS. Daftar itu pada dasarnya adalah daftar perangkat lunak PHP yang menerima form post, sebagaimana juga dirangkum dalam analisis Kaspersky Securelist. Secara terpisah, jalur kebocoran memori pada CVE-2026-109618 berarti server yang sibuk dapat membocorkan kredensial dan kunci milik pengunjung lain tanpa penyerang perlu mengeksekusi kode sama sekali.
Respons pencegahan berskala besar terjadi bahkan sebelum detail teknis lengkap dipahami publik. Sejumlah pemerintah dan situs besar di Eropa, Amerika Serikat, dan Jepang mematikan sistem berbasis PHP mereka sebagai langkah berjaga-jaga, termasuk situs pemerintah dan parlemen Belanda. Langkah ekstrem itu masuk akal mengingat nasihat NCSC Belanda: perbarui segera, dan pertimbangkan mematikan sistem bila mitigasi tidak memungkinkan.
Fakta paling menggelisahkan datang dari telemetri Amazon. Tim Threat Intelligence Amazon mencatat percobaan eksploitasi terhadap layanan honeypot MadPot bertanggal 17 Oktober 2026, empat hari sebelum pengungkapan publik dan ketika kerentanan masih dalam masa embargo. Percobaan itu berasal dari alamat IP yang terkait jaringan anonimitas komersial, dan sampai kini tidak jelas bagaimana pelakunya memperoleh informasi exploit sebelum waktunya. Pada hari rilis, bukti konsep mulai muncul sejak 02:00 UTC dan percobaan tambahan datang dari beberapa infrastruktur anonim berbeda, mengindikasikan lebih dari satu pelaku. Pemindaian massal dimulai sekitar 20 menit setelah tambalan terbit, dan sebuah botnet bergaya Mirai yang sudah aktif sejak Mei 2026 tercatat menambahkan modul PHP2Shell ke perangkat penyebarannya, lengkap dengan user-agent bernama php2shell-109618. Armada honeypot OffSeq merekam sembilan alamat sumber dari tujuh negara dalam 48 jam pertama, terbagi antara teknik progres unggahan sesi dan teknik tekanan memori berbadan besar. CrowdStrike menambahkan satu catatan penting: serangan lewat celah ini nyaris tidak meninggalkan jejak digital, karena tidak ada autentikasi yang diterobos, tidak ada sesi yang dicuri, dan tidak ada endpoint rentan yang perlu ditemukan.
Namun kejujuran menuntut nuansa sebaliknya. Percobaan bukan berarti keberhasilan. Analisis hunt.io per 21 Oktober pukul 23:45 UTC menyatakan belum ada kompromi sukses di lapangan yang terkonfirmasi vendor mana pun: satu operator eksploitasi massal menjalankan sepuluh putaran terhadap hingga 123 server dan pulang dengan nol shell. Dari 30 repositori bukti konsep publik yang ditelaah peneliti, belum ada yang menembus target nyata pada arsitektur x86-64, karena eksekusi kode yang andal umumnya membutuhkan cara menaklukkan acakan tata letak memori atau satu kelemahan tambahan. Per 22 Oktober, CISA juga belum memasukkan kedua CVE ini ke katalog Known Exploited Vulnerabilities. Gambaran yang akurat adalah perlombaan yang sedang berjalan: pengintaian dan percobaan sudah masif, senjata yang andal sedang dimatangkan, dan server yang belum ditambal memberi penyerang waktu. Skala taruhannya terlihat dari data paparan Shodan: sekitar 59 persen host PHP yang versinya terlihat menjalankan PHP 8.1 atau lebih tua, golongan yang tidak mendapat perbaikan resmi sama sekali.
Satu-satunya perbaikan tuntas, seperti ditegaskan FAQ watchTowr tentang PHP2Shell, adalah memperbarui PHP ke versi 8.2.35, 8.3.36, 8.4.27, atau 8.5.12 sesuai cabang yang dipakai. Verifikasi harus dilakukan pada PHP yang benar-benar melayani request web, misalnya lewat halaman Kesehatan Situs di WordPress atau phpinfo yang diakses dari browser, bukan hanya perintah php -v di terminal, karena versi CLI dan versi SAPI bisa berbeda. Bagi pengguna shared hosting, pembaruan adalah wewenang provider; kisah para penyedia hosting besar menunjukkan betapa terpusatnya kendali itu, jadi tiket ke provider dan pemilihan cabang versi yang sudah ditambal adalah langkah yang realistis. Alternatif yang lebih terkelola, misalnya platform PaaS untuk deploy aplikasi, memindahkan beban penambalan runtime ke penyedia platform.
Untuk cabang yang sudah habis masa dukungan, situasinya lebih keras. PHP 8.1 dan yang lebih tua tidak mendapat rilis resmi; tim PHP hanya menyediakan backport sumber minimal untuk 7.4, 8.0, dan 8.1 bagi yang mengompilasi sendiri. Vendor distribusi dan LTS seperti Debian, Ubuntu, AlmaLinux, dan TuxCare dapat mengirim paket yang sudah ditambal tanpa mengganti nomor versi, jadi periksa tracker keamanan distribusi sebelum menyimpulkan sebuah server aman atau rentan hanya dari nomor versinya.
Selama menunggu tambalan, semua mitigasi bersifat jembatan dan harus disebut apa adanya: parsial. Mematikan session.upload_progress hanya menutup satu jalur terkonfirmasi dari CVE-2026-109619 dan tidak menyentuh CVE-2026-109618. Aturan WAF seperti yang diaktifkan Cloudflare untuk semua paket membantu, tetapi payload terus bermutasi dan request berbadan besar adalah jenis yang paling sering lolos dari inspeksi WAF. Plugin keamanan WordPress tidak menolong sama sekali, karena bug menyala saat PHP memproses request, sebelum kode plugin apa pun berjalan. Menonaktifkan endpoint unggahan yang tidak perlu dan membatasi akses origin hanya lewat CDN adalah pengurang risiko, bukan perbaikan.
Terakhir, karena percobaan eksploitasi tercatat sejak 17 Oktober, penanganan tidak berhenti pada update. Lakukan cek kompromi dasar: cari file PHP asing atau webshell di direktori unggahan dan direktori publik, periksa pengguna admin baru yang tidak dikenal, bandingkan file inti dengan salinan bersih, dan telaah log untuk POST multipart anomali, termasuk field PHP_SESSION_UPLOAD_PROGRESS dan body berukuran tidak wajar. Ingat catatan CrowdStrike bahwa serangan ini nyaris tanpa jejak, sehingga log yang bersih bukan bukti server pasti aman. Bila ditemukan indikasi kompromi, rotasi seluruh kredensial yang mungkin terekspos, mulai dari kata sandi basis data, kunci API, sampai kunci privat TLS, karena jalur kebocoran memori bisa saja sudah membawanya keluar. Pola pikir yang sama berlaku luas di web modern, seperti dibahas dalam tulisan tentang situs yang menutup pintu untuk agen AI: permukaan yang tidak diawasi adalah permukaan yang diserang lebih dulu.
PHP2Shell akan dikenang sebagai penanda zaman. Sebuah fitur bawaan yang terlupakan menyimpan bug selama 14 tahun bukan karena tidak ada yang peduli, melainkan karena membuktikan bahayanya terlalu mahal. AI menghapus kemahalan itu untuk dua sisi sekaligus: penemu bertahan menemukannya dalam sepekan, dan penyerang membedah tambalannya dalam hitungan jam. Ditambah bukti bahwa percobaan serangan bisa mendahului pengumuman resmi, standar baru pertahanan menjadi jelas: inventarisasi versi runtime harus selalu siap, penambalan tidak boleh menunggu siklus rutin, dan setiap keterlambatan harus dianggap sebagai waktu yang sedang dipakai pihak lain. Cek versi PHP hari ini juga, lalu kejar sampai angkanya melewati ambang aman.