
You are solely responsible for any actions or activities related to the material on this website. Some of the content here may be harmful or dangerous if misused. If you do not fully understand any material on this site, please leave. Before accessing or using these materials in any way, review the laws that apply in your province or country. All materials are provided for educational and research purposes only.
Ringkasan
PHP2Shell adalah nama yang diberikan untuk dua kerentanan kritis pada PHP core yang ditemukan oleh tim Wiz Research pada Agustus 2026. Kerentanan ini memiliki skor CVSS 9.2 dan mempengaruhi semua versi PHP sejak 5.4 (dirilis tahun 2012), yang berarti sekitar 70% dari seluruh website di internet berpotensi terdampak.
- CVE-2026-109618 — Upload-progress unserializer use-after-free → Memory disclosure & RCE
- CVE-2026-109619 — Fatal-error backtrace use-after-free + OPcache type confusion → RCE
Keduanya memungkinkan unauthenticated Remote Code Execution — penyerang hanya membutuhkan satu HTTP request yang ter-craft khusus, tanpa login apapun.
Versi PHP yang Terdampak
Bug ini ada di setiap PHP yang belum di-patch sejak versi 5.4. PHP merilis patch pada 21 Oktober 2026.
| Branch | Fixed Version | Status |
|---|---|---|
| 8.5 | 8.5.12 | Active support s/d 31 Des 2027 |
| 8.4 | 8.4.27 | Active support s/d 31 Des 2026 |
| 8.3 | 8.3.36 | Security-only s/d 31 Des 2027 |
| 8.2 | 8.2.35 | Security-only s/d 31 Des 2026 |
| 8.1, 8.0, 7.4 | Backport minimal | End of Life |
| 7.3 ke bawah | Tidak ada fix | End of Life |
Teknis: Bagaimana PHP2Shell Bekerja
Untuk memahami PHP2Shell, kita perlu mengerti bagaimana PHP menangani request di level internal, khususnya fitur session.upload_progress.
Session Upload Progress
PHP memiliki fitur bawaan bernama session.upload_progress yang melacak progress file upload. Fitur ini aktif secara default dan berjalan sebelum kode aplikasi dieksekusi — artinya, bahkan jika aplikasi tidak pernah memanggil session_start(), fitur ini tetap aktif.
Ketika PHP menerima multipart/form-data request dengan field PHP_SESSION_UPLOAD_PROGRESS, PHP secara otomatis:
- Menginisialisasi session handler
- Mem-parse dan men-decode data session
- Menjalankan unserializer untuk me-restore session state
Semua ini terjadi di pre-initialization window — sebelum module-module PHP normal diinisialisasi sepenuhnya.
Bug 1: Upload-Progress Unserializer Use-After-Free (CVE-2026-109618)
Ini adalah bug utama. Alurnya:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[Request 1 - Trigger]
│
├── PHP menerima multipart/form-data request
├── Session upload-progress handler aktif
├── Unserializer mulai decode session data
├── Bookkeeping state disimpan di BG(unserialize)
├── ⚠ Fatal allocation failure (OOM) terjadi di tengah proses
├── Request heap di-destroy
└── BG(unserialize) global state TETAP TERPUBLISH (stale)
[Request 2 - Exploit] (di-handle worker yang sama)
│
├── PHP menggunakan BG(unserialize) yang stale
├── Worker mengakses freed memory sebagai live bookkeeping
├── Attacker telah mereclaim memory tersebut
└── ⚠ MEMORY CORRUPTION → RCE
Yang terjadi secara teknis:
- PHP Session module men-decode session data saat upload-progress handling
- Decoder menyimpan request-owned bookkeeping di
BG(unserialize)(sebuah global state) - Fatal allocation failure (OOM) menginterupsi proses ini
- Request heap di-destroy, tapi global state
BG(unserialize)tidak di-cleanup - Pada request berikutnya oleh worker yang sama, PHP membaca
BG(unserialize)yang sudah stale - Memory yang ditunjuk sudah di-free dan bisa di-reclaim oleh penyerang
- Ini menjadi memory-corruption primitive yang powerful
Bug 2: Remote Process-Memory Disclosure (CVE-2026-109618)
Bug yang sama juga memungkinkan memory disclosure:
1
2
3
4
5
6
7
8
9
10
11
[Request]
│
├── Multipart request dikirim
├── Upload-progress handler menginisialisasi Session state
├── Session ID dipublish di PS(id)
├── ⚠ OOM error → request abort sebelum cleanup selesai
├── PHP men-destroy request memory, TAPI...
├── Session ID (PS(id)) masih menunjuk ke freed memory
└── PHPSESSID response cookie berisi FREED WORKER MEMORY
└── 🔓 Bisa mengandung: passwords, session tokens,
API keys, TLS private keys dari request lain
Bug 3: Fatal-Error Backtrace Use-After-Free (CVE-2026-109619)
1
2
3
4
5
6
7
8
9
10
11
12
[Request 1]
│
├── Fatal error terjadi (misal OOM)
├── Error handler menyimpan backtrace
├── Request memory di-deallocate
└── Backtrace pointer tetap ada di global state
[Request 2] (worker yang sama)
│
├── Worker mengakses dangling backtrace pointer
├── Memory sudah di-reclaim attacker
└── ⚠ Cross-request use-after-free → MEMORY CORRUPTION → RCE
Bug 4: OPcache Type Confusion (CVE-2026-109619)
OPcache menyimpan compiled PHP structures di shared memory dengan index ke per-worker runtime-pointer maps:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[Normal Flow]
Worker A: zend_accel_script_persist()
├── Advance CG(map_ptr_last) [process-local frontier]
├── Persist objects ke shared memory
└── Publish shared frontier ✓ (sinkron)
[Vulnerable Flow]
Worker A: zend_accel_script_persist()
├── Advance CG(map_ptr_last) [process-local frontier]
├── ⚠ Allocation failure di TENGAH persistence
├── Process-local frontier sudah maju
├── Shared frontier BELUM diupdate
└── Partially persisted objects merujuk ke slots
yang shared state anggap masih "available"
[Exploitation]
Worker B:
├── Menggunakan slot yang "available" untuk object berbeda
├── Stale shared metadata resolve ke pointer WRONG TYPE
└── ⚠ Cross-worker TYPE CONFUSION → corrupt OPcache → RCE
Rantai Eksploitasi
Tim Wiz mendemonstrasikan unauthenticated RCE pada instalasi default WordPress, Drupal, dan Joomla dengan menggabungkan bug-bug di atas:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Langkah 1: Memory Disclosure (CVE-2026-109618)
│ Kirim crafted multipart request
│ Trigger OOM pada upload-progress handler
│ Baca freed memory dari PHPSESSID cookie
│ → Dapatkan alamat memory (bypass ASLR)
│
Langkah 2: Memory Corruption (CVE-2026-109618 + CVE-2026-109619)
│ Gunakan alamat memory untuk craft payload
│ Trigger use-after-free pada unserializer
│ Reclaim freed memory dengan controlled data
│ → Arbitrary code execution
│
Langkah 3: Shell Access
└── Eksekusi command sebagai user PHP worker
(www-data, apache, nginx, dll)
Semua SAPI PHP terdampak: mod_php, PHP-FPM, php-cgi, FrankenPHP, dan LiteSpeed.
Vektor Serangan
Setiap teknik yang diketahui menggunakan multipart/form-data request — format yang digunakan browser untuk file upload. PHP mem-parse body ini sebelum kode aplikasi berjalan, sehingga:
- Tidak perlu autentikasi
- Tidak perlu endpoint upload yang valid
- Tidak perlu aplikasi yang menggunakan session
- Cukup PHP yang berjalan dengan konfigurasi default
Deteksi
Sinyal yang perlu dimonitor:
- Request anomali — Multipart request yang tidak biasa ke endpoint yang bukan upload
- Memory errors —
memory_limiterrors saat request initialization - HTTP 500 berulang — Repeated server errors dari PHP worker yang sama
- PHPSESSID cookie anomali — Cookie yang berukuran besar atau berisi data yang tidak wajar (bisa mengandung leaked memory)
- Unexpected process spawning —
php-fpm,httpd, atauapache2menjalankan shell,curl, atauwget
Contoh rule deteksi di log:
1
2
3
4
5
6
7
8
# Cari multipart request yang mencurigakan di access log
grep -E 'multipart/form-data.*PHP_SESSION_UPLOAD_PROGRESS' /var/log/nginx/access.log
# Monitor unexpected child processes dari PHP
ps aux | grep -E '(php-fpm|httpd|apache2)' | grep -v grep
# Cek error log untuk OOM patterns
grep -E 'Allowed memory size.*exhausted' /var/log/php*.log
Mitigasi
1. Update PHP (Satu-satunya Solusi Lengkap)
1
2
3
4
5
6
7
8
9
10
11
12
13
# Cek versi PHP saat ini
php -v
# Update ke versi yang sudah di-patch
# Debian/Ubuntu
sudo apt update && sudo apt install php8.3
# CentOS/RHEL
sudo yum update php
# Verifikasi
php -v
# Pastikan versi >= 8.2.35, 8.3.36, 8.4.27, atau 8.5.12
2. Mitigasi Sementara: Disable Session Upload Progress
Untuk mod_php — edit php.ini:
1
2
session.upload_progress.enabled = 0
memory_limit = -1
Untuk PHP-FPM — edit pool config (misal /etc/php/8.3/fpm/pool.d/www.conf):
1
2
php_admin_flag[session.upload_progress.enabled] = off
php_admin_value[memory_limit] = -1
1
2
# Restart PHP-FPM setelah perubahan
sudo systemctl reload php8.3-fpm
⚠ PHP core developer Gina Peter Banyard memperingatkan bahwa mematikan session upload progress saja tidak cukup. Kombinasikan dengan block multipart di web server.
3. Mitigasi Sementara: Block Multipart Request di Web Server
Nginx:
1
2
3
4
# Tambahkan ke setiap server block yang forward ke PHP
if ($http_content_type ~* "multipart/form-data") {
return 403;
}
1
nginx -t && sudo systemctl reload nginx
Apache:
1
2
3
4
# Tambahkan ke setiap <VirtualHost> yang serve PHP
RewriteEngine On
RewriteCond %{HTTP:Content-Type} multipart/form-data [NC]
RewriteRule ^ - [F]
⚠ Rule ini akan memblokir semua file upload, termasuk upload gambar di admin panel. Test fungsionalitas setelah menerapkan, dan hapus rule setelah PHP di-update.
Timeline
| Tanggal | Event |
|---|---|
| 19 Agustus 2026 | Wiz Research menemukan bug pertama menggunakan AI (Gemini 4 Argon + GPT-5.6 Sol) |
| 20 Agustus 2026 | Unauthenticated RCE dikonfirmasi terhadap Drupal |
| 21 Agustus 2026 | Unauthenticated RCE dikonfirmasi terhadap WordPress |
| 24 Agustus 2026 | Wiz melaporkan kerentanan ke PHP security team |
| 21 September 2026 | PHP acknowledge dan mulai develop fix |
| 21 Oktober 2026 | Patch PHP dirilis + Public disclosure |
Vendor yang Terdampak
Selain CMS populer, beberapa vendor infrastruktur juga terdampak:
- Palo Alto Networks — PAN-OS 12.2, 12.1, 11.2, 11.1, 10.2 dan semua versi Panorama. Belum ada fixed release, tersedia Threat Prevention signatures (Threat IDs 543004, 97622-97625).
- Cisco — Expressway dan Expressway Select (CSCwx37062) rated Critical, fix di 15.5.21. Snort rules 67359 dan 67360 tersedia.
- Fortinet — FortiADC Manager, FortiClient Cloud Services, FortiDDoS sedang dalam investigasi.
Kesimpulan
PHP2Shell adalah kerentanan level engine yang berjalan di bawah layer aplikasi. Tidak ada kode PHP yang bisa memperbaiki ini — Anda harus update PHP itu sendiri. Kerentanan ini dibandingkan dengan Heartbleed dan Log4Shell karena skala dampaknya yang masif.
Jika Anda menjalankan server PHP, update sekarang.
Indicator of Compromise (IOC)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
103.216.220.92
31.223.184.166
37.19.200.5
134.209.159.64
103.114.163.188
95.217.98.37
85.11.167.243
45.198.224.169
109.71.252.97
221.14.159.134
91.90.123.25
104.28.233.1
104.28.233.170
109.71.252.97
114.26.103.7
136.69.138.1
136.69.138.198
176.65.132.128
184.73.151.2
20.200.234.1
20.24.237.20
3.68.250.21
34.136.122.2
34.136.122.211
45.198.224.1
46.101.229.1
5.189.184.11
51.143.62.24
52.250.54.23
54.154.150.2
77.109.105.1
85.11.167.24
92.118.112.100
94.154.43.7
150ae88f0999032e2a6113501d6082f54a3ed98d02427b21a96e773a27d7bf16
40caf199ca1ebe056a74427f8e9db06c66899e33ae09c0ec2769ec70bf6dd8e7
27d926a6708d6769d97d065e7a5a860ab496eab272c03d1cebc55ec71b954fa2
1485e14e0f62bc94664eec341cabd275dad7d30b1d496c40ec340c9a0d9f0ba8
Referensi
- Wiz Research — PHP2Shell: AI uncovers critical RCE vulnerabilities affecting 70% of the Internet
- watchTowr — PHP2Shell RCE Exploited: CVE-2026-109618 & CVE-2026-109619
- Sansec — PHP2Shell: PHP RCE (CVE-2026-109618, CVE-2026-109619)
- SOCRadar — PHP2Shell: Critical PHP RCE Flaws, Affected Versions, and How to Fix Them
- SentinelOne — Stopping PHP2SHELL