
PHP CVE-2026-109618/109619 — स्टॉक PHP 8.5.11 पर स्व-निहित अनधिकृत RCE (इन-बैंड PS(id)→कुकी मेमोरी डिस्क्लोज़र + UAF चेन), पूर्ण नियंत्रण सीढ़ियाँ, 8.5.12 पर फिक्स्ड-वर्ज़न नेगेटिव कंट्रोल
PHP 8.5.11 php2shell वर्ग (CVE-2026-109618, CVE-2026-109619) के लिए लैब पुनरुत्पादन और भेद्यता-अनुसंधान पैकेज, अक्टूबर 2026। स्थिति: सिद्ध — स्व-निहित RCE (चार सादे HTTP अनुरोध, कोई डीबगर नहीं, कोई स्थानीय पहुँच नहीं), साथ ही नीचे एम्प्लिफिकेशन, पैच-गैप, और FPM स्टेल-स्टेट निष्कर्ष।
विषय-सूची: परिणाम · श्रृंखलाएँ · एम्प्लिफिकेशन · पैच गैप · FPM स्टेल स्टेट · WAF बायपास · पर्यावरण · त्वरित शुरुआत · प्रमाण अनुशासन · लेआउट · सार्वजनिक संदर्भ · वक्तव्य
| # | निष्कर्ष | वर्गीकरण |
|---|---|---|
| 1 | PHP 8.5.11 पर एंड-टू-एंड स्व-निहित RCE — चार सादे HTTP अनुरोध, PS(id)→कुकी प्रकटीकरण के माध्यम से इन-बैंड पता सोर्सिंग, एक ही 512-बाइट PHPSESSID लीक से दोनों बेस; 12/12 फायर, uid=33, 8 ASLR जनरेशन | सिद्ध — स्व-निहित RCE |
| 2 | डुप्लिकेट 6-बाइट मल्टीपार्ट हेडर के माध्यम से 52x मेमोरी एम्प्लिफिकेशन — PHP 7.4–8.5.11 पर post_max_size को पराजित करता है (2.57 MB बॉडी 128M सीमा को OOM करती है) | सिद्ध — लैब, सभी चार संस्करण |
| 3 | तीन शोषण पथ 8.5.12 सुरक्षा पैच से बच जाते हैं (n=1015 पर var_destroy पुनः-प्रवेश UAF, सीरियलाइज़-हैंडलर बेमेल, अपलोड-प्रगति इंजेक्शन) | सिद्ध — GPG-सत्यापित 8.5.12 पर ASAN |
| 4 | FPM स्टेल BG(unserialize): वर्कर सत्र-डिकोड OOM से बच जाता है, स्टेल स्टेट अगले अनुरोध की rfc1867 विंडो द्वारा उपभोग की जाती है, हीप-आकार का उपभोग वर्कर को SIGSEGV करता है | सिद्ध — तंत्र + DoS; RCE अप्रमाणित |
| 5 | Content-Type विभाजक बायपास (multipart/form-data, boundary=X) — प्रत्येक प्रकाशित Content-Type-एंकरित WAF सिग्नेचर बायपास करने योग्य है | सिद्ध — SAPI.c पार्सर व्यवहार |
| 6 | दोनों CVE श्रृंखलाएँ पैच किए गए 8.5.12 पर मृत (टोकन-समान configure, GPG-सत्यापित स्रोत) | सिद्ध — नकारात्मक नियंत्रण |
| 7 | सार्वजनिक "कैश्ड-zval session.upload_progress" सिद्धांत — 4 स्टॉक PHP संस्करणों + 3 LiteSpeed विक्रेता बिल्ड्स, सभी क्लीनअप/कंकरेंसी कोनों पर खंडित | खंडित — व्यापक |
दो स्वतंत्र मेमोरी-भ्रष्टाचार श्रृंखलाएँ स्टॉक php:8.5.11-apache इमेज पर
हमलावर-नियंत्रित अप्रत्यक्ष कॉल तक पहुँचती हैं; एंड-टू-एंड रैपर चेन B के तंत्र को
पूर्णतः दूरस्थ फायर के लिए एक नए इन-बैंड प्रकटीकरण के साथ जोड़ता है।
| चेन A — स्टेल बकेट | चेन B — डैंगलिंग रेफरेंस | |
|---|---|---|
| तंत्र | OOM बेलआउट एक HashTable बकेट को प्रकाशित लेकिन अनइनिशियलाइज़्ड छोड़ देता है; शटडाउन इसे नकली zval → नकली सरणी → pDestructor के रूप में उपभोग करता है | RINIT-पूर्व OOM PS(http_session_vars) को डैंगलिंग zend_reference पकड़े रहने देता है; एक जीवित 31-बाइट स्ट्रिंग इसे पुनःप्राप्त करती है; जाली रेफरेंस → zend_hash_destroy pDestructor |
| एलोकेटर | ट्रैक्ड/सिस्टम (USE_ZEND_ALLOC=0) | स्टॉक डिफ़ॉल्ट Zend MM |
| टर्मिनल | libc system() (gdb-कैलिब्रेटेड पते) | zif_system @ libphp+0x5996e0 (कोई libc नहीं) |
| फायर समय पर डीबगर | केवल कैलिब्रेशन | कोई नहीं — FIRE_GDB=0 |
| पुनरुत्पादनीयता | 2 यादृच्छिक मूल जनरेशन | बार-बार, क्रॉस-रन सहित |
Leak-A एक लटके हुए PS(id) को सशस्त्र करता है (1001वाँ वेरिएबल max_input_vars को ट्रिप करता है →
headers_sent=1; खाली-कुकी reset_id विफलता send_cookie=1 बनाए रखती है;
एक 24 MiB फ़ील्ड RINIT से पहले OOM करता है)। Leak-B एक 257-तत्व वाला ऐरे रखता है जिसका
zend_array PS(id)−0x10 को ओवरलैप करता है: ZSTR_LEN nTableSize=512 पढ़ता है और
URL-एन्कोडेड कुकी में pDestructor (→ libphp बेस) के साथ-साथ नौ arData
हीप पॉइंटर होते हैं (बहुमत मत → चंक बेस)। मापा गया चंक−libphp डेल्टा
पीढ़ियों में स्थिर नहीं है (−0x1a00000 / +0x3600000 / −0x1c00000),
इसलिए यह डिस्क्लोज़र वास्तव में भार-वहन करने वाला है। फिर फ़ायर
लीक किए गए पतों के साथ चलता है। पूर्वापेक्षाएँ: display_errors=On, post_max_size OOM फ़ील्ड से
अधिक, memory_limit उससे कम, सिंगल-वर्कर prefork।
A status='HTTP/1.1 200 OK' → OOM fatal, worker survives, PS(id) armed
B Set-Cookie: PHPSESSID=<512-byte encoded disclosure>
FIRE → MARKER=uid=33(www-data) gid=33(www-data) groups=33(www-data)
FIRE_OK (×12 across 8 distinct ASLR layouts)
पूर्ण रसीद और नियंत्रण सीढ़ी: docs/END-TO-END.md।
अनुकूलित डुप्लिकेट-हेडर प्रवर्धन: छोटे X: a हेडर (6 बाइट वायर)
प्रत्येक सहेजे गए हेडर के लिए PHP के निश्चित 256-बाइट SMART_STR_START_SIZE का
शोषण करते हैं (~314 B मेमोरी प्रति 6 B वायर)। 8.5.11 पर सटीक OOM-थ्रेशोल्ड
द्विभाजन द्वारा मापा गया; 7.4.33 / 8.1.34 / 8.4.26 पर समान (51–52x):
| memory_limit | न्यूनतम OOM बॉडी | प्रवर्धन |
|---|---|---|
| 8M | 153 KB | 54.8x |
| 32M | 636 KB | 52.8x |
| 128M | 2.57 MB | 52.3x |
| 256M | 5.14 MB | 52.2x |
सभी बॉडी एक स्टॉक post_max_size=8M के भीतर फिट हो जाती हैं — व्यावहारिक
अपलोड अवरोध हर अनपैच्ड संस्करण पर विफल हो जाता है। चंक्ड फ्रेमिंग
इसके अतिरिक्त Content-Length पूर्व-जाँच को बायपास करती है (8.85 MB चंक्ड पार्स
हुआ और OOM हुआ, जबकि Content-Length वाली वही बॉडी अस्वीकृत हुई)।
8.5.12 पैच दोनों वेक्टर बंद कर देता है (अज्ञात-हेडर फ़िल्टरिंग + स्ट्रीमिंग
post_max_size प्रवर्तन)। नेस्टेड-ऐरे "बम" आकार घातीय के रूप में पुनरुत्पादित
नहीं होता (अधिकतम 9.6x, 1.16 MiB — 8M को भी OOM नहीं कर सकता)।
विवरण: docs/RELEASE-RECONCILIATION-2026-10-21.md।
GPG-सत्यापित, टोकन-समान 8.5.12 ASAN बिल्ड पर सत्यापित — दोनों CVE ठीक हो गए हैं, लेकिन प्रभाव के तीन अलग-अलग पथ पैच के बाद भी बचे हैं:
var_unserializer.c:906:67 पर); पैच के
ZEND_HAS_OOM गार्ड इस पथ पर निष्क्रिय हैं; BG(serialize_lock) अभी भी
__destruct डिस्पैच के आसपास नहीं लिया जाता।php_serialize द्वारा लिखी गई |-कुंजी सत्र
जिसे ऐप-चरण session_start() के बाद php हैंडलर द्वारा डिकोड किया जाता है,
mod_php php_value और FPM .user.ini दोनों पर गैजेट को इंस्टैंशिएट करता है;
पैच का incomplete_classes_only गार्ड केवल pre-RINIT
अपलोड विंडो तक सीमित है।php:8.5.11-fpm पर लैब-सत्यापित: memory_limit=32M पर 24 MB सत्र
php_var_unserialize के भीतर OOM होता है और वर्कर जीवित रहता है — exit-70
अवरोध केवल स्टार्टअप OOM पर लागू होता है। gdb दिखाता है कि BG(unserialize).level=1
और स्टेल डेटा पॉइंटर अगले अनुरोध की rfc1867 pre-RINIT विंडो में बना रहता है;
8191-बाइट मल्टीपार्ट फ़ील्ड 8216-बाइट _emalloc उत्पन्न करता है जो स्टेल पॉइंटर
को ओवरलैप करता है और अनुरोध स्टार्टअप के दौरान var_tmp_var में वर्कर को
SIGSEGV कर देता है। मापा गया प्रभाव: दोहराने योग्य वर्कर क्रैश (DoS) और एक
मेमोरी-करप्शन प्रिमिटिव; क्रैश से आगे RCE अप्रमाणित है। पूर्वापेक्षाएँ: कम
memory_limit, बड़ा हमलावर-प्रभावित सत्र, एक session_start() एंडपॉइंट,
upload_progress=On, और विश्वसनीय समान-वर्कर युग्मन के लिए
pm=static max_children=1। इसलिए FPM इस वर्ग के लिए सशर्त रूप से, न कि
निरपेक्ष रूप से, सुरक्षित है।
Content-Type: multipart/form-data, boundary=X (कॉमा विभाजक) PHP द्वारा
स्वीकार किया जाता है — SAPI.c ;, ,, और स्पेस पर ट्रिम करता है।
Content-Type: multipart/form-data; पर आधारित हर प्रकाशित
php2shell WAF सिग्नेचर बायपास करने योग्य है। डिफ़ेंडर मार्गदर्शन
docs/WAF-BYPASS.md में है।
display_errors=Off, और उच्च memory_limit सभी
वास्तविक बाधाएँ बनी हुई हैं — फ्लीट अध्ययन देखें
docs/RELEASE-RECONCILIATION-2026-10-21.md में);