
CVE-2026-93349 के लिए प्रूफ-ऑफ-कॉन्सेप्ट, जो Frictionless <= 5.20.0rc1 explore CLI में दुर्भावनापूर्ण Data Package descriptor पथों के माध्यम से एक OS कमांड इंजेक्शन है।
<= 5.20.0rc1 explore OS कमांड इंजेक्शनगंभीरता: उच्च, CVSS 3.1 8.8
वेक्टर: CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:H
प्रभावित: सभी Frictionless संस्करण <= 5.20.0rc1
घटक: frictionless.console.commands.explore
CWE: CWE-78 (OS कमांड इंजेक्शन), CWE-20 (अनुचित इनपुट सत्यापन)
खोज और रिपोर्ट: Sai Teja Erukude
Frictionless के 5.20.0rc1 प्रीरिलीज़ तक के सभी संस्करणों में
frictionless explore CLI कमांड में एक OS कमांड इंजेक्शन
भेद्यता मौजूद है।
यह कमांड उपयोगकर्ता द्वारा प्रदान किए गए Data Package डिस्क्रिप्टर को लोड करता है, रिसोर्स
पाथ एकत्र करता है, resource.normpath प्राप्त करता है, उन पाथ को एक ही कमांड
स्ट्रिंग में जोड़ता है, और उस स्ट्रिंग को सीधे os.system को पास करता है:
paths = [resource.normpath for resource in resources if resource.normpath]
os.system(f"vd {' '.join(paths)}")
चूँकि resources[*].path datapackage.json से डिस्क्रिप्टर-नियंत्रित मेटाडेटा है,
एक हमलावर रिसोर्स पाथ में शेल मेटाकैरेक्टर शामिल कर सकता है। जब कोई शिकार दुर्भावनापूर्ण
डिस्क्रिप्टर पर frictionless explore चलाता है, तो शेल उन मेटाकैरेक्टर की व्याख्या
करता है और इंजेक्ट किए गए कमांड को निष्पादित करता है।
एक हमलावर frictionless explore चलाने वाले उपयोगकर्ता के सुरक्षा संदर्भ में
मनमाने कमांड निष्पादित कर सकता है।
यह उन वर्कफ़्लो को प्रभावित कर सकता है जहाँ उपयोगकर्ता अविश्वसनीय प्रोजेक्ट, आर्काइव, रिपॉज़िटरी, या साझा किए गए डेटासेट से Data Package डिस्क्रिप्टर का निरीक्षण, सत्यापन, या अन्वेषण करते हैं।
स्थानीय वातावरण के आधार पर, यह निम्नलिखित की अनुमति दे सकता है:
भेद्य पाथ explore कमांड है:
frictionless explore <package>
-> Package.from_descriptor(...)
-> Resource.list()
-> resource.normpath
-> os.system(f"vd {' '.join(paths)}")
PoC एक Data Package डिस्क्रिप्टर उत्पन्न करता है जहाँ resources[0].path में एक
हानिरहित मार्कर-फ़ाइल राइट पेलोड होता है।
Windows पर, उत्पन्न पाथ & कमांड सेपरेटर का उपयोग करता है:
data.csv & echo frictionless_explore_command_injection_triggered>"...\marker.txt" & rem
POSIX सिस्टम पर, उत्पन्न पाथ सेमीकोलन कमांड सेपरेटर का उपयोग करता है:
data.csv; printf %s frictionless_explore_command_injection_triggered > .../marker.txt; #
रनर इंस्टॉल किए गए पैकेज से वास्तविक frictionless explore कमांड को आमंत्रित करता है।
यह चाइल्ड प्रोसेस के लिए PATH को साफ़ करता है ताकि इच्छित vd व्यूअर
इंटरैक्टिव रूप से लॉन्च न हो, लेकिन जब शेल निर्मित कमांड स्ट्रिंग को पार्स करता है
तो इंजेक्ट किया गया कमांड अभी भी निष्पादित होता है।
package_builder.py हमलावर-नियंत्रित Data
Package डिस्क्रिप्टर और एक बेनाइन CSV फ़ाइल बनाता है।
run_poc.py डिस्क्रिप्टर को सत्यापित करता है, frictionless explore
को आमंत्रित करता है, और निष्पादन साक्ष्य प्रिंट करता है।
केवल स्थानीय परीक्षण वातावरण में चलाएँ:
python -m venv .venv
.venv\Scripts\activate
python -m pip install -r requirements.txt
python -B run_poc.py
शामिल requirements.txt frictionless==5.20.0rc1 को पिन करता है, जो इस रेंज में
नवीनतम पुष्ट भेद्य प्रीरिलीज़ है।
भेद्य संस्करणों पर अपेक्षित साक्ष्य:
frictionless_version : 5.20.0rc1
installed_package : True
descriptor_valid : True
listed_resource_count : 1
raw_path_contains_payload : True
normpath_contains_payload : True
explore_returncode : 0
viewer_launch_disabled : True
marker_exists : True
marker_contents
frictionless_explore_command_injection_triggered
success : True
महत्वपूर्ण साक्ष्य यह है कि दुर्भावनापूर्ण डिस्क्रिप्टर वैध है, डिस्क्रिप्टर-नियंत्रित
पाथ resource.normpath में बना रहता है, और frictionless explore चलने के बाद
marker.txt बन जाता है।
पेलोड जानबूझकर हानिरहित है। यह केवल यह स्थानीय मार्कर स्ट्रिंग लिखता है:
frictionless_explore_command_injection_triggered
यह शेल सेशन नहीं खोलता, नेटवर्क सेवा से कनेक्ट नहीं करता, रहस्य नहीं पढ़ता, डेटा नहीं हटाता, या PoC डायरेक्टरी के बाहर फ़ाइलों को संशोधित नहीं करता।
डिस्क्रिप्टर-नियंत्रित पाथ को शेल को पास करने से बचें।
शेल-आधारित आमंत्रण को आर्ग्युमेंट वेक्टर का उपयोग करते हुए subprocess.run से
बदलें:
subprocess.run(["vd", *paths], check=False)
यह प्रत्येक रिसोर्स पाथ को vd के लिए एक शाब्दिक आर्ग्युमेंट के रूप में पास करता है।
पाथ के अंदर शेल मेटाकैरेक्टर उस एकल argv प्रविष्टि के अंदर सामान्य अक्षर बने रहते हैं
और निष्पादित नहीं होते।
विशिष्ट पाथ अक्षरों को ब्लैकलिस्ट करना कमज़ोर है क्योंकि शेल सिंटैक्स प्लेटफ़ॉर्म और शेल के अनुसार भिन्न होता है। कमांड आमंत्रण सीमा मूल कारण है, इसलिए टिकाऊ समाधान को शेल व्याख्या से बचना चाहिए।
सुझाए गए पैच के लिए fix.md देखें।
Sai Teja Erukude द्वारा खोजा और रिपोर्ट किया गया।
प्रकटीकरण VulnCheck के माध्यम से समन्वित किया गया था।
exploit_walkthrough.mdfix.md