Kartu hero PHP2Shell: dari permintaan yang gagal hingga eksekusi kode jarak jauh, CVE-2026-109618 dan CVE-2026-109619
Engineering & Research

OrcaCyber Research - PHP2Shell: Bagaimana Permintaan yang Gagal Menjadi Eksekusi Kode Jarak Jauh

Penulis

Rowan Sterling

Tanggal Terbit

Model terbaru · 20Lihat semua model →
Benchmark: Artificial Analysis · diperbarui setiap hari
Kembali ke semua artikel

Proof of concept dalam penyelidikan ini dibuat dengan model OrcaCyber Zero dan OrcaCyber Ultra. Bundel riset mendokumentasikan analisis tingkat sumber, reproduksi terkendali menggunakan eksploitasi publik yang diadaptasi, artefak pengungkapan memori, crash proses, dan bukti eksekusi perintah. File yang diberikan tidak secara independen mencatat langkah mana yang dilakukan oleh masing-masing model; atribusi model disediakan oleh tim riset.

Kondisi kehabisan memori yang fatal seharusnya menghentikan permintaan dengan aman. Di sini, kondisi tersebut dapat menginterupsi PHP saat status native baru terinisialisasi sebagian, meninggalkan referensi yang tetap ada hingga permintaan berikutnya. Hasilnya adalah pelanggaran masa hidup memori lintas permintaan dengan konsekuensi mulai dari pengungkapan hingga eksekusi kode jarak jauh di lingkungan yang diuji.

Sekilas bukti utama

• Target — PHP 8.4.26, Apache/mod_php, satu worker, lab Docker terisolasi.

• Log crash — Satu worker keluar karena SIGABRT dan tiga worker keluar karena SIGSEGV dalam kutipan yang disediakan.

• Respons HTTP — 819.200 byte dalam nilai PHPSESSID yang didekode URL.

• Bukti eksekusi — code>uid=33(www-data) gid=33(www-data) groups=33(www-data)/code>.

• Regresi — Laporan tersebut menjelaskan empat upaya yang tidak berhasil pada PHP 8.4.27 yang telah ditambal; hasil mentah tidak disertakan.

Sumber: REPORT.md, crash_evidence.log, leak_attempt.resp, dan rce_proof_8426.txt yang diunggah. Lampiran yang dijelaskan di bawah ini mereproduksi artefak tersebut sebagai panel bukti bertata huruf; ini bukan foto atau tangkapan layar terminal asli.

1. Kerentanan: kegagalan kepemilikan pada batas permintaan

Dua masalah yang saling terkait ini menyangkut inisialisasi permintaan yang terinterupsi dan pointer global-runtime yang sudah basi. Dalam arsitektur PHP yang relevan, penanganan multipart/form-data dan callback kemajuan unggahan sesi dapat berjalan sebelum kode aplikasi pengguna normal. Transisi alur kendali yang bersifat pengecualian, termasuk code>zend_bailout()/code>, dapat melewati pembersihan yang seharusnya dilakukan dan meninggalkan status yang menunjuk ke memori yang nantinya dilepaskan atau digunakan kembali.

Invarian keamanan: referensi global-worker yang diekspos ke permintaan B tidak boleh mereferensikan memori yang kepemilikan dan masa hidupnya berakhir bersama permintaan A. Kegagalan yang dilaporkan melanggar invarian tersebut.

Endpoint yang didemonstrasikan adalah halaman PHP minimal yang hanya mengembalikan OK; narasi eksploitasi tidak bergantung pada endpoint SQL injection tingkat aplikasi, file inclusion, atau deserialization.

2. Urutan teknis

• A1 — interupsi. Penanganan multipart dan progres unggah memicu OOM selama pembersihan, sehingga meninggalkan status sesi yang basi.

• B1 — kebocoran. Permintaan berikutnya menyebabkan serialisasi cookie sesi membaca melampaui ID sesi yang valid.

• Pemulihan alamat. Nilai pointer yang bocor digunakan untuk menyimpulkan tata letak pustaka dan heap yang relevan dalam build tersebut.

• A2/B2 — korupsi data. Urutan dua permintaan lebih lanjut membentuk dan mengalihkan data usang yang digunakan saat mematikan.

• Hasil. Eksploitasi publik yang telah diadaptasi melaporkan eksekusi perintah sebagai www-data.

Five-step diagram of the PHP2Shell chain from OOM interruption to command execution as www-data, reconstructed from the research bundle

Barang bukti: apa yang sebenarnya ditunjukkan oleh berkas yang disediakan

Bukti A — penghentian worker dari log Apache

• code>[core:notice] [pid 1:tid 1] AH00051: child pid 54 exit signal Abort (6), possible coredump in /etc/apache2/code>

• code>[core:notice] [pid 1:tid 1] AH00051: pid anak 55 keluar dengan sinyal Segmentation fault (11), kemungkinan coredump di /etc/apache2/code>

• code>[core:notice] [pid 1:tid 1] AH00051: pid anak 58 keluar dengan sinyal Segmentation fault (11), kemungkinan coredump di /etc/apache2/code>

• code>[core:notice] [pid 1:tid 1] AH00051: proses anak dengan pid 61 keluar dengan sinyal Segmentation fault (11), kemungkinan coredump di /etc/apache2/code>

Kutipan yang disusun dari crash_evidence.log (23 Oktober 2026). Keluarnya beberapa worker mendukung adanya kegagalan keamanan memori; crash saja tidak membuktikan RCE.

• code>HTTP/1.1 200 OK/code>, dengan data biner dihilangkan.

• code>Server: Apache/2.4.69 (Debian)/code>

• code>X-Powered-By: PHP/8.4.26/code>

• code>Set-Cookie: PHPSESSID=[data biner dihilangkan]/code>

• Panjang cookie yang dienkode: 2.330.754 byte.

• Nilai hasil dekode URL: 819.200 byte.

Pengukuran dihitung langsung dari {{1}}leak_attempt.resp{{/1}}. Nilai biner sengaja dihilangkan untuk menghindari reproduksi konten proses yang bocor.

Bukti C — bukti pelaksanaan

code>uid=33(www-data) gid=33(www-data) groups=33(www-data)/code>

Isi persis rce_proof_8426.txt, sebagaimana diberikan. Ini mendukung hasil eksekusi yang dilaporkan tetapi bukan transkrip perintah/sesi yang lengkap.

Evidence summary card: four worker exits, an 819,200-byte URL-decoded session cookie, and uid=33 execution context

Lampiran D — perbaikan siklus hidup sesi

• code>static inline void php_rinit_session_globals(void)/code>

• code>@@ -121,6 +120,7 @@ static inline void php_rinit_session_globals(void)/code>

• code>* mengenkode ulang sesi selama startup permintaan, sebelum RINIT, saat tidak ada pengguna/code>

• code>/* Berjalan sebelum RINIT: tidak ada kode pengguna yang boleh dipanggil, lihat php_session_unserialize_init() *//code>

• code>/* Ini berjalan sebelum RINIT, jadi kita perlu membersihkan ini lebih awal *//code>

• code>php_rinit_session_globals();/code>

Baris diff sumber yang dipilih dari session.c.diff. Perubahan ini secara eksplisit mereset status global sesi lebih awal daripada RINIT biasa.

3. Mengapa bukti itu penting

Kebocoran memori memberikan jembatan antara crash proses dan rantai eksploitasi. Nilai sesi berukuran tidak normal dengan data biner yang disematkan konsisten dengan runtime yang menafsirkan memori tidak valid sebagai string Zend. Laporan penelitian lebih lanjut menjelaskan ekstraksi alamat kode dan heap dari jendela yang bocor. Bundel bukti berisi respons mentah tetapi bukan skrip mandiri yang membuktikan setiap alamat yang dipulihkan.

Artifact RCE menunjukkan konteks keamanan www-data. Ini tidak membuktikan akses root, kompromi lingkungan produksi, atau portabilitas penuh ke deployment PHP arbitrer. Konfigurasi laboratorium satu worker penting karena urutan permintaan dan afinitas worker memengaruhi mekanisme tersebut.

4. Perbaikan pada siklus hidup yang mendasarinya, bukan hanya gejalanya

Diff sumber yang disediakan untuk commit patch PHP 01a40e89fbfc ("Avoid state corruption via bailout") menunjukkan inisialisasi global sesi yang lebih awal, perubahan pada penanganan OOM alokator, dan logika reset/pembersihan yang lebih luas. Perubahan-perubahan ini bertujuan mencegah state native bertahan dalam keadaan tidak valid setelah permintaan yang terinterupsi. Memperbaiki hanya jalur pengodean cookie tidak dengan sendirinya akan memulihkan jaminan kepemilikan memori ini.

Laporan penelitian menyatakan bahwa upaya terhadap PHP 8.4.27 tidak menghasilkan cookie abnormal, crash, atau bukti RCE dalam empat percobaan. Transkrip versi yang telah ditambal yang sebenarnya tidak ada dalam bundel ini, sehingga perbandingan itu dilaporkan sebagai observasi peneliti, bukan sebagai bukti yang dapat diperiksa secara independen.

5. Tindakan defensif

• Segera.Tingkatkan lini PHP yang didukung dan terdampak ke rilis yang telah diperbaiki masalah keamanannya, dan gunakan advisori vendor untuk mengonfirmasi status paket secara tepat.

• Pengurangan eksposur. Pertimbangkan untuk membatasi input multipart dan menonaktifkan code>session.upload_progress/code> jika tidak digunakan; ini tidak menggantikan patch.

• Deteksi.Tinjau crash selama inisialisasi permintaan, 500 tak terduga, dan code>Set-Cookie/code> header respons yang terlalu besar.

• Jaminan. Uji ulang dengan kumpulan worker yang representatif untuk produksi dan validasi bahwa status sesi lama tidak dapat bertahan di seluruh permintaan.

6. Metodologi penelitian OrcaCyber

Tugas penelitian yang berharga bukan hanya menemukan operasi tidak aman secara individual; melainkan melacak pelanggaran invarian secara menyeluruh di sepanjang penguraian permintaan, perilaku pengalokasi, global native persisten, serialisasi, dan shutdown. OrcaCyber Zero dan OrcaCyber Ultra digunakan untuk membuat PoC dalam investigasi ini, sebagaimana diatribusikan oleh tim peneliti. Kumpulan artefak publik mendukung reproduksi teknis, tetapi tidak menyediakan jejak eksekusi per model atau membuktikan penemuan kerentanan secara otonom.

Tangga bukti: hipotesis sumber → pemicu yang dapat dijangkau → kegagalan runtime → pengungkapan informasi → bukti eksekusi → regresi versi perbaikan. Urutan ini menciptakan keyakinan yang lebih kuat daripada deskripsi kerentanan atau hasil yang hanya berupa crash. Ini juga mendorong pelaporan ketidakpastian secara jelas ketika file sumber atau log eksekusi mentah tidak tersedia.

7. Ruang lingkup dan keterbatasan

Publikasi ini menjelaskan lab Docker terisolasi yang terotorisasi. Eksploitasi ini didasarkan pada penelitian PHP2Shell yang telah dipublikasikan sebelumnya, dengan adaptasi lokal yang didokumentasikan dalam laporan yang disertakan. Bundel ini mencakup skrip, diff, byte respons, log, dan output proof, namun tidak menyertakan checkout eksploit upstream secara lengkap, tangkapan layar native, dan transkrip regresi patch mentah yang lengkap. Tidak ada klaim kompromi korban atau pelanggan di dunia nyata.

Sumber dan artefak

Utama: yang disediakan php2shell-report-bundle.tar.gz (REPORT.md; report-CVE-2026-109618.md; report-CVE-2026-109619.md; crash_evidence.log; leak_attempt.resp; rce_proof_8426.txt; diff sumber PHP). Konteks publik: advisori keamanan PHP GHSA-w8hw-w9fx-j79w dan GHSA-6wmf-4rv5-p3rp; pengumuman rilis keamanan PHP. Atribusi eksploit publik: 9bie/php2shell-bypass-aslr-exp. Repositori riset: orcacyber-php2shell-research.

The public orcacyber-php2shell-research GitHub repository README on the OrcaCyber PHP2Shell defender research artifacts and its defensive scripts

Poin utama: satu permintaan gagal; sebuah pointer tetap bertahan; permintaan berikutnya memercayainya. Bagian tersulit dalam memahami kerentanan ini adalah membuktikan hubungan tersebut dengan bukti yang dapat diamati.

Dibandingkan dalam artikel ini1

Terdeteksi dari artikel ini