
शैक्षिक केस स्टडी और CVE-2022-0185 के लिए एक्सप्लॉइट डेवलपमेंट वॉकथ्रू, एक Linux कर्नेल हीप-आधारित बफर ओवरफ्लो जो स्थानीय विशेषाधिकार वृद्धि को सक्षम करता है। इसमें POC, QEMU डीबगिंग, और Ubuntu एक्सप्लॉइट विस्तृत तकनीकी विश्लेषण के साथ शामिल है।
यह केस स्टडी ECE 9069: Introduction to Hacking : https://whisperlab.org/introduction-to-hacking/ असाइनमेंट का परिणाम है।
CVE-2022-0185 एक हीप-आधारित बफर ओवरफ्लो दोष है जो Linux कर्नेल के Filesystem Context कार्यक्षमता में legacy_parse_param फ़ंक्शन द्वारा आपूर्ति किए गए पैरामीटर की लंबाई को सत्यापित करने के तरीके में पाया गया था। एक अनप्रिविलेज्ड (यदि अनप्रिविलेज्ड यूज़र नेमस्पेस सक्षम हैं, अन्यथा नेमस्पेस्ड CAP_SYS_ADMIN विशेषाधिकार की आवश्यकता है) स्थानीय उपयोगकर्ता जो Filesystem Context API का समर्थन नहीं करने वाली फ़ाइल सिस्टम को खोलने में सक्षम है (और इस प्रकार लीगेसी हैंडलिंग पर वापस आ जाता है), इस दोष का उपयोग करके सिस्टम पर अपने विशेषाधिकारों को बढ़ा सकता है। [1]
इस भेद्यता की रिपोर्ट के बाद, इस बग को ठीक करने के लिए पैच जारी किया गया है:
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=722d94847de2
https://ubuntu.com/security/CVE-2022-0185#impact-score
एक्सप्लोरर से एक विस्तृत लेख है: https://www.hackthebox.com/blog/CVE-2022-0185:_A_case_study
इस रिपोर्टरी में मैं इस भेद्यता को पुन: उत्पन्न करने के लिए बुनियादी कदमों और संबंधित पृष्ठभूमि जानकारी की व्याख्या करूंगा। साथ ही, अगर आपको कुछ भी अस्पष्ट लगता है, तो आप मुझे एक ईमेल भेज सकते हैं:[email protected] मुझे प्रश्न का उत्तर देने में काफी खुशी होगी।
CVE-2022-0185 भेद्यता 02/11/2022 को प्रकाशित की गई थी, जिसमें CVSS 3.x बेस स्कोर 8.4 (उच्च) था।[1] यह भेद्यता एक हीप-आधारित बफर ओवरफ्लो है, जो एक अहस्ताक्षरित पूर्णांक अंडरफ्लो के कारण होता है।
यह भेद्यता Linux v5.1 कर्नेल में शुरू की गई थी, जो 5.1 से अधिक कर्नेल संस्करणों वाले सभी Linux वितरणों को प्रभावित करती है। उदाहरण के लिए, Ubuntu 20.04 LTS (focal) इस बग के लिए असुरक्षित था। हालांकि, एक पैच जारी किया गया था और संस्करण 5.4.0-96.109 .[3]
इस भेद्यता का शोषण करने से एक अनप्रिविलेज्ड स्थानीय उपयोगकर्ता सिस्टम पर अपने विशेषाधिकारों को बढ़ा सकता है, संभावित रूप से पूरे सिस्टम से समझौता कर सकता है।[1] [2] यहाँ CVSS स्कोर का एक विस्तृत विश्लेषण है: बेस स्कोर: 8.4, एक महत्वपूर्ण सुरक्षा जोखिम का संकेत देता है जिस पर तत्काल ध्यान देने की आवश्यकता है। प्रभाव स्कोर: 5.9, यदि शोषण किया जाता है तो पर्याप्त संभावित क्षति का सुझाव देता है। उच्च गोपनीयता, अखंडता और उपलब्धता मान इस स्कोर में योगदान करते हैं। शोषणीयता स्कोर: 2.5, अपेक्षाकृत उच्च शोषणीयता का सुझाव देता है। स्थानीय आक्रमण वेक्टर, उच्च अखंडता , और उच्च उपलब्धता मान इस स्कोर में योगदान करते हैं।
तालिका 1.1 और तालिका 1.2 इन स्कोर और उनके घटकों के बारे में अधिक जानकारी प्रदान करती हैं।
| CVSS v3.1 गंभीरता | मान |
|---|---|
| बेस स्कोर | 8.4 HIGH |
| प्रभाव स्कोर | 5.9 |
| शोषणीयता स्कोर | 2.5 |
तालिका 1.1 CVSS गंभीरता स्कोर[1]
| CVSS v3.1 मीट्रिक | मान |
|---|---|
| आक्रमण वेक्टर (AV) | Local |
| आवश्यक विशेषाधिकार (PR) | None |
| उपयोगकर्ता सहभागिता (UI) | None |
| गोपनीयता (C) | High |
| अखंडता (I) | High |
| उपलब्धता (A) | High |
तालिका 1.2 CVSS वेक्टर[1]
आधुनिक कंप्यूटरों में दो पूर्णांक प्रकार होते हैं, साइन्ड और अहस्ताक्षरित। साइन्ड संख्या का प्रतिनिधित्व आम तौर पर दो के पूरक नामक एक ऑपरेशन शामिल करता है।[4] “दो का पूरक बाइनरी अंक का उपयोग सबसे बड़े स्थान मान के साथ संकेत के रूप में करता है ताकि यह इंगित किया जा सके कि बाइनरी संख्या धनात्मक है या ऋणात्मक”[4]
दो के पूरक को प्रस्तुत करने से घटाव की गणना जोड़ में परिवर्तित हो जाएगी, इसलिए CPU के डिज़ाइन और कार्यान्वयन को सरल बनाया जाएगा। किसी पूर्णांक के दो के पूरक का निर्माण तीन चरणों में शामिल है:[4]
चित्र 2.1.1.1 एक आरेख में रूपांतरण प्रक्रिया दिखाता है जिसमें “-6” को उसके दो के पूरक प्रारूप में परिवर्तित करने का एक वास्तविक उदाहरण है।

चित्र 2.1.1.2 दो के पूरक का उपयोग करके जोड़
चित्र 2.1.1.2 '-6' के दो के पूरक को '+6' में जोड़ने की प्रक्रिया दिखाता है। यह प्रदर्शित करता है कि दो के पूरक का उपयोग कैसे जोड़ को घटाव के विकल्प के रूप में उपयोग करने की अनुमति देता है।

चित्र 2.1.1.2 दो के पूरक का उपयोग करके जोड़
अनुभाग 2.1.1 से, हम पहले से ही समझ गए हैं कि दो का पूरक क्या है। अब, कंप्यूटर में अहस्ताक्षरित संख्या अंडरफ्लो के परिदृश्य पर एक नज़र डालते हैं। आधुनिक कंप्यूटरों में, जब अहस्ताक्षरित संख्याओं का उपयोग किया जाता है, तो सबसे महत्वपूर्ण बिट को साइन्ड बिट के रूप में नहीं माना जाता है; बल्कि, यह स्वयं अहस्ताक्षरित संख्या का हिस्सा है। इस स्थिति का अर्थ है कि जब एक अहस्ताक्षरित संख्या के साथ घटाव करते हैं, तो हमें सतर्क रहना चाहिए, क्योंकि यह अहस्ताक्षरित संख्या अंडरफ्लो के रूप में जानी जाने वाली स्थिति को जन्म दे सकता है।[5]
चित्र 2.1.2.1 एक 8-बिट अहस्ताक्षरित संख्या के लिए 5 में से 6 घटाने की स्थिति को दर्शाता है। अहस्ताक्षरित संख्या के लपेटने के कारण अंतिम परिणाम 255 होता है। जब यह अंडरफ्लो एक सशर्त बयान में होता है, तो इसमें बयान की कार्यक्षमता को बाधित करने की क्षमता होती है।

चित्र 2.1.2.1 अहस्ताक्षरित संख्या अंडरफ्लो
Linux कर्नेल में, स्लैब आवंटक एक मेमोरी प्रबंधन तंत्र है जिसका उपयोग छोटे मेमोरी खंडों के कुशल आवंटन और डीलोकेशन के लिए किया जाता है। यह स्लैब के कई कैश बनाए रखकर प्रदर्शन प्रदान करता है, प्रत्येक में निश्चित आकार के मेमोरी ब्लॉक होते हैं। आम तौर पर, kmalloc-32 32 बाइट्स मेमोरी आवंटित करता है, यह एक kmalloc-32 स्लैब है, जबकि kmalloc-4k 4096 बाइट्स मेमोरी आवंटित करता है, यह एक kmalloc-4k स्लैब है।[6]
इसके अलावा, Linux कर्नेल में स्लैब आवंटन में आम तौर पर कर्नेल के हीप मेमोरी क्षेत्र के भीतर एक सन्निहित पता स्थान से मेमोरी आवंटित करना शामिल होता है। यह सन्निहित पता कर्नेल द्वारा प्रबंधित किया जाता है और इसका उपयोग विभिन्न कर्नेल ऑब्जेक्ट और डेटा संरचनाओं के लिए मेमोरी आवंटित करने के लिए किया जाता है। चित्र 2.2.1.1 Linux कर्नेल मेमोरी में स्लैब के लेआउट को दर्शाता है।

चित्र 2.2.1.1 Linux में स्लैब आवंटक [7] (इस आकृति के लेखक https://leviathan.vip/ हैं)
यदि आप स्वयं संकलित Linux कर्नेल के साथ प्रक्रिया को पुन: उत्पन्न करना चाहते हैं तो कृपया पृष्ठभूमि जानकारी प्राप्त करने के लिए निम्नलिखित मार्कडाउन फ़ाइलें पढ़ें:
नोट:
सभी मार्कडाउन फ़ाइलों के साथ-साथ कोड और स्क्रिप्ट इस रिपॉजिटरी के विभिन्न फ़ोल्डरों में हैं, प्रत्येक फ़ोल्डर अपनी स्वयं की मार्कडाउन फ़ाइल के साथ आता है, कुछ करने का प्रयास करने से पहले इसे पढ़ें!
अनुभाग 2.1 में, हमने समझाया कि अहस्ताक्षरित अंडरफ्लो कैसे काम करता है। अब, हम कर्नेल फ़ंक्शन की जांच करेंगे जिसमें यह भेद्यता है।