
CVE-2026-109618/109619 — 5 RCE श्रृंखलाएँ + डिटेक्शन नियम (Suricata, Sigma, ModSecurity)। PHP session.upload_progress प्री-ऑथ एक्सप्लॉइट अनुसंधान।
CVE-2026-109618 और CVE-2026-109619 — PHP प्री-ऑथ RCE एक्सप्लॉइट और डिटेक्शन टूलकिट
एक्सप्लॉइट · डिटेक्शन · लैब · राइटअप
PHP के session.upload_progress और Zend इंजन के OOM बेलआउट का शोषण करने वाली पाँच स्वतंत्र RCE चेन। 14 वर्षों का भेद्य कोड — PHP 5.4.0 (2012) से 8.5.11 तक। प्री-ऑथ। कुछ चेन के लिए किसी एप्लिकेशन भेद्यता की आवश्यकता नहीं है।
78% सभी वेबसाइटों को प्रभावित करता है — जिनमें WordPress (43%), Joomla, Drupal, Laravel, Magento, और हर डिफ़ॉल्ट PHP इंस्टॉलेशन शामिल है।
लेखक: Qi Deng | राइटअप: Substack | दिनांक: 2026-10-21
| CVE | GHSA | CVSS | विवरण |
|---|---|---|---|
| CVE-2026-109618 | GHSA-w8hw-w9fx-j79w | 9.2 | OOM → longjmp() Zend इंजन की स्थिति को अमान्य छोड़ देता है → RCE |
| CVE-2026-109619 | GHSA-6wmf-4rv5-p3rp | 9.2 | FPM वर्कर अनुरोधों में पुरानी वैश्विक स्थिति → UAF → RCE |
पैच: Commit 3584a98 — Zend इंजन में 300 फ़ाइलें बदली गईं।
| चेन | वेक्टर | प्री-ऑथ | शर्तें | SAPI |
|---|---|---|---|---|
| A | सत्र इंजेक्शन + LFI | हाँ | ऐप में कोई भी LFI सिंक हो | सभी |
| B | var_destroy UAF → हैंडलर ओवरराइट | नहीं | ऐप unserialize() कॉल करता है | सभी |
| C | हैंडलर बेमेल → __destruct | हाँ | अलग-अलग serialize_handler वाली दो डायरेक्टरियाँ | FPM |
| D | OOM करप्शन → पुराना EG() | हाँ | कोई नहीं — कोई भी एंडपॉइंट | mod_php |
| E | FPM सत्र OOM → पुराना BG() | हाँ | प्रोड्यूसर: कोई भी session_start() एंडपॉइंट; कंज़्यूमर: कोई भी एंडपॉइंट | FPM |
चेन D सबसे गंभीर है: किसी भी Apache mod_php इंस्टॉलेशन के विरुद्ध शून्य-निर्भरता प्री-ऑथ RCE।
चेन E FPM पर लगभग उतनी ही व्यापक है: प्रोड्यूसर को किसी भी ऐसे एंडपॉइंट की आवश्यकता होती है जो session_start() कॉल करता हो (लगभग सार्वभौमिक — WordPress, Laravel, Joomla, Drupal सभी ऐसा करते हैं), और कंज़्यूमर कोई भी PHP एंडपॉइंट हो सकता है — rfc1867 upload_progress हैंडलर एप्लिकेशन कोड से पहले SAPI स्टार्टअप के दौरान चलता है। सत्यापित: nosession.php (कोड में session_start() नहीं) पुरानी BG(unserialize) स्थिति का उपभोग करते समय 502 क्रैश ट्रिगर करता है।
तीन RCE एक्सप्लॉइट (चेन A, B, C) exploit/ में शामिल हैं:
| फ़ाइल | चेन | यह क्या करता है |
|---|---|---|
chain_a_session_lfi.py | A | अपलोड फ़ाइलनाम के माध्यम से PHP कोड इंजेक्ट करता है → LFI सत्र फ़ाइल को शामिल करता है → RCE |
chain_b_uaf_rce.php | B | var_destroy UAF → EG() के माध्यम से zif_system खोजता है → /proc/self/mem के माध्यम से var_dump हैंडलर को ओवरराइट करता है → RCE |
chain_c_mismatch_rce.py | C | FPM वर्कर PS(serializer) को दूषित करता है → फ़ाइलनाम के माध्यम से सीरियलाइज़्ड ऑब्जेक्ट इंजेक्ट करता है → डिकोड विफलता पर __destruct सक्रिय होता है → RCE |
Chains D और E exploits paid subscribers के लिए उपलब्ध हैं।
# Chain A: Session injection + LFI → RCE
python3 exploit/chain_a_session_lfi.py --host TARGET --port 80 --command 'id'
# Chain B: var_destroy UAF → RCE (run on target or via uploaded webshell)
php exploit/chain_b_uaf_rce.php
# Chain C: Handler mismatch → __destruct → RCE
python3 exploit/chain_c_mismatch_rce.py --host TARGET --port 80 --command 'id'
detection/ में पूर्व-निर्मित IDS / WAF / SIEM नियम:
| फ़ाइल | प्रारूप | सिग्नेचर |
|---|---|---|
php2shell.rules | Suricata / Snort | 13 नियम — request, response, और recon |
php2shell.yaml | Sigma | 5 नियम — web logs, process creation, file events |
modsecurity.conf | ModSecurity v2/v3 | 7 नियम — Apache/Nginx के लिए drop-in |
php2shell.lua | OpenResty Lua | हल्का रिवर्स प्रॉक्सी मॉड्यूल |
सबसे तेज़ उपाय: multipart POST बॉडी में PHP_SESSION_UPLOAD_PROGRESS को ब्लॉक करें। इसका वैध उपयोग लगभग शून्य है, और यह दोनों CVE के प्राथमिक हमला वेक्टर को कवर करता है।
git clone https://github.com/ikow/php2shell-poc.git && cd php2shell-poc
# Start the lab (PHP-FPM + nginx + Apache mod_php)
cd lab && docker compose up -d
# Verify each chain
python3 ../poc/verify_session_injection.py --target http://127.0.0.1:18080
python3 ../poc/verify_handler_mismatch.py --target http://127.0.0.1:18080
python3 ../poc/verify_oom_trigger.py --host 127.0.0.1 --port 18081
python3 ../poc/verify_fpm_stale_state.py --target http://127.0.0.1:18080
# Run an exploit
python3 ../exploit/chain_a_session_lfi.py --host 127.0.0.1 --port 18080 --command 'id'
php2shell-poc/
├── exploit/
│ ├── chain_a_session_lfi.py # RCE: session injection + LFI
│ ├── chain_b_uaf_rce.php # RCE: var_destroy UAF → handler overwrite
│ └── chain_c_mismatch_rce.py # RCE: handler mismatch → __destruct
├── detection/
│ ├── php2shell.rules # Suricata / Snort IDS rules
│ ├── php2shell.yaml # Sigma SIEM detection rules
│ ├── modsecurity.conf # ModSecurity WAF rules
│ └── php2shell.lua # OpenResty / Nginx Lua WAF module
├── poc/
│ ├── verify_session_injection.py # Verify Chain A
│ ├── verify_uaf_asan.php # Verify Chain B (ASAN)
│ ├── verify_handler_mismatch.py # Verify Chain C
│ ├── verify_oom_trigger.py # Verify Chain D
│ └── verify_fpm_stale_state.py # Verify Chain E
├── lab/
│ ├── docker-compose.yml # PHP-FPM + nginx + Apache mod_php
│ ├── setup.sh # One-click lab setup
│ └── php.ini / php-apache.ini # Vulnerable PHP configs
└── docs/
├── ANALYSIS.md # Full technical analysis
└── substack_article.md # Writeup source
; Immediate — reduces attack surface
session.upload_progress.enabled = Off
session.use_only_cookies = On
एकमात्र पूर्ण समाधान PHP को 8.2.35 / 8.3.36 / 8.4.27 / 8.5.12+ पर पैच करना है। OOM करप्शन (Chain D) Zend इंजन के कोर में है — कोई भी INI सेटिंग इसे ठीक नहीं करती।
Wiz ने स्टॉक कंटेनर इमेजों पर प्री-ऑथ RCE प्रदर्शित किया है:
| प्लेटफ़ॉर्म | असुरक्षित | टिप्पणियाँ |
|---|---|---|
| WordPress | हाँ | कोर PHP सेशन का उपयोग नहीं करता, लेकिन WooCommerce और कई प्लगइन करते हैं |
| Joomla | हाँ | डिफ़ॉल्ट रूप से नेटिव PHP सेशन का उपयोग करता है |
| Drupal | हाँ | डिफ़ॉल्ट रूप से नेटिव PHP सेशन का उपयोग करता है |
| Magento | हाँ | मेंटेनेंस मोड में भी असुरक्षित |
| Laravel | हाँ | PendingBroadcast एक ज्ञात __destruct गैजेट है |