
CVE-2026-8161 के लिए प्रूफ-ऑफ-कॉन्सेप्ट एक्सप्लॉइट, जो multiparty multipart पार्सर में एक denial-of-service भेद्यता है, जो prototype pollution के माध्यम से अनकॉट अपवाद और क्रैश की ओर ले जाने का प्रदर्शन करता है।
CVE-2026-8161 (मल्टीपार्टी) का प्रूफ ऑफ कॉन्सेप्ट
[email protected] और इससे पहले के संस्करण एक अनकॉट एक्सेप्शन के माध्यम से डेनियल ऑफ सर्विस के प्रति संवेदनशील हैं।
पार्सर अपलोड किए गए फ़ील्ड्स और फ़ाइलों को सादे जावास्क्रिप्ट ऑब्जेक्ट्स में संग्रहीत करता है और पार्सर के स्वामित्व वाली कुंजियों को इनहेरिटेड ऑब्जेक्ट प्रॉपर्टीज़ से सुरक्षित रूप से अलग नहीं करता है। एक क्राफ्टेड मल्टीपार्ट फ़ील्ड नाम पार्सर को अप्रत्याशित प्रोटोटाइप-चेन मान पढ़ने और अपलोड को संभालते समय क्रैश करने का कारण बन सकता है।
कोई भी सेवा जो multiparty के संवेदनशील संस्करणों के माध्यम से मल्टीपार्ट अपलोड स्वीकार करती है, प्रभावित हो सकती है।
समस्या इसलिए होती है क्योंकि fields और files सादे जावास्क्रिप्ट ऑब्जेक्ट्स हैं, लेकिन उन्हें उपयोगकर्ता-नियंत्रित नामों के लिए सुरक्षित की-वैल्यू मैप्स की तरह उपयोग किया जाता है।
var fieldsArray = fields[name] || (fields[name] = [])
fieldsArray.push(value)
var filesArray = files[name] || (files[name] = [])
filesArray.push(file)
समस्या यह है कि fields[name] और सामान्य जावास्क्रिप्ट प्रॉपर्टी लुकअप का उपयोग करते हैं। सादे ऑब्जेक्ट्स के लिए, वह लुकअप केवल ऑब्जेक्ट पर संग्रहीत मानों के बजाय प्रोटोटाइप चेन से इनहेरिटेड प्रॉपर्टीज़ लौटा सकता है।
files[name]जब नाम __proto__ होता है, तो जावास्क्रिप्ट इसे प्रोटोटाइप चेन के माध्यम से हल कर सकता है और undefined के बजाय इनहेरिटेड प्रोटोटाइप ऑब्जेक्ट लौटा सकता है। चूंकि वह मान ट्रूथी है, फॉलबैक असाइनमेंट छोड़ दिया जाता है और पार्सर उस फ़ील्ड के लिए कभी वास्तविक ऐरे नहीं बनाता है।
पैच इसे केवल उन कुंजियों पर भरोसा करके ठीक करता है जो सीधे ऑब्जेक्ट से संबंधित हैं:
var filesArray = Object.prototype.hasOwnProperty.call(files, name)
? files[name]
: undefined
फिर पार्सर केवल तभी जोड़ता है जब संग्रहीत मान वास्तव में एक ऐरे होता है, अन्यथा यह एक नया ऐरे आरंभ करता है:
if (Array.isArray(filesArray)) {
filesArray.push(file)
} else {
files[name] = [file]
}
जब .push() को ऐसे मान पर कॉल किया जाता है जो ऐरे नहीं है, तो यह TypeError फेंकता है। चूंकि यह Multiparty की एसिंक्रोनस पार्सिंग प्रक्रिया के अंदर होता है, सामान्य कॉलर-साइड एरर हैंडलिंग इसे पकड़ नहीं सकती है, जिससे एक्सेप्शन प्रोसेस को क्रैश कर सकता है।
Object.prototype.hasOwnProperty.call(...)।मॉकलैब वातावरण चलाएँ और परीक्षण पेलोड को दोनों लक्ष्यों पर भेजें:
docker compose up -d
python3 secdos.py -u http://localhost:8080/api/submit
python3 secdos.py -u http://localhost:8081/api/submit
संवेदनशील लक्ष्य क्रैश हो जाएगा और [PASS] लौटाएगा। पैच किया गया लक्ष्य अनुरोध को सुरक्षित रूप से संभालेगा और [FAIL] लौटाएगा।
यदि संवेदनशील सर्वर के विरुद्ध दोबारा चला रहे हैं, तो पहले इसे पुनः आरंभ करें
डॉकरफाइल से पैच की गई इमेज बनाने के लिए बिल्ड आर्ग PATCHED=1 की आवश्यकता होती है