
CVE-2023-26136 भेद्यता पर शोध
CVE-2023-26136 भेद्यता पर शोध कर रहा है
पैकेज tough-cookie के 4.1.3 से पहले के संस्करण rejectPublicSuffixes=false मोड में CookieJar का उपयोग करते समय कुकीज़ के अनुचित हैंडलिंग के कारण Prototype Pollution के लिए संवेदनशील हैं। यह समस्या वस्तुओं के आरंभीकरण के तरीके से उत्पन्न होती है।
https://nvd.nist.gov/vuln/detail/CVE-2023-26136
जावास्क्रिप्ट में ऑब्जेक्ट की अवधारणा है, जो कुछ हद तक शब्दकोशों (dictionaries) की तरह है। एक ऑब्जेक्ट विभिन्न प्रकार के चर (जैसे string, Boolean, int आदि) का एक सेट रख सकता है; चर का नाम एक कुंजी (key) है, और इसका मान value है, यदि हम शब्दकोशों और वस्तुओं की उपमा जारी रखें। अधिक सटीक रूप से, ऑब्जेक्ट स्वयं डेटा संरचना के रूप में शब्दकोश के अनुरूप है, और प्रत्येक चर एक कुंजी-मान जोड़ी के अनुरूप है। ऑब्जेक्ट में proto कीवर्ड भी होता है जो इसके प्रोटोटाइप को संशोधित करके किसी ऑब्जेक्ट में अतिरिक्त चर जोड़ने में सक्षम बनाता है। प्रोटोटाइप प्रदूषण (Prototype Pollution) एक हमला है जिसमें हमलावर proto कीवर्ड के माध्यम से, अपने ऑब्जेक्ट में अतिरिक्त चर जोड़कर उसे दूषित करता है। ब्राउज़र कंसोल के साथ नीचे दी गई इंटरेक्शन हमले को प्रदर्शित करती है।
जैसा कि हम देख सकते हैं, हमारे पास दो उपयोगकर्ता हैं: admin1 और user1। admin1 ऑब्जेक्ट में एक बूलियन चर है: "isAdmin", जो true पर सेट है। User1 में यह चर बिल्कुल नहीं है। पंक्ति 7 पर, हम user1 के प्रोटोटाइप में isAdmin चर जोड़ते हैं, और भले ही पंक्ति 10 से स्पष्ट है कि चर user1 के ऑब्जेक्ट में ही नहीं जोड़ा गया है, कंसोल इस बार सकारात्मक प्रतिक्रिया देता है, जब हम user1.isAdmin का मान जांचते हैं। ऐसा इसलिए है क्योंकि user1 अपने प्रोटोटाइप के गुणों को प्राप्त (inherit) कर रहा है।
यह भी उल्लेखनीय है कि प्रोटोटाइप अपने आप में एक वस्तु है, जो बदले में अपने प्रोटोटाइप से गुण और विधियाँ प्राप्त करता है, इस प्रकार एक प्रोटोटाइप श्रृंखला बनाती है। श्रृंखला एक null प्रोटोटाइप पर समाप्त होती है, इसलिए प्रोटोटाइप प्रदूषण को रोकने का एक उचित तरीका यह है कि हम जिस वस्तु के साथ काम कर रहे हैं, उसे स्पष्ट रूप से एक null प्रोटोटाइप से प्राप्त करें।
कुकीज़ (अक्सर इंटरनेट कुकीज़ के रूप में जानी जाती हैं) टेक्स्ट फ़ाइलें होती हैं जिनमें छोटे डेटा टुकड़े होते हैं — जैसे उपयोगकर्ता नाम और पासवर्ड — जो नेटवर्क का उपयोग करते समय आपके कंप्यूटर की पहचान करने के लिए उपयोग किए जाते हैं। विशिष्ट कुकीज़ का उपयोग विशिष्ट उपयोगकर्ताओं की पहचान करने और उनके वेब ब्राउज़िंग अनुभव को बेहतर बनाने के लिए किया जाता है।
सौजन्य से: कास्परस्की https://www.kaspersky.com/resource-center/definitions/cookies
CookieJar कुकीज़ को संग्रहीत करने के लिए एक ऑब्जेक्ट है।
भेद्यता के विवरण के अनुसार, यह Tough-Cookie द्वारा कुकीज़ को आरंभ करने के तरीके से उत्पन्न होती है। चूंकि कुकीज़ ऑब्जेक्ट हैं, वे सैद्धांतिक रूप से कम से कम, Prototype Pollution के लिए संवेदनशील हैं।
ऑब्जेक्ट और विशेष रूप से कुकीज़ के साथ, ऑब्जेक्ट के प्रोटोटाइप के माध्यम से छेड़छाड़ करने में सक्षम होने से, हमलावर संभावित रूप से अनधिकृत डेटा तक पहुंच सकता है, रिमोट कोड निष्पादित कर सकता है, सेवा से इनकार कर सकता है, यदि वेबसाइट सत्र प्रबंधन के लिए कुकीज़ पर निर्भर करती है तो सत्र को हाईजैक कर सकता है, और कुकीज़ से संवेदनशील डेटा निकाल सकता है।
पैच फ़ाइल memstore.js में किया गया था। इस ट्रैकिंग के साथ-साथ पैच के अनुसार, जो संस्करण 4.1.3 में पेश किया गया था, भेद्यता को पैच करने के लिए, हमें कुकीज़ को एक मैप में स्टोर करने या this.idx ऑब्जेक्ट बनाने की आवश्यकता है। this.idx = {} के बजाय this.idx = Object.create(null); का उपयोग करके, मैं अपने सुझाव का अभ्यास करता हूं कि परिचय में प्रोटोटाइप प्रदूषण को कैसे रोका जाए, अर्थात null प्रोटोटाइप से विरासत में लेकर और प्रोटोटाइप श्रृंखला को काट दिया जाए।
Snyk ने चर्चित भेद्यता के लिए एक Proof of Concept (PoC) प्रकाशित किया था। मैंने इस पर index.js बनाया। अपवादों को पकड़ने के लिए try-catch लॉजिक में लपेटा, परीक्षण की प्रगति पर नज़र रखने के लिए अतिरिक्त आउटपुट जोड़ा और आवश्यक आउटपुट (जैसे "EXPLOITED SUCCESSFULLY" या "EXPLOITED FAILED") के साथ समाप्त हुआ। कमांड चलाने पर: npm install [email protected] && node index.js हमें निम्नलिखित आउटपुट मिलता है:
कमांड चलाने पर: npm install ./tough-cookie-2.5.0-PATCHED.tgz && node index.js हमें निम्नलिखित आउटपुट मिलता है:
दोनों परिदृश्यों (प्रकाशित 2.5.0 संस्करण और मेरे पैच किए गए संस्करण के साथ चलाने पर), हम सामान्य कुकी के साथ-साथ शोषित कुकी को सेट करने में सफल रहे, लेकिन पैच किए गए संस्करण में, हम शोषित कुकी तक पहुंचने में विफल रहे।
इस असाइनमेंट में मैंने Prototype Pollution हमले के बारे में सीखा, जावास्क्रिप्ट ऑब्जेक्ट के बारे में सीखा और Tough-Cookie पैकेज से परिचित हुआ।