
Python PoC لـ CVE-2026-12944، ثغرة SSRF عبر urllib وقراءة الملفات في Langflow 1.10.0. يحدد الإصدارات ويستغل نقطة النهاية custom_component.
Langflow 1.10.0 urllib SSRF
Langflow OSS ≤ 1.10.0 — تنفيذ كود عبر مكوّن مخصص باستخدام urllib.request / socket. قائمة الحظر الخاصة بماسح المكوّنات أغفلت هاتين الوحدتين من المكتبة القياسية. أصلحتها IBM في 1.10.1.
تصنّفها IBM بـ PR:L. نقطة تنفيذ الكود هي POST /api/v1/custom_component وهذا الاستدعاء يحتاج إلى session cookie / bearer token. كيف يحصل هذا الـ PoC على واحد:
--test لا يقوم بالمصادقة. فقط GET /api/v1/version (بالإضافة إلى GET / للتحقق من الاتصال).--read / --fetch يقومان بالمصادقة أولاً، ثم يرسلان POST للمكوّن.LANGFLOW_AUTO_LOGIN. يقوم السكربت بـ ، وإذا احتوى JSON على ، يرسل . بدون اسم مستخدم أو كلمة مرور.GET /api/v1/auto_loginaccess_tokenAuthorization: Bearer …POST /api/v1/login مع --uname / --password بصيغة application/x-www-form-urlencoded (username, password). القيم الافتراضية هي langflow / langflow.POST /api/v1/custom_component مع {"code": …} الذي يستدعي urllib.request.urlopen(...).--uname / --password موجودان فقط للخطوة 4. لا يُستخدمان في التثبيت الافتراضي.
للاختبار المصرّح به فقط. لا تشغّل هذا ضد أنظمة لا تملكها أو لا تملك إذناً باختبارها.
يتطلب: Python 3، المكتبة القياسية فقط.
python3 cve-2026-12944-langflow-urllib-ssrf.py -u http://TARGET --test
python3 cve-2026-12944-langflow-urllib-ssrf.py -u http://TARGET --read /etc/hostname
python3 cve-2026-12944-langflow-urllib-ssrf.py -u http://TARGET --fetch http://127.0.0.1:7860/api/v1/version
python3 cve-2026-12944-langflow-urllib-ssrf.py -u https://TARGET --read /etc/hostname --insecure
python3 cve-2026-12944-langflow-urllib-ssrf.py -u TARGET --uname langflow --password langflow --read /etc/hostname
| الخيار | ما يفعله |
|---|---|
-u / --url | عنوان Langflow الأساسي (مطلوب). http:// أو https://. اسم مضيف بدون بروتوكول يُجرَّب أولاً كـ HTTPS، ثم HTTP. إعادة توجيه http→https تحافظ على POST. شهادات TLS السيئة يُعاد المحاولة بدون تحقق؛ --insecure يتخطى التحقق من البداية |
--test | بصمة فقط: GET /api/v1/version (عام). بدون تسجيل دخول، بدون custom_component |
--read PATH | إطلاق الأداة: قراءة file:// عبر urllib.request للمسار PATH (يُنفَّذ على الخادم) |
--fetch URL | SSRF: urllib.request.urlopen(URL) وطباعة المحتوى |
--uname / --password | فقط إذا كان AUTO_LOGIN معطلاً (القيم الافتراضية: langflow / langflow) |
--insecure | تخطي التحقق من TLS |
--timeout | مهلة HTTP بالثواني (افتراضي 30) |
نقطة نهاية --test: GET /api/v1/version. استجابة 200 مع "version" / "main_version" تطبع VERSION، ثم IN_WINDOW إذا كانت السلسلة بين 1.0.0–1.10.0، ثم PRESENT. لا تصل أبداً إلى /api/v1/auto_login أو /api/v1/custom_component.
--read / --fetch تصل إلى GET /api/v1/auto_login (أو POST /api/v1/login)، ثم POST /api/v1/custom_component.
Stdout: VERSION, IN_WINDOW, OUT_OF_WINDOW, PRESENT, VULNERABLE, NEED_AUTH, NOT_FOUND, NOT_VULNERABLE, READ.

CVE: CVE-2026-12944. نشرة IBM؛ قم بالترقية إلى 1.10.1.