
चेतावनी: dash-uploader (Python/PyPI) में CVE-2026-38360 पथ ट्रैवर्सल (CWE-22)
अप्रमाणित पाथ ट्रैवर्सल fohrloop/dash-uploader (Python, PyPI) में, जो मनमानी फ़ाइल लेखन की अनुमति देता है, जिससे (केवल इन्हीं तक सीमित नहीं) रिमोट कोड निष्पादन (RCE), एप्लिकेशन सोर्स कोड का ओवरराइट, स्टोर्ड XSS और स्थायी बैकडोर इंस्टॉलेशन हो सकता है।
रिपॉजिटरी को 2025-07-19 को आर्काइव किया गया था और कोई सक्रिय मेंटेनर नहीं है। प्रकाशित प्रत्येक संस्करण (0.1.0 से 0.7.0a2 तक) प्रभावित है और आगे भी रहेगा। पैकेज अभी भी लगभग 28,000 मासिक डाउनलोड प्राप्त करता है।
प्रोडक्शन में dash-uploader चलाने वाले किसी भी व्यक्ति को स्वयं मिटिगेशन लागू करना होगा। अनुशंसित समाधान Plotly Dash के अंतर्निर्मित dcc.Upload कंपोनेंट पर माइग्रेट करना है। पूर्ण विकल्पों के लिए मिटिगेशन देखें।
| CVE ID | CVE-2026-38360 (NVD) |
| भेद्यता | पाथ ट्रैवर्सल (CWE-22) |
| CVSS 3.1 | 9.8 / गंभीर (AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H) |
| उत्पाद | dash-uploader |
| प्रभावित संस्करण | 0.1.0 से 0.7.0a2 तक (सभी 18 रिलीज़) |
| फिक्स्ड संस्करण | कोई नहीं (प्रोजेक्ट 2025-07-19 को आर्काइव किया गया) |
| हमला वेक्टर | रिमोट, अप्रमाणित |
| खोजकर्ता | Muhammad Fitri Bin Mohd Sultan |
| असाइन किया गया | MITRE, 2026-05-07 |
| संबंधित | CVE-2026-38361 (उसी लाइब्रेरी में DoS) |
dash_uploader/httprequesthandler.py में request.form.get() से प्राप्त तीन उपयोगकर्ता-नियंत्रित पैरामीटर बिना किसी सैनिटाइज़ेशन या वैलिडेशन के सीधे os.path.join() और os.makedirs() में पास कर दिए जाते हैं:
upload_id (line 57 → line 161, BaseHttpRequestHandler.get_temp_root): गंतव्य निर्देशिका को नियंत्रित करता है। एक हमलावर upload_id=../../../../usr/local/lib/python3.10/site-packages भेज सकता है और फ़ाइलें Python की पैकेज निर्देशिका में लिख दी जाती हैं।
resumableFilename (line 51 → line 108, BaseHttpRequestHandler._post): अंतिम फ़ाइलनाम को नियंत्रित करता है। एक हमलावर वैध upload_id के साथ भी फ़ाइलनाम के माध्यम से अपलोड निर्देशिका से बाहर ट्रैवर्स कर सकता है।
resumableIdentifier (line 54 → line 64, BaseHttpRequestHandler._post): टेम्प निर्देशिका बनाने के लिए os.makedirs() के साथ उपयोग किया जाता है। एक हमलावर फाइलसिस्टम पर कहीं भी मनमानी निर्देशिकाएँ बना सकता है।
अपलोड एंडपॉइंट (/API/dash-uploader डिफ़ॉल्ट रूप से) किसी प्रमाणीकरण की आवश्यकता नहीं रखता। v0.5.0 में जोड़ा गया http_request_handler हुक post_before() के माध्यम से अनुरोध-पूर्व जाँच की अनुमति देता है, लेकिन असुरक्षित _post() विधि हुक के लौटने के बाद सभी पैरामीटर सीधे request.form से पढ़ती है। हुक लाइब्रेरी द्वारा उन्हें प्रोसेस करने से पहले पैरामीटर को सैनिटाइज़ नहीं कर सकता। हुक के माध्यम से प्रमाणीकरण जोड़ने वाला डेवलपर अभी भी एक प्रमाणित उपयोगकर्ता से पाथ ट्रैवर्सल के प्रति असुरक्षित है।
# dash_uploader/httprequesthandler.py
def _post(self):
resumableFilename = request.form.get("resumableFilename", default="error", type=str)
resumableIdentifier = request.form.get("resumableIdentifier", default="error", type=str)
upload_id = request.form.get("upload_id", default="", type=str)
...
temp_root = self.get_temp_root(upload_id) # upload_id flows in here
temp_dir = os.path.join(temp_root, resumableIdentifier) # raw user input -> os.path.join
if not os.path.isdir(temp_dir):
os.makedirs(temp_dir) # raw user input -> os.makedirs
def get_temp_root(self, upload_id):
return os.path.join(self.upload_folder, upload_id) # no sanitization: ../../ escapes upload_folder
तीन स्वतंत्र ट्रैवर्सल सिंक का मूल कारण एक ही है: फ़ॉर्म मान बिना किसी वैलिडेशन के os.path.join और os.makedirs तक पहुँचते हैं।
एक अप्रमाणित रिमोट हमलावर अपलोड एंडपॉइंट पर HTTP POST मल्टीपार्ट अनुरोध भेजता है। upload_id फ़ॉर्म पैरामीटर में पाथ ट्रैवर्सल सीक्वेंस (../) इंजेक्ट करके, हमलावर अपलोड की गई फ़ाइल के लिए गंतव्य निर्देशिका को नियंत्रित करता है। उदाहरण के लिए, upload_id=../../../../usr/local/lib/python3.10/site-packages फ़ाइलों को Python की पैकेज निर्देशिका में लिखता है, जिससे अगले इंटरप्रेटर स्टार्टअप पर .pth ऑटो-निष्पादन के माध्यम से RCE संभव हो जाता है।
कोई प्रमाणीकरण, सत्र टोकन या CSRF टोकन आवश्यक नहीं है। दो अतिरिक्त पैरामीटर (resumableFilename और resumableIdentifier) उसी एंडपॉइंट के माध्यम से स्वतंत्र ट्रैवर्सल वेक्टर प्रदान करते हैं। आधिकारिक क्विकस्टार्ट दस्तावेज़ में दिखाई गई डिफ़ॉल्ट लाइब्रेरी कॉन्फ़िगरेशन एक ही curl कमांड से शोषणीय है।
सर्वर प्रोसेस द्वारा लिखने योग्य किसी भी निर्देशिका में मनमानी फ़ाइल लेखन। यह कई जानी-मानी प्रिमिटिव्स के माध्यम से रिमोट कोड निष्पादन (RCE) में परिणत होता है:
RCE प्रिमिटिव्स
site-packages में डाली गई Python .pth फ़ाइल। अगले इंटरप्रेटर स्टार्टअप पर हमलावर द्वारा आपूर्ति किया गया कोड निष्पादित करती है।sitecustomize.py या usercustomize.py इंजेक्शन। हर Python स्टार्टअप पर निष्पादित होता है।app.wsgi, wsgi.py) को ओवरराइट करना। अगले वर्कर रीलोड पर निष्पादित होता है।/etc/cron.d/, /etc/cron.hourly/, यूज़र क्रॉनटैब स्पूल) जब प्रोसेस के पास आवश्यक विशेषाधिकार हों। अनुसूचित निष्पादन।/etc/systemd/system/, ~/.config/systemd/user/)। अगली सेवा शुरू होने या रीबूट पर निष्पादित होता है।/etc/ld.so.preload इंजेक्शन। हमलावर कोड को हर बाद के बाइनरी निष्पादन में प्रीलोड करता है।~/.bashrc, ~/.profile, ~/.bash_profile)। ऐप उपयोगकर्ता के अगले इंटरैक्टिव लॉगिन पर निष्पादित होता है।~/.ssh/authorized_keys में जोड़ना। ऐप उपयोगकर्ता के रूप में होस्ट तक स्थायी SSH पहुँच प्रदान करता है।वेब-स्तरीय प्रभाव
site-packages में Dash फ्रेमवर्क JS) को ओवरराइट करके होस्ट डोमेन पर स्टोर्ड क्रॉस-साइट स्क्रिप्टिंग, जो एप्लिकेशन के पुनः आरंभ होने तक हर पेज लोड पर हर उपयोगकर्ता को प्रभावित करती हैफाइलसिस्टम-स्तरीय प्रभाव
resumableIdentifier पैरामीटर के साथ os.makedirs() के माध्यम से प्रोसेस की पहुँच वाली कहीं भी मनमानी निर्देशिका निर्माण (इनोड समाप्ति या गैर-मौजूद निर्देशिका ट्री में लेखन के मंचन के लिए उपयोगी)dash_uploader/httprequesthandler.pyBaseHttpRequestHandler.get_temp_root()BaseHttpRequestHandler._post()वर्तमान में तैनात उपयोगकर्ताओं के लिए विकल्प, प्राथमिकता के क्रम में:
dcc.Upload पर माइग्रेट करें, जो Plotly Dash के साथ शिप होने वाला आधिकारिक अपलोड कंपोनेंट है। फ़ाइलें कॉलबैक में base64 स्ट्रिंग के रूप में पहुँचती हैं; कोई फाइलसिस्टम-लेखन हैंडलर उजागर नहीं होता और कोई क्लाइंट-नियंत्रित गंतव्य पाथ मौजूद नहीं होता, इसलिए यहाँ की बग श्रेणी लागू नहीं होती। छोटी और मध्यम फ़ाइलों के लिए सबसे उपयुक्त। बहुत बड़े अपलोड के लिए, आइटम 2 देखें।
एक छोटा Flask अपलोड हैंडलर बनाएं, जिसमें werkzeug.utils.secure_filename() और हार्डकोडेड सर्वर-साइड गंतव्य निर्देशिका का उपयोग हो। क्लाइंट-आपूर्ति upload_id, फ़ाइलनाम, या आइडेंटिफ़ायर मानों को पाथ घटकों के रूप में कभी स्वीकार न करें।
यदि dash-uploader का उपयोग जारी रख रहे हैं, तो अपलोड एंडपॉइंट को प्रमाणीकरण के पीछे रखें और upload_id, resumableFilename तथा resumableIdentifier को एक सख्त अलाउलिस्ट (जैसे, केवल UUIDs) के विरुद्ध उस परत पर वैलिडेट करें जो लाइब्रेरी हैंडलर द्वारा देखे जाने से पहले अनुरोध को फिर से लिखती या अस्वीकार करती है। लाइब्रेरी का http_request_handler हुक ट्रैवर्सल को नहीं रोकता, क्योंकि पैरामीटर हुक के लौटने के बाद request.form से पढ़े जाते हैं; सैनिटाइज़ेशन लाइब्रेरी के ऊपर होना चाहिए।
रिवर्स-प्रॉक्सी या WAF परत पर, अपलोड एंडपॉइंट पर किसी भी ऐसे अनुरोध को अस्वीकार करें जिसके किसी भी फ़ॉर्म फ़ील्ड में .., एन्कोडेड वेरिएंट (%2e%2e, ..%2f, %2e%2e%2f), या निरपेक्ष पाथ हों।
| दिनांक | घटना |
|---|---|
| 2026-03-17 | प्रोडक्शन डिप्लॉयमेंट पर सुरक्षा अनुसंधान के दौरान भेद्यता खोजी गई। |
| 2026-03-19 | MITRE को CVE अनुरोध प्रस्तुत किया गया। |
| 2026-05-07 | CVE-2026-38360 को MITRE द्वारा असाइन किया गया। |
| 2026-05-07 | सार्वजनिक एडवाइज़री प्रकाशित। |
| 2026-05-09 | CVE रिकॉर्ड MITRE CVE डेटाबेस और NVD पर प्रकाशित। |
0.6.1 (स्थिर श्रृंखला)। प्री-रिलीज़ 0.7.0a2 तक विस्तारित हैं।dash। वैकल्पिक निर्भरता: pyyaml। लाइसेंस: MIT।Muhammad Fitri Bin Mohd Sultan