
tough-cookie पैकेज के लिए प्रोटोटाइप पॉल्यूशन भेद्यता (CVE-2023-26136) को ठीक करें
प्रोटोटाइप पोलूशन (Prototype pollution) एक JavaScript भेद्यता है जो हमलावर को वैश्विक ऑब्जेक्ट प्रोटोटाइप में मनमाने गुण (arbitrary properties) जोड़ने में सक्षम बनाती है, जिन्हें बाद में उपयोगकर्ता-परिभाषित ऑब्जेक्ट्स द्वारा इनहेरिट किया जा सकता है। प्रोटोटाइप पोलूशन स्रोत (source) कोई भी उपयोगकर्ता-नियंत्रित इनपुट है जो आपको प्रोटोटाइप ऑब्जेक्ट्स में मनमाने गुण जोड़ने की सुविधा देता है। सबसे सामान्य स्रोत निम्नलिखित हैं: URL JSON Web Messages
tough-cookies पैकेज (v2.5.0) के लिए, URL के माध्यम से पहला वाला अधिक प्रासंगिक है। यह निम्न प्रकार से होता है:
यहाँ कुछ अनुरोध (request) है:
https://vulnerable-website.com/?__proto__[badProperty]=payload
क्वेरी स्ट्रिंग को key:value जोड़ियों में तोड़ते समय, एक URL पार्सर __proto__ को एक मनमाने स्ट्रिंग के रूप में व्याख्यायित कर सकता है।
किसी बिंदु पर, रिकर्सिव मर्ज (recursive merge) ऑपरेशन निम्नलिखित के समकक्ष कथन का उपयोग करके evilProperty का मान निर्दिष्ट कर सकता है:
targetObject.__proto__.badProperty = 'payload';
__proto__ का JavaScript में विशेष उपयोग है। जैसा कि हम जानते हैं, यदि किसी ऑब्जेक्ट के लिए कोई गुण P1 नहीं मिलता है, तो उसे इस ऑब्जेक्ट के प्रोटोटाइप में खोजा जाएगा।
उदाहरण
function myClass() {
this.P1 = 'value';
}
let mc = new myClass();
console.log(mc.P1); //Value
console.log(mc.P2); //Undefined
mc.__proto__.P2 = 'value2';
let mc2 = new myClass();
console.log(mc.P2); //value2
__proto__ बदलने के बाद - myClass के सभी निर्मित इंस्टेंस में गुण P2 होगा।
tough-cookies पैकेज (v2.5.0) के लिए, यह प्रोटोटाइप पोलूशन भेद्यता कोड स्निपेट से देखी जा सकती है:
await new Promise((resolve, reject) => {
cookiejar.setCookie(
"Slonser=polluted; Domain=__proto__; Path=/notauth",
"https://__proto__/admin",
{ loose: true },
(err, cookie) => {
if (err) {
reject(err);
} else {
resolve(cookie);
}
}
);
});
यह पाया गया कि CookieJar क्लास डिफ़ॉल्ट रूप से MemoryCookieStore को स्टोर के रूप में उपयोग करती है। और MemoryCookieStore के कई तरीकों में ऑब्जेक्ट्स निम्न प्रकार से इनिशियलाइज़ किए जाते हैं:
this.idx = {};
इसका मतलब है कि this.idx के प्रोटोटाइप में __proto__ के माध्यम से मानों (जो समस्याग्रस्त मान हो सकते हैं) के साथ गुण जोड़े जा सकते हैं। इसे रोकने के लिए - कई स्थानों पर इनिशियलाइज़ेशन को निम्न प्रकार से बदला गया:
this.idx = Object.create(null);
यह बिना प्रोटोटाइप के एक खाली ऑब्जेक्ट बनाता है। फिक्स को सत्यापित करने के लिए एक टेस्ट जोड़ा गया था: memstore_vulnerability_fix_test.js