
CVE-2024-11972 في Hunk Companion <1.9.0 يسمح للمهاجمين غير المُوثقين باستغلال نقاط نهاية REST API غير الآمنة وتثبيت إضافات ضعيفة، مما يعرض للخطر RCE، SQLi، XSS، و backdoors.
CVE-2024-11972 هي ثغرة أمنية خطيرة في إصدارات إضافة Hunk Companion لووردبريس الأقدم من 1.9.0. يسمح هذا العطل للمهاجمين غير الموثقين باستغلال نقاط نهاية REST API غير المصرح بها بشكل صحيح، مما يمكنهم من تثبيت وتفعيل الإضافات من مستودع WordPress.org، بما في ذلك تلك القديمة أو التي تحتوي على ثغرات معروفة. يمكن أن يؤدي استغلال هذه الثغرة إلى مخاطر أمنية خطيرة، مثل تنفيذ تعليمات برمجية عن بُعد، وحقن SQL، وXSS، أو أبواب خلفية إدارية.
مثال شائع لإساءة استخدام هذه الثغرة هو مع إضافة WP Query Console. بمجرد تثبيتها باستخدام هذا الاستغلال، توفر الإضافة واجهة وحدة تحكم داخل ووردبريس حيث يمكن للمستخدمين تشغيل استعلامات SQL على قاعدة بيانات الموقع، مما يتيح سرقة البيانات، وإنشاء أبواب خلفية، واختراق كامل لقاعدة البيانات.
مكتبات بايثون المطلوبة -> 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، حتى تلك التي تمت إزالتها أو إيقافها، مما يمنح المهاجمين فرصة لاستغلال الإضافات الضعيفة للاستغلال.
للتعمق أكثر في المشكلة، يمكننا النظر داخل /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 إذا لم يكن لديه، إلا أنه لا يزال يتجاهل المشكلة الرئيسية التي لم يتم معالجتها.
يتم تقييم منطق Callback في ووردبريس فيما يتعلق بـ permission_callback على النحو التالي:

بمعنى أن الاستجابة الصحيحة ستكون إحدى القيم التالية - true | false | WP_Error.
تنجم المشكلة عن حقيقة أن WP_REST_Response المرتجعة ليست قيمة منطقية أو WP_Error، نظرًا لأن ووردبريس لا يفسرها على أنها رفض (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 يرفض الوصول غير المصرح به بشكل صحيح، مما يجعل الاستغلال غير ممكن.