Docker सत्यापन लैब और CVE-2026-89274 के लिए Python PoC, जो WP Recipe Maker <= 10.8.1 में rating-comment reviewBody के माध्यम से मनमाने शॉर्टकोड निष्पादन को सिद्ध करता है।
CVE-2026-89274 को पुनरुत्पादित और सत्यापित करने के लिए सुरक्षा-अनुसंधान सामग्री: WP Recipe Maker <= 10.8.1 रेसिपी JSON-LD मेटाडेटा के अंदर मनमाने पंजीकृत WordPress शॉर्टकोड्स को निष्पादित करता है, जो एक स्वीकृत रेटिंग टिप्पणी के माध्यम से लगाए जाते हैं।
do_shortcode_safe से बदला गया)AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:N) - CWE-94केवल उन सिस्टमों पर उपयोग करें जिनके आप स्वामी हैं या जिनका परीक्षण करने के लिए आपको स्पष्ट रूप से अधिकृत किया गया है। PoC एक रेटिंग टिप्पणी पोस्ट करता है जिसमें एक लैब-पंजीकृत मार्कर शॉर्टकोड होता है। कोई विनाशकारी शॉर्टकोड उपयोग नहीं किया जाता है और डिस्क पर कुछ भी नहीं लिखा जाता है।
स्थिति: प्रदान की गई लैब में सिद्ध।
WP Recipe Maker 10.8.1 (WordPress 7.1.2, डिफ़ॉल्ट रेसिपी-कार्ड मॉडल):
comment posted : "[cve89274]" + wprm-comment-rating=5 on the recipe's parent post
result : JSON-LD on the rendered page contains
"reviewBody":"CVE89274-SHORTCODE-FIRED"
(marker shortcode executed server-side at render time)
10.8.2 : shortcode stripped, marker absent (patched negative control)
यह पृष्ठ मेटाडेटा में एम्बेडेड आउटपुट के साथ एक मनमाने पंजीकृत शॉर्टकोड के सर्वर-साइड निष्पादन को प्रदर्शित करता है, जो प्रत्येक आगंतुक को प्रकट किया जाता है। यह RCE प्रदर्शित नहीं करता; प्रभाव इस पर निर्भर करता है कि लक्ष्य पर कौन से शॉर्टकोड पंजीकृत हैं (post/meta एक्सपोज़र, साइड इफेक्ट वाले प्लगइन-प्रदान किए गए शॉर्टकोड)।
WPRM_Metadata::sanitize_metadata() रेसिपी के संरचित मेटाडेटा ऐरे के प्रत्येक स्केलर
फ़ील्ड को पुनरावर्ती रूप से सैनिटाइज़ करता है:
// includes/public/class-wprm-metadata.php:553, WP Recipe Maker 10.8.1
$sanitized = strip_shortcodes( wp_strip_all_tags( do_shortcode( $metadata ) ) );
// 10.8.2
$sanitized = strip_shortcodes( wp_strip_all_tags( WPRM_Instacart::do_shortcode_safe( $metadata ) ) );
do_shortcode() पहले शॉर्टकोड निष्पादित करता है; strip_shortcodes()
रैपर केवल पहले से निष्पादित आउटपुट से टैग हटाता है। फ़ील्ड्स में से एक,
reviewBody, wprm-comment-rating मेटा मान वाली स्वीकृत टिप्पणियों के
comment_content से शब्दशः भरा जाता है
(class-wprm-metadata.php:1016), जो रेसिपी के पैरेंट
पोस्ट (post_id => $recipe->parent_post_id(), पंक्ति 973) के विरुद्ध क्वेरी किया जाता है - वह पोस्ट या पृष्ठ
जहाँ रेसिपी कार्ड एम्बेडेड है।
10.8.2 प्रतिस्थापन, WPRM_Instacart::do_shortcode_safe()
(class-wprm-instacart.php:501), केवल आंतरिक सामग्री रखता है और
कुछ भी निष्पादित नहीं करता।
[wprm-recipe] एम्बेड करता है)।/wp-comments-post.php पर बॉडी में शॉर्टकोड और
wprm-comment-rating=5 के साथ एक टिप्पणी POST करें।review ऐरे में टिप्पणी शामिल करता है, और
sanitize_metadata() शॉर्टकोड निष्पादित करता है। इसका आउटपुट
reviewBody के अंदर टिप्पणी टेक्स्ट को बदल देता है, जो प्रत्येक आगंतुक को दिखाई देता है।आवश्यकताएँ: Compose v2 के साथ Docker, होस्ट पर Python 3.10+।
./lab verify
10.8.1 लैब बनाता है, मार्कर के फायर होने की आवश्यकता करता है, फिर 10.8.2
लैब बनाता है और उसकी अनुपस्थिति की आवश्यकता करता है। ./lab reset के साथ सब कुछ हटाएँ।
कमज़ोर नियंत्रण:
[!!!] SHORTCODE EXECUTION CONFIRMED
evidence: 'CVE89274-SHORTCODE-FIRED' present in the rendered recipe page
context : ..."reviewBody":"CVE89274-SHORTCODE-FIRED","author":...
RESULT: VULNERABLE CONTROL CONFIRMED
पैच किया गया नियंत्रण:
[=] shortcode text present but NOT executed: output was stripped
RESULT: PATCHED CONTROL CONFIRMED
पृष्ठ में केवल प्रदर्शित टिप्पणी (कच्चे टेक्स्ट) के अंदर एक मार्कर प्रमाण के रूप में स्वीकार नहीं किया जाता; मार्कर को मेटाडेटा में निष्पादित आउटपुट के रूप में प्रकट होना चाहिए।
./lab start vulnerable # 10.8.1 lab on http://127.0.0.1:9482
./lab test # assert marker fires
./lab start patched # 10.8.2 lab
./lab test # assert absence
./lab status
./lab reset
PoC को हाथ से चलाएँ (डिफ़ॉल्ट रूप से लूपबैक; अधिकृत बाहरी लक्ष्यों के लिए स्पष्ट ओवरराइड की आवश्यकता है):
python3 poc/poc_cve_2026_89274.py --url http://127.0.0.1:9482 --post-id 5
python3 poc/poc_cve_2026_89274.py --url https://target.example \
--allow-authorized-non-loopback [--insecure]
nuclei टेम्पलेट (nuclei/cve-2026-89274.yaml) केवल एक संस्करण स्क्रीन है
(readme.txt स्थिर टैग <= 10.8.1)। व्यवहारिक श्रृंखला के लिए टिप्पणी
सबमिशन और एक स्वीकृति संक्रमण की आवश्यकता होती है, जिसे
nuclei में व्यक्त करना व्यावहारिक नहीं है; Python PoC पूरा प्रवाह करता है।
| संस्करण | मूल्यांकन |
|---|---|
| WP Recipe Maker 10.8.1 | शॉर्टकोड निष्पादन शुरू से अंत तक पुनरुत्पादित |
| WP Recipe Maker 10.8.2 | पैच किया गया नकारात्मक नियंत्रण पुनरुत्पादित |
| WP Recipe Maker <= 10.8.0 | सलाह के अनुसार प्रभावित; व्यक्तिगत रूप से परीक्षण नहीं किया गया |
.
├── .github/workflows/validate.yml
├── .gitignore
├── LICENSE
├── README.md
├── SECURITY.md
├── docker-compose.yml
├── lab
├── nuclei/
│ └── cve-2026-89274.yaml
└── poc/
└── poc_cve_2026_89274.py
कमिट नहीं किया गया: assets/ (प्लगइन ज़िप), .lab-state, __pycache__/।
| दावा | स्थिति |
|---|---|
| रेटिंग टिप्पणी reviewBody के माध्यम से शॉर्टकोड निष्पादन | सिद्ध (10.8.1) |
| रेंडर किए गए JSON-LD में निष्पादन आउटपुट प्रकट | सिद्ध |
| पैच किया गया नकारात्मक नियंत्रण (10.8.2) | सिद्ध |
| डिफ़ॉल्ट कॉन्फ़िगरेशन (निजी रेसिपी CPT + पैरेंट पोस्ट) | सिद्ध (यह लैब टोपोलॉजी है) |
| सार्वजनिक रेसिपी पोस्ट प्रकार कॉन्फ़िगरेशन | परीक्षण नहीं किया गया |
| वैकल्पिक प्रवेश के रूप में WPRM का स्वयं का रेटिंग REST एंडपॉइंट | परीक्षण नहीं किया गया |
| पंजीकृत शॉर्टकोड आउटपुट से परे प्रभाव (RCE) | दावा नहीं किया गया |
इस रिपॉज़िटरी को केवल उन सिस्टमों पर चलाएँ जिनके आप स्वामी हैं या जिनका परीक्षण करने के लिए आपको स्पष्ट रूप से अधिकृत किया गया है।
लैब ड्राइवर vulnerable/patched के अलावा अन्य वेरिएंट्स से इनकार करता है,
PoC गैर-लूपबैक लक्ष्यों से इनकार करता है जब तक कि --allow-authorized-non-loopback
प्रदान न किया जाए, और Compose पोर्ट 127.0.0.1 से बंधा है।
प्रकटीकरण प्रबंधन के लिए SECURITY.md देखें। इस रिपॉज़िटरी में उत्पादन लक्ष्य, ग्राहक डेटा, एक्सेस टोकन, या वास्तविक सिस्टमों से प्रमाण शामिल नहीं हैं।
MIT - LICENSE देखें।