
CVE-2026-17544 के लिए एक्सप्लॉइट: PHP bcmath OOB लेखन को केवल-मेमोरी RCE में परिवर्तित करके, रनटाइम ऑफ़सेट-मुक्त रिज़ॉल्वर के साथ disable_functions और open_basedir को बायपास करता है।
CVE-2026-17544 के लिए एक हथियारबंद proof-of-concept, जो PHP के rewritten bcmath एक्सटेंशन (bc_str2num) में out-of-bounds write है। यह सार्वजनिक रूप से ज्ञात DoS-only क्रैश को एक पूर्ण, सार्वभौमिक, मेमोरी-ओनली remote code execution प्रिमिटिव में बदल देता है, जो disable_functions और open_basedir दोनों को एक साथ बायपास करता है।
केवल अधिकृत शोध / शैक्षिक उपयोग। इसे केवल उन्हीं सिस्टम पर चलाएँ जिनके आप मालिक हैं या जिन्हें परीक्षण करने के लिए आप स्पष्ट रूप से अधिकृत हैं।
![]()
bc_str2num मैनुअल scale पर भिन्नात्मक भाग को truncate करता है, trailing zeros को फिर से trim करता है, लेकिन को अपडेट नहीं करता। बफर re-trimmed लंबाई के लिए साइज़ किया जाता है जबकि copy pre-trim लंबाई का उपयोग करती है → Zend MM heap में नियंत्रित ।fractional_endzend_string के refcount को शून्य कर देता है (लंबाई preserved रहती है) → refcount-desync use-after-free → giant-string सापेक्ष R/W → fault-safe absolute arbitrary read → runtime symbol resolution → एक पूर्णतः data-only native function call।zend_class_entry + inline function_table + fake zend_function{ handler = zif_shell_exec } बनाता है, फिर इसे एक method के रूप में कॉल करता है। कमांड का आउटपुट एक string के रूप में लौटाया जाता है और response/stdout में भेजा जाता है।.data, और target symbol — सभी runtime पर memory स्कैन करके resolve किए जाते हैं — इसलिए एक ही फ़ाइल विभिन्न builds और distributions पर काम करती है।यह एक sandbox-escape / post-exploitation प्रिमिटिव है, न कि remote-input-only RCE।
| परिदृश्य | परिणाम |
|---|---|
हमलावर पहले से PHP execute कर सकता है (webshell, deserialization, eval sink) लेकिन disable_functions + open_basedir द्वारा प्रतिबंधित है | ✅ Native RCE (यह PoC) |
Application केवल raw user input पर bcmath फ़ंक्शन कॉल करती है, जैसे bccomp($_POST['v']) | ❌ केवल DoS / crash |
हमलावर के इनपुट पर एक single bcmath कॉल बिना किसी feedback के एक blind OOB zero-write देता है। पूर्ण RCE के लिए heap को groom करने, R/W प्रिमिटिव बनाने, और resolver चलाने हेतु arbitrary PHP execution आवश्यक है — इनमें से कोई भी function argument के रूप में व्यक्त नहीं किया जा सकता। इसलिए input-only exposure के लिए यथार्थवादी सीमा एक remote denial of service है; code execution के लिए एक मौजूदा PHP-execution context आवश्यक है, जिसे यह PoC फिर sandbox से मुक्त कर देता है।
यह बग केवल rewritten bcmath (PHP 8.4 / 8.5 लाइन) में मौजूद है:
| PHP branch | असुरक्षित |
|---|---|
| 7.x, 8.0 – 8.3 | नहीं (पुराना libbcmath, अलग bc_str2num) |
| 8.4.0 – 8.4.23 | हाँ |
| 8.5.0 – 8.5.8 | हाँ |
| ≥ 8.4.24 / ≥ 8.5.9 | पैच किया गया |
PHP 8.4.23 और PHP 8.5.8, amd64 पर, समान अपरिवर्तित फ़ाइल के साथ end-to-end सत्यापित (uid=0, आउटपुट कैप्चर किया गया) — Zend struct layout 8.4 / 8.5 में समान है।
bcmath सक्षम के साथ vulnerable range में एक PHP 8.4/8.5 बाइनरी।.text से ELF header तक page-by-page नीचे चलता है; यह किसी भी contiguously-mapped बाइनरी पर सुरक्षित है। केवल कृत्रिम -z separate-code builds, जिनमें unmapped 2 MB gaps होते हैं, blind scan द्वारा auto-resolve नहीं किए जा सकते (production में नहीं देखा गया)।exit() सर्वर को न मार दे: php-fpm, Apache mod_php, या PHP_CLI_SERVER_WORKERS>0 वाला built-in server।php exploit.php "id; uname -a"
इसे जैसे कि shell.php के रूप में deploy करें, फिर:
GET /shell.php?cmd=id
POST cmd=id
कमांड आउटपुट zif_shell_exec के माध्यम से कैप्चर किया जाता है और response body में लिखा जाता है।
bccomp() चलाएँ ताकि OOB zero-write केवल पड़ोसी zend_string के refcount पर पड़े (लंबाई preserved रहे)।zend_reference (indirection के माध्यम से) fault-safe absolute arbitrary read प्रदान करता है जो target के refcounted header को कभी स्पर्श नहीं करता।.text pointer से: ELF magic (base) तक page-step नीचे करें, .data खोजने के लिए program headers parse करें, फिर .data में shell_exec के zend_function_entry को स्कैन करें जिसका handler .text की ओर इंगित करता है।zend_class_entry, एक single bucket के साथ inline function_table (सही zend_string hash, terminated collision chain), और एक fake zend_internal_function बनाएँ जिसका handler zif_shell_exec है; probe object के class pointer को corrupt करें और method invoke करें। आउटपुट लौटाया जाता है और echo किया जाता है।exploit.php — सार्वभौमिक memory-only एक्सप्लॉइट (CLI + web)।सुरक्षा अनुसंधान और शिक्षा के लिए प्रदान किया गया है। लेखक दुरुपयोग के लिए ज़िम्मेदार नहीं है। उन सिस्टम पर deploy न करें जिन्हें आप परीक्षण करने के लिए अधिकृत नहीं हैं।