
यह PwnKit भेद्यता के लिए एक्सप्लॉइट का मेरा सरल कार्यान्वयन है।
नोट: यह रिपॉजिटरी और इसकी सामग्री स्नातक अंतिम परियोजना (GrAL) का हिस्सा हैं, जो केवल शैक्षिक उद्देश्यों और अकादमिक अनुसंधान के लिए बनाई गई हैं।
यह रिपॉजिटरी CVE-2021-4034 भेद्यता (जिसे PwnKit के नाम से भी जाना जाता है) के लिए एक प्रूफ ऑफ कॉन्सेप्ट (PoC) प्रस्तुत करती है। यह मेमोरी भ्रष्टाचार भेद्यता Linux प्रणालियों पर Polkit के pkexec घटक को प्रभावित करती है। pkexec को खाली तर्क सूची (argc == 0) के साथ निष्पादित करने पर, पर्यावरणीय चरों में हेरफेर करके इसे एक मनमाना साझा लाइब्रेरी लोड करने के लिए बाध्य किया जा सकता है, जिससे स्थानीय विशेषाधिकार वृद्धि प्राप्त होती है।
नीचे, भेद्यता का शोषण करने के लिए निष्पादन वातावरण तैयार करने हेतु उठाए जाने वाले कदमों का वर्णन किया गया है। यह प्रक्रिया निर्धारित करती है कि pkexec की मेमोरी रीड/राइट त्रुटि का किस प्रकार लाभ उठाया जाता है:
gconv संरचना)यह एक्सप्लॉइट GLib द्वारा त्रुटि संदेश मुद्रित करने के प्रयास के दौरान वर्ण रूपांतरण को प्रबंधित करने के तरीके का दुरुपयोग करता है। इसके लिए, पहला कदम एक विशिष्ट निर्देशिका संरचना बनाना है, जो GLib के लिए GCONV रूपांतरण मॉड्यूल के स्थानीय भंडार के रूप में कार्य करेगी।
भेद्यता की कुंजी GCONV_PATH पर्यावरणीय चर को इंजेक्ट करना है, जो pkexec की argc == 0 स्थिति के कारण उत्पन्न सीमा-से-बाहर (out-of-bounds) लेखन का लाभ उठाता है। इस प्रकार, प्रोग्राम को एक असामान्य वर्णसेट का उपयोग करने के लिए बाध्य किया जाता है, जो GLib को संकेत देता है कि वर्ण रूपांतरण मॉड्यूल को पिछले चरण में बनाई गई नियंत्रित निर्देशिका में खोजा जाना चाहिए।
.so)अपने कोड को निष्पादित करने के लिए, एक साझा लाइब्रेरी (shared object या .so) संकलित की जानी चाहिए। जब pkexec एक ऐसे वर्णसेट को संसाधित करने का प्रयास करता है जिसे वह ढूंढ नहीं पाता, तो यह इस लाइब्रेरी को हमारी नकली gconv निर्देशिका से लोड करेगा। चूँकि pkexec SUID बिट सक्रिय वाला एक बाइनरी है (यह root के रूप में निष्पादित होता है), इस लाइब्रेरी को लोड करने पर हमारा कोड root विशेषाधिकार प्राप्त कर लेगा, सिस्टम पर पूर्ण नियंत्रण ले लेगा (उदाहरण के लिए, root शेल खोलकर)।
gconv-modules फ़ाइल का कॉन्फ़िगरेशनअंत में, उस स्थानीय निर्देशिका में gconv-modules नामक एक कॉन्फ़िगरेशन फ़ाइल बनाई जानी चाहिए। यह फ़ाइल एक अनुक्रमणिका के रूप में कार्य करती है: यह GLib को बताती है कि अनुरोधित विशिष्ट वर्णसेट के रूपांतरण के लिए उसे कौन सी विशिष्ट लाइब्रेरी (.so) लोड करनी चाहिए। यह फ़ाइल pkexec द्वारा अनुरोधित रूपांतरण को चरण 3 में बनाई गई साझा लाइब्रेरी से जोड़ती है।
प्रोजेक्ट में एक Makefile शामिल है जो C बाइनरी के संकलन और पर्यावरण की सफाई को स्वचालित करता है।
प्रोजेक्ट संकलित करने के लिए: $ make
बनाई गई फ़ाइलों (अस्थायी, फ़ोल्डर और बाइनरी) को साफ करने के लिए: $ make clean