وحدة النواة القابلة للتحميل
في الحوسبة ، وحدة نواة قابلة للتحميل ( LKM ) هي ملف كائن يحتوي على كود لتوسيع نواة التشغيل ، أو ما يسمى بالنواة الأساسية ، لنظام التشغيل . تُستخدم وحدات LKM عادةً لإضافة دعم للأجهزة الجديدة (مثل برامج تشغيل الأجهزة ) و/أو أنظمة الملفات ، أو لإضافة مكالمات النظام . عندما لم تعد الوظيفة التي توفرها وحدة LKM مطلوبة، يمكن تفريغها من أجل تحرير الذاكرة والموارد الأخرى.
تدعم معظم أنظمة التشغيل الشبيهة بنظام يونكس الحالية وأنظمة تشغيل مايكروسوفت ويندوز وحدات نواة قابلة للتحميل تحت أسماء مختلفة، مثل وحدة نواة قابلة للتحميل ( kld ) في FreeBSD ، ووحدة نواة إضافية ( kext ) في نظام ماك (على الرغم من إسقاط دعم وحدات الطرف الثالث [1] ) ، ووحدة نواة إضافية في AIX ، ووحدة نواة قابلة للتحميل ديناميكيًا في HP-UX ، وبرنامج تشغيل وضع نواة في نظام التشغيل ويندوز إن تي [4] ووحدة نواة قابلة للتنزيل ( DKM ) في VxWorks . تُعرف أيضًا باسم وحدات نواة قابلة للتحميل (أو KLM )، وببساطة وحدات نواة إضافية ( KMOD ).
المزايا
بدون وحدات نواة قابلة للتحميل، يجب أن يتضمن نظام التشغيل كل الوظائف المتوقعة الممكنة والمجمعة مباشرة في نواة النظام الأساسية. ستبقى الكثير من هذه الوظائف في الذاكرة دون استخدامها، مما يؤدي إلى إهدار الذاكرة [ بحاجة لمصدر ] ، وسيتطلب من المستخدمين إعادة بناء نواة النظام الأساسية وإعادة تشغيلها في كل مرة يحتاجون فيها إلى وظائف جديدة.
العيوب
أحد الانتقادات البسيطة لتفضيل نواة معيارية على نواة ثابتة هو ما يسمى بعقوبة التجزئة . يتم دائمًا تفريغ نواة الأساس في ذاكرة متجاورة حقيقية بواسطة روتينات الإعداد الخاصة بها ؛ وبالتالي، لا يتم تجزئة كود نواة الأساس أبدًا. بمجرد أن يكون النظام في حالة يمكن فيها إدراج الوحدات النمطية، على سبيل المثال بمجرد تثبيت أنظمة الملفات التي تحتوي على الوحدات النمطية، فمن المحتمل أن يؤدي أي إدراج كود نواة جديد إلى تجزئة النواة، وبالتالي إدخال عقوبة أداء بسيطة من خلال استخدام المزيد من إدخالات TLB ، مما يتسبب في المزيد من حالات فشل TLB. [ بحاجة لمصدر ]
التنفيذات في أنظمة التشغيل المختلفة
لينكس
يتم تحميل وحدات النواة القابلة للتحميل في لينكس (وتفريغها) بواسطة modprobeالأمر. توجد في /lib/modulesأو /usr/lib/modulesولها الامتداد .ko("كائن النواة") منذ الإصدار 2.6 (استخدمت الإصدارات السابقة .oالامتداد). [5] يسرد الأمر lsmodوحدات النواة المحملة. في حالات الطوارئ، عندما يفشل النظام في التشغيل بسبب وحدات معطلة على سبيل المثال، يمكن تمكين وحدات معينة أو تعطيلها عن طريق تعديل قائمة معلمات تمهيد النواة (على سبيل المثال، إذا كنت تستخدم GRUB ، عن طريق الضغط على "e" في قائمة بدء GRUB، ثم تحرير سطر معلمات النواة).
قضايا الترخيص
في رأي صياني لينكس، فإن LKM هي أعمال مشتقة من النواة [ بحاجة لمصدر ] . يتسامح صياني لينكس مع توزيع وحدات الملكية ، [ بحاجة لمصدر ] ولكن يسمحون بوضع علامة على الرموز على أنها متاحة فقط لوحدات الترخيص العام العام (GPL).
سيؤدي تحميل وحدة خاصة أو غير متوافقة مع GPL إلى تعيين علامة "تلوث" [6] [7] في نواة التشغيل - مما يعني أن أي مشاكل أو أخطاء تم مواجهتها ستكون أقل عرضة للتحقيق من قبل المشرفين. [8] [9] تصبح LKMs جزءًا فعليًا من نواة التشغيل، وبالتالي يمكن أن تفسد هياكل بيانات النواة وتنتج أخطاء قد لا يكون من الممكن التحقيق فيها إذا كانت الوحدة خاصة بالفعل.
الجدل حول لينوكسانت
في عام 2004، حاولت شركة Linuxant، وهي شركة استشارية تصدر برامج تشغيل للأجهزة الملكية كوحدات نمطية قابلة للتحميل للنواة، إساءة استخدام مُنهي فارغ في نظامها MODULE_LICENSE، كما هو واضح في مقتطف التعليمات البرمجية التالي:
MODULE_LICENSE ( "GPL \0 للملفات الموجودة في دليل \" GPL \" ؛ بالنسبة للآخرين، ينطبق ملف LICENSE فقط" );
حاول كود مقارنة السلسلة الذي استخدمه النواة في ذلك الوقت تحديد ما إذا كانت الوحدة النمطية مرخصة بموجب ترخيص GPL أم لا، ثم توقفت عند وصولها إلى حرف فارغ ( \0)، لذا تم خداعها للاعتقاد بأن الوحدة النمطية كانت تعلن عن ترخيصها على أنه "GPL" فقط. [10]
فري بي إس دي
يتم تخزين وحدات نواة FreeBSD/boot/kernel/ داخل وحدات موزعة مع نظام التشغيل ، أو عادةً /boot/modules/للوحدات المثبتة من منافذ FreeBSD أو حزم FreeBSD ، أو للوحدات الملكية أو الثنائية فقط. عادةً ما يكون لوحدات نواة FreeBSD الامتداد .ko. بمجرد تشغيل الجهاز، يمكن تحميلها باستخدام kldloadالأمر، وتفريغها باستخدام kldunload، وإدراجها باستخدام kldstat. يمكن أيضًا تحميل الوحدات من المحمل قبل بدء تشغيل النواة، إما تلقائيًا (من خلال /boot/loader.conf) أو يدويًا.
ماك
يمكن تحميل بعض وحدات النواة القابلة للتحميل في نظام macOS تلقائيًا. ويمكن أيضًا تحميل وحدات النواة القابلة للتحميل بواسطة kextloadالأمر. ويمكن إدراجها بواسطة الأمر kextstat. توجد وحدات النواة القابلة للتحميل في حزم ذات الامتداد .kext. يتم تخزين الوحدات المزودة مع نظام التشغيل في /System/Library/Extensionsالدليل؛ الوحدات المزودة بواسطة جهات خارجية توجد في أدلة أخرى مختلفة.
نت وير
يشار إلى وحدة نواة NetWare باسم وحدة NetWare Loadable Module (NLM). يتم إدراج وحدات NLM في نواة NetWare بواسطة الأمر LOAD، وإزالتها بواسطة الأمر UNLOAD؛ modulesيسرد الأمر وحدات نواة محملة حاليًا. يمكن أن توجد وحدات NLM في أي مسار بحث صالح معين على خادم NetWare، ولها .NLMامتداد اسم الملف.
في اكس وركس
يمكن إنشاء مشروع من نوع وحدة نواة قابلة للتنزيل (DKM) لتوليد ملف ".out" والذي يمكن تحميله بعد ذلك إلى مساحة نواة باستخدام الأمر "ld". يمكن تفريغ وحدة نواة قابلة للتنزيل هذه باستخدام الأمر "unld".
سولاريس
يحتوي Solaris على مسار تحميل وحدة نواة قابل للتكوين، والذي يكون افتراضيًا على /platform/platform-name/kernel /kernel /usr/kernel. توجد معظم وحدات نواة في أدلة فرعية ضمن /kernel؛ غالبًا (ولكن ليس دائمًا) تلك التي لا تعتبر ضرورية لتمهيد النظام إلى النقطة التي يمكن أن يبدأ فيها init /usr/kernel. عند تشغيل بناء نواة DEBUG، يحاول النظام بنشاط إلغاء تحميل الوحدات.
التوافق الثنائي
لا يوفر Linux واجهة برمجة تطبيقات أو واجهة تطبيقات ثنائية مستقرة لوحدات النواة. وهذا يعني أن هناك اختلافات في البنية الداخلية والوظيفة بين إصدارات النواة المختلفة، مما قد يتسبب في حدوث مشكلات في التوافق. وفي محاولة لمكافحة هذه المشكلات، يتم وضع بيانات إصدارات الرموز داخل .modinfoقسم وحدات ELF القابلة للتحميل . ويمكن مقارنة معلومات الإصدارات هذه بمعلومات النواة قيد التشغيل قبل تحميل وحدة؛ إذا كانت الإصدارات غير متوافقة، فلن يتم تحميل الوحدة.
تحافظ أنظمة التشغيل الأخرى، مثل Solaris و FreeBSD و macOS و Windows على استقرار واجهة برمجة التطبيقات وواجهة ABI للنواة نسبيًا، وبالتالي تتجنب هذه المشكلة. على سبيل المثال، ستعمل وحدات نواة FreeBSD المجمعة مقابل إصدار النواة 6.0 دون إعادة التجميع على أي إصدار آخر من FreeBSD 6.x، على سبيل المثال 6.4. ومع ذلك، فهي غير متوافقة مع الإصدارات الرئيسية الأخرى ويجب إعادة تجميعها لاستخدامها مع FreeBSD 7.x، حيث يتم الحفاظ على توافق واجهة برمجة التطبيقات وواجهة ABI داخل فرع واحد فقط.
حماية
في حين أن وحدات النواة القابلة للتحميل هي طريقة ملائمة لتعديل النواة قيد التشغيل، إلا أنه يمكن إساءة استخدام ذلك من قبل المهاجمين على نظام مخترق لمنع اكتشاف عملياتهم أو ملفاتهم ، مما يسمح لهم بالحفاظ على السيطرة على النظام. تستخدم العديد من أدوات الجذر أدوات LKM بهذه الطريقة. لاحظ أنه في معظم أنظمة التشغيل، لا تساعد الوحدات النمطية في رفع الامتيازات بأي شكل من الأشكال، حيث أن الامتيازات المرتفعة مطلوبة لتحميل أداة LKM؛ فهي تجعل من السهل على المهاجم إخفاء الاختراق. [11]
لينكس
يسمح Linux بتعطيل تحميل الوحدات النمطية عبر خيار sysctl/proc/sys/kernel/modules_disabled . [12] [13] قد يقوم نظام initramfs بتحميل وحدات نمطية معينة مطلوبة لجهاز ما عند بدء التشغيل ثم تعطيل تحميل الوحدات النمطية. هذا يجعل الأمان مشابهًا جدًا لنواة متجانسة. إذا كان بإمكان المهاجم تغيير initramfs، فيمكنه تغيير الملف الثنائي للنواة.
ماك
في نظام التشغيل OS X Yosemite والإصدارات الأحدث، يجب توقيع امتداد النواة بشهادة مطور تحمل "استحقاقًا" معينًا. لا يتم توفير مثل هذه الشهادة للمطور إلا من قبل شركة Apple عند الطلب ولا يتم منحها تلقائيًا لأعضاء Apple Developer . يتم تمكين هذه الميزة، المسماة "توقيع kext"، افتراضيًا وهي توجه النواة لإيقاف التشغيل إذا كانت هناك امتدادات نواة غير موقعة موجودة. [14] في نظام التشغيل OS X El Capitan والإصدارات الأحدث، فهي جزء من حماية سلامة النظام .
في الإصدارات الأقدم من نظام التشغيل macOS، أو إذا تم تعطيل توقيع kext، يمكن تحميل وحدة نواة قابلة للتحميل في حزمة امتداد نواة بواسطة مستخدمين غير جذر إذا تم تعيين خاصية OSBundleAllowUserLoad على True في قائمة خصائص الحزمة. [15] ومع ذلك، إذا لم يكن أي من الملفات الموجودة في الحزمة، بما في ذلك ملف التعليمات البرمجية القابل للتنفيذ، مملوكًا للجذر وعجلة المجموعة، أو يمكن الكتابة إليه بواسطة المجموعة أو "الآخر"، فإن محاولة تحميل وحدة نواة قابلة للتحميل ستفشل. [16]
سولاريس
يمكن أن تحتوي وحدات Kernel بشكل اختياري على قسم ELF للتوقيع المشفر والذي يتم التحقق منه عند التحميل وفقًا لإعدادات سياسة التمهيد التي تم التحقق منها. يمكن للنواة فرض توقيع الوحدات تشفيريًا بواسطة مجموعة من الشهادات الموثوقة؛ يتم الاحتفاظ بقائمة الشهادات الموثوقة خارج نظام التشغيل في ILOM على بعض المنصات المستندة إلى SPARC. لا يمكن تحميل وحدات Kernel التي تم بدء تشغيلها بواسطة Userspace إلا من المسار الموثوق به عندما يكون النظام قيد التشغيل مع تمكين ميزة Immutable Global Zone.
انظر أيضا
مراجع
- ^ "ملحقات Kernel القديمة وبدائل ملحقات النظام". Apple Inc. تم الاسترجاع في 13 مارس 2021 .
- ^ "مواضيع برمجة امتدادات النواة: مقدمة". Apple Inc. 1 سبتمبر 2010. مؤرشف من الأصل في 4 مايو 2013. تم الاسترجاع في 5 مايو 2013 .
- ^ "إدارة وتطوير وحدات النواة القابلة للتحميل ديناميكيًا". Hewlett-Packard . 7 يونيو 2001.
- ^ "ما الذي يحدد وقت تحميل برنامج التشغيل". شبكة مطوري Microsoft . Microsoft . 21 نوفمبر 2012. مؤرشف من الأصل في 6 مارس 2013. تم الاسترجاع في 5 مايو 2013 .
- ^ "دليل برمجة وحدات نواة لينكس، القسم 2.2 "تجميع وحدات نواة لينكس"" . تم الاسترجاع في 2020-10-05 .
- ^ Linus Torvalds; et al. (2011-06-21). "Documentation/oops-tracing.txt". kernel.org. مؤرشف من الأصل في 2011-10-02 . تم الاسترجاع في 2011-10-03 .
- ^ "النوى الملوثة". دليل المستخدم والمسؤول عن نواة لينكس .
- ^ جوناثان كوربيت (2006-03-24). "Tainting from user space". LWN.net . مؤرشف من الأصل في 2011-11-16 . تم استرجاعه في 2011-10-03 .
- ^ "وثائق دعم Novell: kernel Tainted". 2007-07-26 . تم الاسترجاع في 2011-10-03 .
- ^ جوناثان كوربيت (27 أبريل 2004). "الصدق مع MODULE_LICENSE". LWN.net. مؤرشف من الأصل في 2 نوفمبر 2012. تم الاسترجاع في 30 أكتوبر 2012 .
- ^ استغلال وحدات النواة القابلة للتحميل محفوظ في 2012-02-04 على موقع Wayback Machine
- ^ "Sysctl/kernel.txt". مؤرشف من الأصل في 15 أبريل 2013. تم الاسترجاع في 4 يناير 2013 .
- ^ Kees Cook (2012-11-28). "تعطيل الوحدة النمطية النظيفة". outflux.net . تم الاسترجاع في 2020-10-05 .
- ^ "Kernel Extensions". مكتبة مطوري Mac . Apple. 16 سبتمبر 2015. مؤرشف من الأصل في 17 أغسطس 2016. تم الاسترجاع في 29 سبتمبر 2016 .
- ^ "خصائص Info.plist لإضافات Kernel". Apple Inc. مؤرشف من الأصل في 26 سبتمبر 2012. تم الاسترجاع في 27 سبتمبر 2012 .
- ^ – دليل داروين ومدير نظام macOS
