
CVE-2026-67620 - ثغرة SSRF في Flowise عبر قائمة منع غير مكتملة لبيانات تعريف السحابة (Oracle OCI 192.0.0.192 وAlibaba 100.100.100.200 تتجاوزان DEFAULT_DENY_LIST)
المنتج: FlowiseAI/Flowise — أداة بناء مرئية لنماذج LLM / وكلاء الذكاء الاصطناعي (~54 ألف ★)
الإصدارات المتأثرة: ≤ 3.1.4 — تم التأكد من أنها لا تزال عرضة للثغرة في 3.1.4، أحدث إصدار (أُعيد التحقق في 2026-08-06)
الثغرة: تزوير الطلبات من جانب الخادم (SSRF) عبر قائمة حظر غير مكتملة
CWE: CWE-918 (SSRF) · CWE-184 (قائمة غير مكتملة للمدخلات المحظورة)
الخطورة: متوسطة — CVSS 3.1 6.5 (AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:N/A:N)
تاريخ الاكتشاف: 2026-07-10 · أُبلغ إلى VulnCheck (CVD): 2026-07-15
الباحث: Bobur Abdugafforov (Mahadsec)
حالة المورّد — لن يتم إصدار أي تصحيح. تم إيقاف مشروع Flowise رسميًا ولم يعد يقبل تقارير الثغرات الأمنية. يُنشر هذا التنبيه كي يتمكن المشغّلون الذين لا يزالون يستخدمون Flowise من تخفيف المشكلة بأنفسهم.
يوفّر Flowise حاجزًا ضد SSRF يحظر الطلبات الموجهة إلى خدمات البيانات الوصفية لمثيلات السحابة. تغطي
قائمة الحظر نطاق link-local 169.254.0.0/16 المستخدم في AWS وGCP وAzure و
DigitalOcean — لكنها تُغفل عنوانَي بيانات وصفية لا يقعان في ذلك النطاق:
| السحابة | عنوان IP للبيانات الوصفية | في قائمة الحظر؟ |
|---|---|---|
| AWS / GCP / Azure / DigitalOcean | 169.254.169.254 | ✅ محظور |
| Oracle Cloud (OCI) | 192.0.0.192 | ❌ غير محظور |
| Alibaba Cloud | 100.100.100.200 | ❌ غير محظور |
قائمة DEFAULT_DENY_LIST الكاملة المضمّنة في صورة Docker الرسمية flowiseai/flowise:3.1.4
(.../flowise-components/dist/src/httpSecurity.js) هي:
'0.0.0.0', '10.0.0.0/8', '127.0.0.0/8', '169.254.0.0/16', '169.254.169.253',
'169.254.169.254', '172.16.0.0/12', '192.168.0.0/16', '224.0.0.0/4', '240.0.0.0/4',
'255.255.255.255/32', '::1', 'fc00::/7', 'fd00:ec2::254', 'fe80::/10', 'ff00::/8',
'localhost', 'ip6-localhost'
18 مدخلاً. لا يظهر 192.0.0.192 ولا 100.100.100.200، ولا يقع أي منهما
داخل أي CIDR مدرج — لاحظ أن 192.168.0.0/16 لا يغطي 192.0.0.192، ولا
توجد أي مدخلة لـ 100.64.0.0/10 (CGNAT) على الإطلاق.
القائمة متطابقة بايتًا ببايت بين 3.1.2 و3.1.4. التغيير الوحيد في
httpSecurity.ts عبر هذين الإصدارين هو تسوية IPv6 المعيّنة من IPv4 داخل
isDeniedIP()، وهو ما لا يمكن أن يؤثر على عنوانَي IPv4 عاديين.
لا يقع أي من العنوانين المحذوفين داخل CIDR خاص أو link-local تقليدي:
192.0.0.192 يقع داخل كتلة تعيينات بروتوكول IETF 192.0.0.0/24 ويبدو
قابلاً للتوجيه عالميًا، بينما يقع 100.100.100.200 في نطاق CGNAT 100.64.0.0/10، وهو
أيضًا غير مغطى بقائمة الحظر. لذلك فإن أي حماية مبنية على تعداد "عنوان الـ metadata" ونطاق
link-local تُغفل كليهما.
يمكن لمستخدم مُصادَق عليه إجبار خادم Flowise على إصدار طلبات GET عشوائية إلى هذه العناوين. في نشر على OCI أو Alibaba Cloud، يصل هذا إلى خدمة metadata الخاصة بالنسخة، والتي تقدّم هوية النسخة ومواد بيانات الاعتماد.
packages/components/src/httpSecurity.ts — DEFAULT_DENY_LIST
(المُجمَّع: httpSecurity.js:31-50)
تحتوي القائمة على 169.254.169.254 ونطاق 169.254.0.0/16، لكنها لا
تحتوي على 192.0.0.192 أو 100.100.100.200 أو نطاق CGNAT 100.64.0.0/10.
مسار الطلب: GET /api/v1/fetch-links → checkDenyList(url) → secureFetch() عبر
webCrawl. يعيد secureFetch التحقق من أهداف إعادة التوجيه بشكل صحيح، لذا تُعالَج
التجاوزات القائمة على إعادة التوجيه — العيب هو محتويات القائمة، مما يعني أن إعادة التوجيه
إلى أي من العنوانين المحذوفين يجتاز التحقق تمامًا كما يفعل الطلب المباشر.
مسار fetch-links لا يحمل أي وسيط checkPermission، لذا تصل إليه أي جلسة
مُصادَق عليها بغض النظر عن الدور.
GET /api/v1/fetch-links?url=<target>&relativeLinksMethod=webCrawl&limit=1
كل عقدة توجيه تمر عبر secureFetch / secureAxiosRequest مع عنوان URL يوفّره المستخدم
تتأثر بقائمة الحظر نفسها — على سبيل المثال عقدتا web-scraper وHTTP-request.
ملاحظة حول قابلية الوصول: المشكلة قابلة للوصول أيضًا دون مصادقة عبر
نقطة النهاية العامة POST /api/v1/prediction/:id كلما وُجدت عقدة تجلب عنوان URL
في chatflow تم جعله عامًا.
تم التأكيد ديناميكيًا مقابل نسخة Flowise 3.1.2 محلية قيد التشغيل، مع مستمعين مرتبطين بـ
192.0.0.192:80 و100.100.100.200:80.
الضابط — عنوان IP الخاص ببيانات AWS/GCP/Azure الوصفية محظور بشكل صحيح:
GET /api/v1/fetch-links?url=http://169.254.169.254/latest/meta-data/&relativeLinksMethod=webCrawl&limit=1
HTTP/1.1 500
isDeniedIP: Error: Access to this host is denied by policy.
التجاوز 1 — بيانات Oracle Cloud الوصفية:
GET /api/v1/fetch-links?url=http://192.0.0.192/opc/v1/instance/&relativeLinksMethod=webCrawl&limit=1
HTTP/1.1 200
{"status":"OK","links":["http://192.0.0.192/opc/v1/instance"]}
التجاوز 2 — بيانات Alibaba Cloud الوصفية:
GET /api/v1/fetch-links?url=http://100.100.100.200/&relativeLinksMethod=webCrawl&limit=1
HTTP/1.1 200
الطلبات من جانب الخادم التي لوحظت على المستمعين (مما يثبت أن الجلب نشأ من خادم Flowise، وليس من العميل):
# OCI listener
192.0.0.192 - - [11/Jul/2026 04:34:35] "GET /opc/v1/instance/ HTTP/1.1" 404 -
192.0.0.192 - - [11/Jul/2026 04:34:54] "GET /opc/v1/instance HTTP/1.1" 404 -
# Alibaba listener
100.100.100.200 - - [11/Jul/2026 04:34:35] "GET / HTTP/1.1" 200 -
100.100.100.200 - - [11/Jul/2026 04:34:54] "GET / HTTP/1.1" 200 -
يُضمَّن سكربت PoC باسم poc.py.
يمكن لأي مستخدم Flowise مُصادَق عليه — وكذلك، حيث توجد عقدة جلب URL في chatflow عام، أي زائر غير مُصادَق عليه — أن يجعل الخادم يُصدر طلبات GET إلى خدمات البيانات الوصفية للنسخ (instance-metadata) في Oracle Cloud وAlibaba Cloud، وهو ما يحاول المنتج منعه صراحةً لمزوّدي الخدمة الآخرين.
على نشر متأثر، يكشف هذا عن بيانات هوية النسخة ونقاط نهاية البيانات الوصفية
التي تقدّم بيانات اعتماد دور النسخة، ومنها يتبع وصول إضافي إلى حساب السحابة الخاص
بالضحية. وعلى نحو أوسع، تتيح الثغرة نفسها إرسال طلبات إلى نطاق CGNAT
100.64.0.0/10، القابل للتوجيه داخل شبكات العديد من مزوّدي الخدمة.
تعكس درجة الخطورة أن الاستغلال يتطلب استضافة نسخة Flowise على OCI أو Alibaba Cloud. أما العيب نفسه — قائمة منع غير مكتملة — فهو مستقل عن مزوّد الخدمة.
لن تُصدر أي رقعة من المزوّد؛ فالمشروع انتهى عمره. ينبغي للمشغّلين:
192.0.0.0/24
و100.64.0.0/10 من مضيف Flowise — لأن التطبيق لا يمكن إصلاحه.PUT) حتى
لا يتمكن SSRF GET العادي من استرداد بيانات الاعتماد.إذا كنت تُرقّع نسخة متفرعة محليًا، فأضف إلى DEFAULT_DENY_LIST في
packages/components/src/httpSecurity.ts: 192.0.0.192، و100.100.100.200، والنطاقين
192.0.0.0/24 و100.64.0.0/10.
| التاريخ | الحدث |
|---|---|
| 2026-07-10 | اكتشاف الثغرة وتأكيدها على نسخة محلية حيّة |
| 2026-07-15 | الإبلاغ إلى VulnCheck للإفصاح المنسّق |
| 2026-08 | أفادت VulnCheck بأن المشروع انتهى عمره ولم يعد يقبل التقارير؛ خُصّص CVE-2026-67620 وأُذن بالإفصاح العام |
| — | الإفصاح العام (هذا التنبيه) |
Bobur Abdugafforov — Mahadsec
يُصدر هذا التنبيه وسكربت PoC للاستخدام الدفاعي والتعليمي. اختبر فقط الأنظمة التي تملكها أو المصرّح لك باختبارها.