लोडेबल कर्नेल मॉड्यूल
कम्प्यूटिंग में, एक लोड करने योग्य कर्नेल मॉड्यूल (LKM) एक वस्तु फ़ाइल है जिसमें एक ऑपरेटिंग सिस्टम के चलने वाले कर्नेल (ऑपरेटिंग सिस्टम), या तथाकथित बेस कर्नेल के विस्तार के लिए कोड होता है। एलकेएम आमतौर पर नए कंप्यूटर हार्डवेयर (डिवाइस ड्राइवर के रूप में) और/या फाइल सिस्टम के लिए या सिस्टम कॉल जोड़ने के लिए समर्थन जोड़ने के लिए उपयोग किया जाता है। जब एलकेएम द्वारा प्रदान की जाने वाली कार्यक्षमता की आवश्यकता नहीं होती है, तो इसे कंप्यूटर भंडारण और अन्य संसाधनों को मुक्त करने के लिए अनलोड किया जा सकता है।
अधिकांश वर्तमान यूनिक्स जैसी प्रणालियाँ और Microsoft Windows विभिन्न नामों के तहत लोड करने योग्य कर्नेल मॉड्यूल का समर्थन करते हैं, जैसे कि FreeBSD में कर्नेल लोड करने योग्य मॉड्यूल (kld), macOS में कर्नेल एक्सटेंशन (kext) (हालाँकि तृतीय-पक्ष मॉड्यूल के लिए समर्थन छोड़ा जा रहा है)[1]),[2] AIX में कर्नेल एक्सटेंशन मॉड्यूल, HP-UX में गतिशील रूप से लोड करने योग्य कर्नेल मॉड्यूल,[3] Windows NT में कर्नेल-मोड ड्राइवर[4] और VxWorks में डाउनलोड करने योग्य कर्नेल मॉड्यूल (DKM)। उन्हें कर्नेल लोड करने योग्य मॉड्यूल (या केएलएम) के रूप में भी जाना जाता है, और केवल कर्नेल मॉड्यूल (केएमओडी) के रूप में जाना जाता है।
लाभ
लोड करने योग्य कर्नेल मॉड्यूल के बिना, एक ऑपरेटिंग सिस्टम को बेस कर्नेल में सीधे संकलित सभी संभावित प्रत्याशित कार्यक्षमता को शामिल करना होगा। उस कार्यक्षमता का अधिकांश उपयोग किए बिना स्मृति में रहता है, स्मृति को बर्बाद कर देता है, और इसके लिए आवश्यक होगा कि उपयोगकर्ता हर बार नई कार्यक्षमता की आवश्यकता होने पर बेस कर्नेल को पुनर्निर्माण और रीबूट करें।
नुकसान
एक स्थिर कर्नेल पर एक मॉड्यूलर कर्नेल को प्राथमिकता देने की एक छोटी सी आलोचना तथाकथित विखंडन (कंप्यूटिंग) पेनल्टी है। बेस कर्नेल हमेशा अपने सेटअप रूटीन द्वारा वास्तविक सन्निहित रैंडम एक्सेस मेमोरी में अनपैक किया जाता है; इस प्रकार, बेस कर्नेल कोड कभी खंडित नहीं होता है। एक बार जब सिस्टम उस स्थिति में होता है जिसमें मॉड्यूल डाले जा सकते हैं, उदाहरण के लिए एक बार फ़ाइल सिस्टम को माउंट (कंप्यूटिंग) कर दिया जाता है जिसमें मॉड्यूल होते हैं, यह संभावना है कि कोई भी नया कर्नेल कोड सम्मिलन कर्नेल को खंडित कर देगा, जिससे परिचय अधिक अनुवाद लुकसाइड बफर प्रविष्टियों का उपयोग करके एक मामूली प्रदर्शन जुर्माना, जिससे अधिक टीएलबी छूट जाती है।[citation needed]
विभिन्न ऑपरेटिंग सिस्टम में कार्यान्वयन
लिनक्स
लिनक्स में लोड करने योग्य कर्नेल मॉड्यूल किसके द्वारा लोड (और अनलोड) किए जाते हैं modprobe
आज्ञा। वे में स्थित हैं /lib/modules
या /usr/lib/modules
और उनका विस्तार हो गया है .ko
(कर्नेल ऑब्जेक्ट) संस्करण 2.6 के बाद से (पिछले संस्करणों ने .o
विस्तार)।[5] lsmod
e> कमांड लोड किए गए कर्नेल मॉड्यूल को सूचीबद्ध करता है। आपातकालीन मामलों में, जब सिस्टम बूट करने में विफल रहता है उदा। टूटे हुए मॉड्यूल, विशिष्ट मॉड्यूल को कर्नेल बूट पैरामीटर सूची को संशोधित करके सक्षम या अक्षम किया जा सकता है (उदाहरण के लिए, यदि GNU GRUB का उपयोग करके, GRUB प्रारंभ मेनू में 'e' दबाकर, फिर कर्नेल पैरामीटर लाइन को संपादित करके)।
लाइसेंस मुद्दे
लिनक्स अनुरक्षकों की राय में, LKM कर्नेल का व्युत्पन्न कार्य है[citation needed]. लिनक्स अनुरक्षक मालिकाना सॉफ्टवेयर मॉड्यूल के वितरण को सहन करते हैं,[citation needed] लेकिन प्रतीकों को केवल जीएनयू जनरल पब्लिक लाइसेंस (GPL) मॉड्यूल के लिए उपलब्ध के रूप में चिह्नित करने की अनुमति दें।
मालिकाना या गैर-जीपीएल-संगत मॉड्यूल लोड करने से 'कलंक' ध्वज सेट हो जाएगा[6][7] चल रहे कर्नेल में - जिसका अर्थ है कि अनुभव की गई किसी भी समस्या या बग की अनुरक्षकों द्वारा जांच किए जाने की संभावना कम होगी।[8][9] LKM प्रभावी रूप से चल रहे कर्नेल का हिस्सा बन जाते हैं, इसलिए कर्नेल डेटा संरचनाओं को दूषित कर सकते हैं और ऐसे बग उत्पन्न कर सकते हैं जिनकी जांच नहीं की जा सकती है यदि मॉड्यूल वास्तव में मालिकाना है।
Linuxant विवाद
2004 में, Linuxant, एक परामर्श कंपनी जो लोड करने योग्य कर्नेल मॉड्यूल के रूप में मालिकाना डिवाइस ड्राइवर जारी करती है, ने अपने में एक शून्य वर्ण का दुरुपयोग करने का प्रयास किया। MODULE_LICENSE
, जैसा कि निम्नलिखित कोड अंश में दिखाई देता है:
MODULE_LICENSE("GPL\0for files in the \"GPL\" directory; for others, only LICENSE file applies");
कर्नेल द्वारा उपयोग किए गए स्ट्रिंग तुलना कोड ने उस समय यह निर्धारित करने का प्रयास किया कि क्या मॉड्यूल GPLed बंद हो गया था जब यह एक शून्य वर्ण तक पहुंच गया था (\0
), इसलिए यह सोचकर बेवकूफ बनाया गया कि मॉड्यूल अपने लाइसेंस को सिर्फ GPL घोषित कर रहा है।[10]
फ्रीबीएसडी
FreeBSD के लिए कर्नेल मॉड्यूल भीतर संग्रहीत हैं /boot/kernel/
ऑपरेटिंग सिस्टम के साथ वितरित मॉड्यूल के लिए, या आमतौर पर /boot/modules/
FreeBSD पोर्ट या FreeBSD पोर्ट#पैकेज से स्थापित मॉड्यूल के लिए, या मालिकाना या अन्यथा बाइनरी-ओनली मॉड्यूल के लिए। FreeBSD कर्नेल मॉड्यूल में आमतौर पर एक्सटेंशन होता है .ko
. एक बार मशीन बूट हो जाने के बाद, उन्हें इसके साथ लोड किया जा सकता है kldload
कमांड, अनलोडेड kldunload
, और के साथ सूचीबद्ध है kldstat
. कर्नेल शुरू होने से पहले मॉड्यूल को लोडर से भी लोड किया जा सकता है, या तो स्वचालित रूप से (के माध्यम से /boot/loader.conf
) या हाथ से।
मैकोज़
macOS में कुछ लोड करने योग्य कर्नेल मॉड्यूल स्वचालित रूप से लोड किए जा सकते हैं। लोड करने योग्य कर्नेल मॉड्यूल को इसके द्वारा भी लोड किया जा सकता है kextload
आज्ञा। द्वारा सूचीबद्ध किया जा सकता है kextstat
आज्ञा। लोड करने योग्य कर्नेल मॉड्यूल एक्सटेंशन के साथ बंडल (macOS) में स्थित हैं .kext
. ऑपरेटिंग सिस्टम के साथ दिए गए मॉड्यूल्स को स्टोर किया जाता है /System/Library/Extensions
निर्देशिका; तीसरे पक्ष द्वारा आपूर्ति किए गए मॉड्यूल विभिन्न अन्य निर्देशिकाओं में हैं।
नेटवेयर
नेटवेयर कर्नेल मॉड्यूल को नेटवेयर लोड करने योग्य मॉड्यूल (एनएलएम) कहा जाता है। एनएलएम को लोड कमांड के माध्यम से नेटवेयर कर्नेल में डाला जाता है, और अनलोड कमांड के माध्यम से हटाया जाता है; modules
कमांड वर्तमान में लोड किए गए कर्नेल मॉड्यूल को सूचीबद्ध करता है। एनएलएम नेटवेयर सर्वर पर निर्दिष्ट किसी भी वैध खोज पथ में रह सकते हैं, और उनके पास है .NLM
फ़ाइल नाम एक्सटेंशन के रूप में।
वीएक्सवर्क्स
एक डाउनलोड करने योग्य कर्नेल मॉड्यूल (DKM) प्रकार की परियोजना एक .out फ़ाइल उत्पन्न करने के लिए बनाई जा सकती है जिसे बाद में ld कमांड का उपयोग करके कर्नेल स्थान पर लोड किया जा सकता है। यह डाउनलोड करने योग्य कर्नेल मॉड्यूल unld कमांड का उपयोग करके अनलोड किया जा सकता है।
सोलारिस
सोलारिस के पास एक विन्यास योग्य कर्नेल मॉड्यूल लोड पथ है, जो इसके लिए तयशुदा है /platform/platform-name/kernel /kernel /usr/kernel
. अधिकांश कर्नेल मॉड्यूल उपनिर्देशिकाओं के अंतर्गत रहते हैं /kernel
; जिन्हें सिस्टम को उस बिंदु तक बूट करने के लिए आवश्यक नहीं माना जाता है जो init प्रारंभ कर सकते हैं अक्सर (लेकिन हमेशा नहीं) में पाए जाते हैं /usr/kernel
. DEBUG कर्नेल बिल्ड करते समय सिस्टम सक्रिय रूप से मॉड्यूल को अनलोड करने का प्रयास करता है।
बाइनरी संगतता
लिनक्स कर्नेल मॉड्यूल के लिए एक स्थिर एपीआई या अनुप्रयोग बाइनरी इंटरफ़ेस प्रदान नहीं करता है। इसका अर्थ है कि विभिन्न कर्नेल संस्करणों के बीच आंतरिक संरचना और कार्य में अंतर हैं, जो संगतता समस्याओं का कारण बन सकता है। उन समस्याओं का मुकाबला करने के प्रयास में, प्रतीक संस्करण डेटा को .modinfo
लोड करने योग्य निष्पादन योग्य और लिंक करने योग्य प्रारूप मॉड्यूल का खंड। मॉड्यूल लोड करने से पहले इस वर्जनिंग जानकारी की तुलना चल रहे कर्नेल से की जा सकती है; यदि संस्करण असंगत हैं, तो मॉड्यूल लोड नहीं होगा।
अन्य ऑपरेटिंग सिस्टम, जैसे Solaris (ऑपरेटिंग सिस्टम), FreeBSD, macOS, और Microsoft Windows कर्नेल API और एप्लिकेशन बाइनरी इंटरफ़ेस को अपेक्षाकृत स्थिर रखते हैं, इस प्रकार इस समस्या से बचते हैं। उदाहरण के लिए, कर्नेल संस्करण 6.0 के विरुद्ध संकलित FreeBSD कर्नेल मॉड्यूल किसी अन्य FreeBSD 6.x संस्करण पर पुनर्संकलन के बिना काम करेगा, उदा। 6.4। हालांकि, वे अन्य प्रमुख संस्करणों के साथ संगत नहीं हैं और उन्हें FreeBSD 7.x के साथ उपयोग करने के लिए पुनः संकलित किया जाना चाहिए, क्योंकि API और ABI संगतता केवल एक शाखा के भीतर ही बनाए रखी जाती है।
सुरक्षा
जबकि लोड करने योग्य कर्नेल मॉड्यूल चालू कर्नेल को संशोधित करने का एक सुविधाजनक तरीका है, हमलावरों द्वारा उनकी प्रक्रिया (कंप्यूटिंग) या कम्प्यूटर फाइल का पता लगाने से रोकने के लिए एक समझौता प्रणाली पर इसका दुरुपयोग किया जा सकता है, जिससे उन्हें सिस्टम पर नियंत्रण बनाए रखने की अनुमति मिलती है। कई rootkit एलकेएम का इस तरह से उपयोग करते हैं। ध्यान दें कि, अधिकांश ऑपरेटिंग सिस्टम पर, मॉड्यूल किसी भी तरह से विशेषाधिकार उन्नयन में मदद नहीं करते हैं, क्योंकि एलकेएम को लोड करने के लिए उन्नत विशेषाधिकार की आवश्यकता होती है; वे केवल हमलावर के लिए सेंधमारी को छुपाना आसान बनाते हैं।[11]
लिनक्स
लिनक्स sysctl विकल्प के माध्यम से मॉड्यूल लोडिंग को अक्षम करने की अनुमति देता है /proc/sys/kernel/modules_disabled
.[12][13] एक प्रारंभिक रैमडिस्क सिस्टम बूट पर मशीन के लिए आवश्यक विशिष्ट मॉड्यूल को लोड कर सकता है और फिर मॉड्यूल लोडिंग को अक्षम कर सकता है। यह सुरक्षा को एक अखंड कर्नेल के समान बनाता है। यदि कोई हमलावर initramfs को बदल सकता है, तो वे कर्नेल बाइनरी को बदल सकते हैं।
मैकोज़
OS X Yosemite और बाद के रिलीज में, एक कर्नेल एक्सटेंशन को कोड हस्ताक्षर | कोड-हस्ताक्षरित एप्पल डेवलपर प्रमाणपत्र के साथ होना चाहिए जो इसके लिए एक विशेष पात्रता रखता है। ऐसा डेवलपर प्रमाणपत्र केवल अनुरोध पर Apple द्वारा प्रदान किया जाता है और स्वचालित रूप से Apple डेवलपर सदस्यों को नहीं दिया जाता है। यह सुविधा, जिसे kextsigning कहा जाता है, डिफ़ॉल्ट रूप से सक्षम है और यह कर्नेल को बूटिंग रोकने का निर्देश देती है यदि अहस्ताक्षरित कर्नेल एक्सटेंशन मौजूद हैं।[14] OS X El Capitan|OS X El Capitan और बाद में रिलीज, यह सिस्टम इंटीग्रिटी प्रोटेक्शन का हिस्सा है।
MacOS के पुराने संस्करणों में, या यदि kext हस्ताक्षर अक्षम है, कर्नेल एक्सटेंशन बंडल में लोड करने योग्य कर्नेल मॉड्यूल को गैर-रूट उपयोगकर्ताओं द्वारा लोड किया जा सकता है यदि OSBundleAllowUserLoad गुण बंडल की संपत्ति सूची में True पर सेट है।[15] हालाँकि, यदि निष्पादन योग्य कोड फ़ाइल सहित बंडल की कोई भी फ़ाइल रूट और ग्रुप व्हील के स्वामित्व में नहीं है, या समूह या अन्य द्वारा लिखने योग्य है, तो कर्नेल लोड करने योग्य मॉड्यूल को लोड करने का प्रयास विफल हो जाएगा।[16]
सोलारिस
कर्नेल मॉड्यूल में वैकल्पिक रूप से एक क्रिप्टोग्राफ़िक हस्ताक्षर ELF अनुभाग हो सकता है जो सत्यापित बूट नीति सेटिंग्स के आधार पर लोड पर सत्यापित होता है। कर्नेल यह लागू कर सकता है कि मॉड्यूल क्रिप्टोग्राफ़िक रूप से विश्वसनीय प्रमाणपत्रों के एक सेट द्वारा हस्ताक्षरित हैं; कुछ SPARC आधारित प्लेटफॉर्म पर ILOM में OS के बाहर विश्वसनीय प्रमाणपत्रों की सूची रखी जाती है। उपयोक्तास्थान द्वारा शुरू किया गया कर्नेल मॉड्यूल लोडिंग विश्वसनीय पथ से तभी संभव है जब सिस्टम सक्षम अपरिवर्तनीय वैश्विक क्षेत्र सुविधा के साथ चल रहा हो।
यह भी देखें
- नेटवेयर लोड करने योग्य मॉड्यूल
संदर्भ
- ↑ "बहिष्कृत कर्नेल एक्सटेंशन और सिस्टम एक्सटेंशन विकल्प". Apple Inc. Retrieved 13 March 2021.
- ↑ "Kernel Extension Programming Topics: Introduction". Apple Inc. September 1, 2010. Archived from the original on May 4, 2013. Retrieved May 5, 2013.
- ↑ "गतिशील रूप से लोड करने योग्य कर्नेल मॉड्यूल का प्रबंधन और विकास करना". Hewlett-Packard. June 7, 2001.
- ↑ "ड्राइवर लोड होने पर क्या निर्धारित करता है". Microsoft Developer Network. Microsoft. November 21, 2012. Archived from the original on March 6, 2013. Retrieved May 5, 2013.
- ↑ "The Linux Kernel Module Programming Guide, section 2.2 "Compiling Kernel Modules"". Retrieved 2020-10-05.
- ↑ Linus Torvalds; et al. (2011-06-21). "Documentation/oops-tracing.txt". kernel.org. Archived from the original on 2011-10-02. Retrieved 2011-10-03.
- ↑ "दागी हुई गुठली". The Linux kernel user’s and administrator’s guide.
- ↑ Jonathan Corbet (2006-03-24). "यूजर स्पेस से टैनिंग". LWN.net. Archived from the original on 2011-11-16. Retrieved 2011-10-03.
- ↑ "Novell support documentation: Tainted kernel". 2007-07-26. Retrieved 2011-10-03.
- ↑ Jonathan Corbet (April 27, 2004). "Being honest with MODULE_LICENSE". LWN.net. Archived from the original on November 2, 2012. Retrieved October 30, 2012.
- ↑ Exploiting Loadable Kernel Modules Archived 2012-02-04 at the Wayback Machine
- ↑ "Sysctl/kernel.txt". Archived from the original on April 15, 2013. Retrieved January 4, 2013.
- ↑ Kees Cook (2012-11-28). "Clean module disabling". outflux.net. Retrieved 2020-10-05.
- ↑ "कर्नेल एक्सटेंशन". Mac Developer Library. Apple. September 16, 2015. Archived from the original on August 17, 2016. Retrieved September 29, 2016.
- ↑ "कर्नेल एक्सटेंशन के लिए Info.plist गुण". Apple Inc. Archived from the original on September 26, 2012. Retrieved September 27, 2012.
- ↑ Darwin and macOS System Manager's Manual –