
CVE-2024-11972 in Hunk Companion <1.9.0 बिना प्रमाणीकरण के हमलावरों को असुरक्षित REST API एंडपॉइंट का शोषण करने और कमजोर प्लगइन्स स्थापित करने की अनुमति देता है, जिससे RCE, SQLi, XSS और बैकडोर का जोखिम होता है।
CVE-2024-11972 Hunk Companion WordPress प्लगइन के 1.9.0 से पहले के संस्करणों में एक गंभीर कमजोरी है। यह दोष अनधिकृत हमलावरों को अनुचित रूप से प्राधिकृत REST API एंडपॉइंट का शोषण करने की अनुमति देता है, जिससे वे WordPress.org रिपॉजिटरी से प्लगइन्स, जिनमें पुराने या ज्ञात कमजोरियों वाले प्लगइन्स शामिल हैं, को स्थापित और सक्रिय कर सकते हैं। इस कमजोरी का शोषण करने से गंभीर सुरक्षा जोखिम हो सकते हैं, जैसे रिमोट कोड निष्पादन, SQL इंजेक्शन, XSS या प्रशासनिक बैकडोर।
इस कमजोरी का दुरुपयोग करने का एक सामान्य उदाहरण WP Query Console प्लगइन के साथ है। इस शोषण का उपयोग करके स्थापित होने के बाद, यह प्लगइन WordPress के भीतर एक कंसोल इंटरफ़ेस प्रदान करता है जहाँ उपयोगकर्ता साइट के डेटाबेस के विरुद्ध SQL क्वेरी चला सकते हैं, जिससे डेटा चोरी, बैकडोर निर्माण और पूर्ण डेटाबेस समझौता संभव होता है।
आवश्यक Python लाइब्रेरीज़ -> argparse, requests, urljoin
options:
-h, --help show this help message and exit
-u URL, --url URL Base URL of the WordPress site (default: http://localhost/wordpress/).
-p PLUGIN, --plugin PLUGIN
Plugin name to install (default: classic-editor).
<insert wordpress URL> -p <insert plugin name>कमजोर एंडपॉइंट, /wp-json/hc/v1/themehunk-import, की पहचान शुरू में Daniel Rodriguez द्वारा एक चल रही जांच के भाग के रूप में एक्सेस लॉग के विश्लेषण के दौरान की गई थी।
इस जानकारी का उपयोग करके हम आयात एंडपॉइंट के स्रोत कोड के अंदर देख सकते हैं।
/import/core/class-installation.php फ़ाइल के अंदर हम निम्नलिखित पंक्ति देख सकते हैं:
204 | $temp_file = download_url('https://downloads.wordpress.org/plugin/'.$slug.'.zip');
HUNK_COMPANION_SITES_BUILDER_SETUP वर्ग WordPress प्लगइन्स और थीम्स की स्थापना और सक्रियण का प्रबंधन करता है, इनपुट पैरामीटर के आधार पर मुफ्त और प्रीमियम दोनों प्रकारों को संभालता है।
यह गतिशील रूप से जांचता है कि कोई प्लगइन या थीम स्थापित या सक्रिय है या नहीं, यदि आवश्यक हो तो फ़ाइलों को डाउनलोड और अनज़िप करता है, और WordPress कोर फ़ंक्शंस का उपयोग करके उन्हें सक्रिय करता है।
यह हार्डकोडेड कार्यक्षमता प्लगइन को WordPress रिपॉजिटरी से किसी भी प्लगइन को डाउनलोड करने की अनुमति देती है, यहां तक कि उन प्लगइन्स को भी जिन्हें हटा दिया गया है या बंद कर दिया गया है, जिससे हमलावरों को शोषण के लिए कमजोर प्लगइन्स का लाभ उठाने का अवसर मिलता है।
समस्या में गहराई से जाने के लिए, हम /import/app/app.php के अंदर देख सकते हैं,
आइए संस्करण 1.8.0 | 1.8.7 | 1.9.0 में पेश किए गए विभिन्न सुधारों की तुलना करें क्योंकि प्रत्येक ने सुरक्षा की एक और परत जोड़ी:
register_rest_route( 'hc/v1', 'themehunk-import', array(
'methods' => 'POST',
'callback' => array( $this, 'tp_install' ),
'permission_callback' => '__return_true',
) );
permission_callback हमेशा true लौटाता है, यह किसी भी उपयोगकर्ता या अनधिकृत अभिनेता को POST अनुरोध का उपयोग करके एंडपॉइंट तक पहुँचने की अनुमति देता है।
चूँकि किसी भी प्रकार की प्रमाणीकरण प्रक्रिया की कोई Nonce सत्यापन नहीं है, एक हमलावर आवश्यक अनुमतियों को बायपास कर सकता है और सीधे वांछित प्लगइन स्थापित कर सकता है।
संस्करण 1.8.7 में, पिछले संस्करणों में मौजूद दोषों को दूर करने के लिए कई सुरक्षा सुधार पेश किए गए थे, लेकिन एंडपॉइंट /hc/v1/themehunk-import और समग्र कार्यान्वयन में अभी भी महत्वपूर्ण दोष हैं:
public function register_routes() {
register_rest_route( 'hc/v1', 'themehunk-import', array(
'methods' => 'POST',
'callback' => array( $this, 'tp_install' ),
'permission_callback' => function () {
// Check if the user is logged in
if ( ! is_user_logged_in() ) {
return new WP_REST_Response( 'Unauthorized: User not logged in', 401 );
}
// Debug: Log the user role and capabilities to see what they have
$current_user = wp_get_current_user();
// error_log( 'Current user: ' . $current_user->user_login );
// error_log( 'User roles: ' . implode( ', ', $current_user->roles ) );
// error_log( 'User capabilities: ' . print_r( $current_user->allcaps, true ) );
// Ensure the user has the 'install_plugins' capability
if ( ! current_user_can( 'install_plugins' ) ) {
return new WP_REST_Response( 'Unauthorized: Insufficient capabilities', 401 );
}
// Get the nonce from the request header
$nonce = $request->get_header('X-WP-Nonce');
// Verify the nonce
if ( ! wp_verify_nonce( $nonce, 'hc_import_nonce' ) ) {
return new WP_REST_Response( 'Unauthorized: Invalid nonce', 401 );
}
return true; // Permission granted
जबकि इस संस्करण में यह सुनिश्चित करने के लिए जाँच शामिल है कि उपयोगकर्ता लॉगिन है (is_user_logged_in()) और यह सत्यापित करता है कि उनके पास उपयुक्त क्षमताएँ हैं (current_user_can('install_plugins')), यदि नहीं तो 401 Unauthorized प्रतिक्रिया भेजता है, फिर भी यह मुख्य मुद्दे को अनदेखा करता है जो अनसुलझा रहता है।
WordPress कॉलबैक तर्क जब permission_callback की बात आती है तो इस प्रकार मूल्यांकन किया जाता है:

अर्थात एक सही प्रतिक्रिया निम्नलिखित में से एक होगी - true | false | WP_Error।
समस्या इस तथ्य से उपजी है कि लौटाया गया WP_REST_Response बूलियन या WP_Error नहीं है, चूँकि WordPress इसे अस्वीकृति (false) या एक त्रुटि (WP_Error() के रूप में व्याख्या नहीं करता है, यह संभावित रूप से इसे निहित रूप से स्वीकार कर सकता है और एक अनधिकृत उपयोगकर्ता को पहुँच प्रदान कर सकता है, मूलतः मुख्य समस्या का समाधान नहीं करता है।
संस्करण 1.9.0 ने सफलतापूर्वक समस्या का समाधान किया, जिससे कमजोरी अब शोषण योग्य नहीं रही:
public function register_routes() {
register_rest_route( 'hc/v1', 'themehunk-import', array(
'methods' => 'POST',
'callback' => array( $this, 'tp_install' ),
'permission_callback' => function () {
// Check if the user is logged in
if ( ! is_user_logged_in() ) {
return false;
}
// Debug: Log the user role and capabilities to see what they have
$current_user = wp_get_current_user();
// error_log( 'Current user: ' . $current_user->user_login );
// error_log( 'User roles: ' . implode( ', ', $current_user->roles ) );
// error_log( 'User capabilities: ' . print_r( $current_user->allcaps, true ) );
// Ensure the user has the 'install_plugins' capability
if ( ! current_user_can( 'install_plugins' ) ) {
return false;
}
// Get the nonce from the request header
$nonce = $request->get_header('X-WP-Nonce');
// Verify the nonce
if ( ! wp_verify_nonce( $nonce, 'hc_import_nonce' ) ) {
return false;
}
return true; // Permission granted
इस संस्करण में, हम देख सकते हैं कि यदि उपयोगकर्ता लॉगिन नहीं है या उसके पास सही अनुमतियाँ नहीं हैं, तो एक उचित गलत मान (false) लौटाया जाता है, यह सुनिश्चित करता है कि permission_callback सही ढंग से अनधिकृत पहुँच से इनकार करता है, जिससे शोषण अब व्यवहार्य नहीं रहा।