Загружаемый модуль ядра (Операционные Системы)

Материал из Национальной библиотеки им. Н. Э. Баумана
Последнее изменение этой страницы: 18:03, 29 января 2018.

Загружаемый модуль ядра (Loadable Kernel Module, LKM) — в информатике — объектный файл, содержащий код, расширяющий возможности ядра операционной системы. Модули используются, чтобы добавить поддержку нового оборудования или файловых систем или для добавления новых системных вызовов. Когда функциональность, предоставляемая модулем, больше не требуется, он может быть выгружен, чтобы освободить память и другие ресурсы.

Большинство современных UNIX-систем и Windows поддерживают загружаемые модули ядра, хотя они могут использовать для них разные названия, например, kernel loadable module (kld) во FreeBSD, kernel extension (kext) в OS X. Иногда их называют Kernel Loadable Modules (KLM), или Kernel Modules (KMOD).[Источник 1]

Преимущества

Без загружаемых модулей ядра операционные системы должны были бы иметь всю возможную функциональность в базовом ядре. Значительная часть кода не используется и лишь занимает память. Каждый раз, когда пользователю необходима новая функциональность, ещё не включенная в базовое ядро, требуется полная перекомпиляция базового ядра и перезагрузка. Использование подгружаемых модулей значительно упрощает изменение функциональности ядра и не требует ни полной перекомпиляции (модуль часто может быть собран отдельно от ядра или поставлен в предкомпилированном виде), ни перезагрузок.[Источник 2]

Недостатки

Базовое ядро всегда распаковывается в реальную оперативную память по своим процедурам установки; таким образом, код базового ядра никогда не фрагментируется. Если система находится в состоянии, в котором могут быть вставлены модули, например, после подключения файловых систем, содержащих модули, существует вероятность того, что любая новая вставка кода ядра приведет к фрагментации ядра, что приведет к незначительному снижению производительности за счет использования большего количества записей TLB, что приведет к увеличению пропусков TLB.[Источник 3]

Реализации в различных ОС

Linux

В мире Linux модули загружаются и выгружаются утилитой modprobe. Модули хранятся в /lib/modules в файлах с расширением .ko («kernel object»), начиная с версии Linux 2.6. В предыдущих версиях использовалось расширение .o. Команда lsmod показывает список загруженных модулей ядра и зависимости между ними.[Источник 4]

Вопросы лицензирования

По мнению хранителей Linux, LKM представляет собой производную работу от ядра. Функции ядра могут помечаться как доступные только для GPL модулей. Загрузка собственнических или GPL-несовместимых модулей устанавливает флаг 'taint' в ядре. Данный флаг означает, что какие-либо проблемы или баги имеют меньшие шансы на исследование хранителями ядра. Модули фактически становятся частью работающего ядра и могут повредить внутренние структуры данных, создавая ошибки, которые не могут быть воспроизведены теми, кто не может загрузить проприетарный модуль.[Источник 5]

Дело Linuxant

В 2004 году, Linuxant—консалтинговая компания, которая выпускает проприетарные драйверы устройств как модули—попытался ядра злоупотреблять нулевого символа в поле <код> MODULE_LICENSE</код> , как в следующем фрагменте кода[Источник 6]:

   MODULE_LICENSE("GPL\0for files in the \"GPL\" directory; for others, only LICENSE file applies");
 

По сравнения строки кода, используемого ядра в это время пытались определить, является ли модуль под GPL был остановлен, когда он достиг нуль-символ (\0), так что будет обманывайте себя, думая, что модуль был провозглашая свое право быть просто "GPL".

FreeBSD

Модули ядра ОС FreeBSD хранятся в /boot/kernel/ (модули, распространяемые с дистрибутивом) или в /boot/modules/ для модулей, установленных из FreeBSD портов и других источников. Модули ядра FreeBSD обычно имеют расширение .ko. Модули могут подгружаться командой kldload, выгружаться kldunload. Список модулей виден по команде kldstat. Некоторые модули загружаются на этапе первичной загрузки (указываются в файле /boot/loader.conf).[Источник 7]

OS X

Некоторые загружаемые модули ядра в OS X могут быть загружены автоматически. Загружаемые модули ядра могут быть также загружены командой kextload. Список может быть выведен командой kextstat. Загружаемые модули ядра расположены в программных пакетах с расширением .kext. Модули поставляемые с операционной системой, хранятся в каталоге /System/Library/Extensions, модули от третьих лиц в других каталогах.[Источник 8]

NetWare

Модуль ядра NetWare называется загружаемым модулем NetWare (NLM). NLMs вставляются в ядре ОС NetWare с помощью команды load, и удалять при помощи командной разгрузки; в командных модулях списки загруженных модулей ядра. NLM могут находиться в любом допустимом пути поиска, назначенном на сервере NetWare .NLM как расширение имени файла.[Источник 9]

VxWorks

Загружаемый модуль ядра проекта типа ДКМ могут быть созданы для создания .out, который затем может быть загружен в пространство ядра с помощью команды Id. Этот загружаемый модуль ядра можно выгрузить с помощью команды unld.[Источник 10]

Solaris

Солярис имеет настраиваемый модуль Path ядра нагрузки, ее значение: /platform/platform-name/kernel /kernel /usr/kernel. Большинство модулей ядра жить в подкаталоги /kernel; тех, кто не считает необходимым для загрузки системы до такой степени, что init может начать часто (но не всегда) находится в /usr/kernel. При запуске ядра отладки система активно пытается выгрузить модули.[Источник 11]

Бинарная совместимость

Linux не обеспечивает стабильный API или ABI для модулей ядра. Это означает, что существуют различия во внутренней структуре и функции между разными версиями ядра, которые могут вызвать проблемы совместимости. В попытке борьбы с этими проблемами символ управления версиями данных помещается в .modinfo в разделе загружаемых ELF модулей. Эта информация о версии может быть сравнена с информацией версии исполняемого ядра перед загрузкой модуля; если версии несовместимы, то модуль не будет загружен. Другие операционные системы, такие как Solaris, FreeBSD, Mac OS X, Windows, поддерживают API и ABI для модулей относительно стабильными, что позволяет избежать этой проблемы. Например, модули FreeBSD, скомпилированные под версию ядра 6.0, будет работать без перекомпиляции на любой другой версии FreeBSD 6.x, например, 6.4. Однако они не совместимы с другими основными версиями и должны быть перекомпилированы для использования с FreeBSD 7.x, так как совместимость API и ABI поддерживается только внутри одной ветви.[Источник 12]

Безопасность

Загружаемые модули ядра являются удобным способом модифицировать ядро, это может быть использовано злоумышленником при взломе системы для предотвращения обнаружения его процессов или файлов, позволяя ему сохранить контроль над системой. Поэтому многие руткиты используют модули ядра.[Источник 13] Обратите внимание, что в большинстве модулей операционных систем повышение прав никоим образом не помогает, так как для загрузки модуля ядра требуются повышенные права; они просто облегчают злоумышленнику скрывать взлом.[Источник 14]

Linux

Linux позволяет отключить загрузку модуля с помощью sysctl параметр /proc/sys/kernel/modules_disabled. Система initramfs может загрузить определенные модули, необходимые для загрузки машины, а затем отключить загрузку модуля. Это делает безопасность очень похожей на монолитное ядро. Если злоумышленник может изменить initramfs, он может изменить двоичный файл ядра.[Источник 15]

OS X

В OS X Yosemite и более поздних выпусках расширение ядра должно быть подписано кодом с помощью сертификата разработчика, который имеет для этого определенное "право". Такой сертификат разработчика предоставляется только Apple по запросу и не предоставляется автоматически членам Apple Developer. Эта особенность, называемая "kext signing", включена по умолчанию, и это заставляет ядро, чтобы остановить загрузку, если неподписанные расширения ядра присутствуют.В OS X Эль-капитан и более поздних выпусках, она является частью системы защиты целостности. В старых версиях MacOS или если кекст подписи отключена, загружаемый модуль ядра в расширение ядра пакета может быть нагружена не-root пользователей, если собственность OSBundleAllowUserLoad имеет значение True, в список свойств пакета. Однако если какой-либо из файлов в пакете, включая исполняемый файл кода, не принадлежит корневому и групповому колесу или может быть записан группой или "другим", попытка загрузки загружаемого модуля ядра завершится неудачей.[Источник 16]

Solaris

Модули ядра могут дополнительно иметь раздел ELF криптографической подписи, который проверяется по нагрузке в зависимости от проверенных параметров политики загрузки. Ядро может обеспечить криптографическую подпись модулей набором доверенных сертификатов; список доверенных сертификатов хранится вне операционной системы в ILOM на некоторых платформах, основанных на SPARC. Загрузка модуля ядра, инициированного пространством пользователя, возможна только по доверенному пути, когда система запущена с включенной функцией неизменяемой глобальной зоны.[Источник 17]

Расположение

Не существует никаких ограничений, все равно в каком месте иерархии файлов, модули будут размещены, однако, они обычно установлены в каталог /lib/modules/, который разделен на подкаталоги версий ядра и категории модулей. [Источник 18]

Лицензия

По мнению разработчиков Linux, модули-это производные. Допускается распределение модулей, но часть символов будут доступны только для владельцев лицензии GPL.

При загрузке модуля, владелец будет "заражать" рабочее ядро. Поскольку модуль будет является частью ядра, его внедрение может привести к повреждению структуры данных или к внедрению ошибок, которые могут быть не исследованы из-за природы соответствующего модуля.[Источник 19]

Источники

  1. Loadable kernel module // Wikipedia. [2001-2017]. URL: https://en.wikipedia.org/wiki/Loadable_kernel_module (Дата обращения: 07.10.2017).
  2. Loadable kernel module// Wikipedia. [2001-2017]. URL: https://en.wikipedia.org/wiki/Loadable_kernel_module#Advantages (Дата обращения: 07.10.2017).
  3. Loadable kernel module // Wikipedia. [2001-2017]. URL: https://en.wikipedia.org/wiki/Loadable_kernel_module#Disadvantages (Дата обращения: 07.10.2017).
  4. Loadable kernel module // Wikipedia. [2001-2017]. URL: https://en.wikipedia.org/wiki/Loadable_kernel_module#Linux (Дата обращения: 07.10.2017).
  5. Loadable kernel module // Wikipedia. [2001-2017]. URL: https://en.wikipedia.org/wiki/Loadable_kernel_module#License_issues (Дата обращения: 07.10.2017).
  6. Loadable kernel module // Wikipedia. [2001-2017]. URL: https://en.wikipedia.org/wiki/Loadable_kernel_module#Linuxant_controversy (Дата обращения: 07.10.2017).
  7. Loadable kernel module // Wikipedia. [2001-2017]. URL: https://en.wikipedia.org/wiki/Loadable_kernel_module#FreeBSD (Дата обращения: 07.10.2017).
  8. Loadable kernel module // Wikipedia. [2001-2017]. URL: https://en.wikipedia.org/wiki/Loadable_kernel_module#macOS (Дата обращения: 07.10.2017).
  9. Loadable kernel module // Wikipedia. [2001-2017]. URL: https://en.wikipedia.org/wiki/Loadable_kernel_module#NetWare (Дата обращения: 07.10.2017).
  10. Loadable kernel module // Wikipedia. [2001-2017]. URL: https://en.wikipedia.org/wiki/Loadable_kernel_module#VxWorks (Дата обращения: 07.10.2017).
  11. Loadable kernel module // Wikipedia. [2001-2017]. URL: https://en.wikipedia.org/wiki/Loadable_kernel_module#Solaris (Дата обращения: 07.10.2017).
  12. Loadable kernel module // Wikipedia. [2001-2017]. URL: https://en.wikipedia.org/wiki/Loadable_kernel_module#Binary_compatibility (Дата обращения: 07.10.2017).
  13. Загружаемый модуль ядра // Wikipedia. [2001-2017]. URL: https://ru.wikipedia.org/wiki/%D0%97%D0%B0%D0%B3%D1%80%D1%83%D0%B6%D0%B0%D0%B5%D0%BC%D1%8B%D0%B9_%D0%BC%D0%BE%D0%B4%D1%83%D0%BB%D1%8C_%D1%8F%D0%B4%D1%80%D0%B0#Безопасность (Дата обращения: 07.10.2017).
  14. Loadable kernel module // Wikipedia. [2001-2017]. URL: https://en.wikipedia.org/wiki/Loadable_kernel_module#Security (Дата обращения: 07.10.2017).
  15. Loadable kernel module // Wikipedia. [2001-2017]. URL: https://en.wikipedia.org/wiki/Loadable_kernel_module#Linux_2 (Дата обращения: 07.10.2017).
  16. Loadable kernel module // Wikipedia. [2001-2017]. URL: https://en.wikipedia.org/wiki/Loadable_kernel_module#macOS_2 (Дата обращения: 07.10.2017).
  17. Loadable kernel module // Wikipedia. [2001-2017]. URL: https://en.wikipedia.org/wiki/Loadable_kernel_module#Solaris_2 (Дата обращения: 07.10.2017).
  18. Módulo carregável do núcleo // Wikipedia. [2001-2017]. URL: https://pt.wikipedia.org/wiki/M%C3%B3dulo_carreg%C3%A1vel_do_n%C3%BAcleo#Localiza%C3%A7%C3%A3o(Дата обращения: 07.10.2017).
  19. Módulo carregável do núcleo // Wikipedia. [2001-2017]. URL: https://pt.wikipedia.org/wiki/M%C3%B3dulo_carreg%C3%A1vel_do_n%C3%BAcleo#Licen%C3%A7a(Дата обращения: 07.10.2017).