Posts PHP2Shell - Analisis Kerentanan Kritis PHP RCE (CVE-2026-109618 & CVE-2026-109619)
Post
Cancel

PHP2Shell - Analisis Kerentanan Kritis PHP RCE (CVE-2026-109618 & CVE-2026-109619)

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.

BranchFixed VersionStatus
8.58.5.12Active support s/d 31 Des 2027
8.48.4.27Active support s/d 31 Des 2026
8.38.3.36Security-only s/d 31 Des 2027
8.28.2.35Security-only s/d 31 Des 2026
8.1, 8.0, 7.4Backport minimalEnd of Life
7.3 ke bawahTidak ada fixEnd 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:

  1. Menginisialisasi session handler
  2. Mem-parse dan men-decode data session
  3. 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:

  1. PHP Session module men-decode session data saat upload-progress handling
  2. Decoder menyimpan request-owned bookkeeping di BG(unserialize) (sebuah global state)
  3. Fatal allocation failure (OOM) menginterupsi proses ini
  4. Request heap di-destroy, tapi global state BG(unserialize) tidak di-cleanup
  5. Pada request berikutnya oleh worker yang sama, PHP membaca BG(unserialize) yang sudah stale
  6. Memory yang ditunjuk sudah di-free dan bisa di-reclaim oleh penyerang
  7. 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:

  1. Request anomali — Multipart request yang tidak biasa ke endpoint yang bukan upload
  2. Memory errors — memory_limit errors saat request initialization
  3. HTTP 500 berulang — Repeated server errors dari PHP worker yang sama
  4. PHPSESSID cookie anomali — Cookie yang berukuran besar atau berisi data yang tidak wajar (bisa mengandung leaked memory)
  5. Unexpected process spawning — php-fpm, httpd, atau apache2 menjalankan shell, curl, atau wget

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


TanggalEvent
19 Agustus 2026Wiz Research menemukan bug pertama menggunakan AI (Gemini 4 Argon + GPT-5.6 Sol)
20 Agustus 2026Unauthenticated RCE dikonfirmasi terhadap Drupal
21 Agustus 2026Unauthenticated RCE dikonfirmasi terhadap WordPress
24 Agustus 2026Wiz melaporkan kerentanan ke PHP security team
21 September 2026PHP acknowledge dan mulai develop fix
21 Oktober 2026Patch 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


This post is licensed under do wtf you want with it.