Из Википедии, свободной энциклопедии
Перейти к навигации Перейти к поиску

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

Большинство текущих Unix-подобных систем и Microsoft Windows поддерживают загружаемые модули ядра, хотя они могут использовать для них другое имя, например, загружаемый модуль ядра ( kld ) во FreeBSD , расширение ядра ( kext ) в macOS (хотя теперь не рекомендуется в macOS [1 ] ), [2] модуль расширения ядра в AIX , драйвер режима ядра в Windows NT [3] и загружаемый модуль ядра ( DKM ) в VxWorks . Они также известны какзагружаемые модули ядра (или KLM ), и просто как модули ядра ( KMOD ).

Преимущества [ править ]

Без загружаемых модулей ядра операционная система должна была бы включать все возможные ожидаемые функции, скомпилированные непосредственно в базовое ядро. Большая часть этих функциональных возможностей будет находиться в памяти без использования, тратя впустую память и потребует от пользователей перекомпоновки и перезагрузки базового ядра каждый раз, когда им потребуются новые функциональные возможности.

Недостатки [ править ]

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

Реализации в разных операционных системах [ править ]

Linux [ править ]

Загружаемые модули ядра в Linux загружаются (и выгружаются) командой modprobe . Они расположены в / lib / modules и имеют расширение .ko («объект ядра»), начиная с версии 2.6 (в предыдущих версиях использовалось расширение .o ). [4] Команда lsmod выводит список загруженных модулей ядра. В экстренных случаях, когда система не загружается из-за, например, неисправных модулей, определенные модули можно включить или отключить, изменив список параметров загрузки ядра (например, при использовании GRUB , нажав 'e' в меню запуска GRUB, затем редактирование строки параметров ядра).

Проблемы с лицензией [ править ]

По мнению разработчиков Linux, LKM являются производными от ядра [ необходима цитата ] . Сопровождающие Linux допускают распространение проприетарных модулей [ необходима цитата ], но разрешают помечать символы как доступные только для модулей GNU General Public License (GPL).

Загрузка проприетарного или несовместимого с GPL модуля приведет к установке флага «taint» [5] [6] в работающем ядре - это означает, что любые проблемы или обнаруженные ошибки с меньшей вероятностью будут исследованы сопровождающими. [7] [8] LKM фактически становятся частью работающего ядра, поэтому могут повредить структуры данных ядра и вызвать ошибки, которые невозможно будет исследовать, если модуль действительно является проприетарным.

Линуксантское противоречие [ править ]

В 2004 году Linuxant, консалтинговая компания , которая выпускает фирменные драйверы устройств , как загружаемых модулей ядра, пытались злоупотреблять нулевой терминатор в их MODULE_LICENSE, так как видно в следующем фрагменте кода:

MODULE_LICENSE ( "GPL \ 0 для файлов в каталоге \" GPL \ " ; для других применяется только файл LICENSE" );

Код сравнения строк, используемый ядром в то время, пытался определить, был ли модуль остановлен под GPL, когда он достиг нулевого символа ( \ 0 ), поэтому он был введен в заблуждение, думая, что модуль объявлял свою лицензию просто "GPL" . [9]

FreeBSD [ править ]

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

macOS [ править ]

Некоторые загружаемые модули ядра в macOS могут загружаться автоматически. Загружаемые модули ядра также можно загрузить с помощью команды kextload . Их можно перечислить с помощью команды kextstat . Загружаемые модули ядра находятся в связках с расширением .kext . Модули, поставляемые с операционной системой, хранятся в каталоге / System / Library / Extensions ; модули, поставляемые третьими сторонами, находятся в различных других каталогах.

NetWare [ править ]

Модуль ядра NetWare называется загружаемым модулем NetWare (NLM). Модули NLM вставляются в ядро ​​NetWare с помощью команды LOAD и удаляются с помощью команды UNLOAD; команда modules выводит список загруженных в настоящее время модулей ядра. Модули NLM могут находиться в любом допустимом пути поиска, назначенном на сервере NetWare, и имеют .NLM в качестве расширения имени файла.

VxWorks [ править ]

Проект типа загружаемого модуля ядра (DKM) может быть создан для создания файла «.out», который затем может быть загружен в пространство ядра с помощью команды «ld». Этот загружаемый модуль ядра можно выгрузить с помощью команды unld.

Солярис [ править ]

Solaris имеет настраиваемый путь загрузки модуля ядра, по умолчанию это / платформа / имя-платформы / ядро ​​/ ядро ​​/ usr / kernel . Большинство модулей ядра находятся в подкаталогах в / kernel ; те, которые не считаются необходимыми для загрузки системы до такой степени, что может запуститься init, часто (но не всегда) находятся в / usr / kernel . При запуске сборки ядра DEBUG система активно пытается выгрузить модули.

Двоичная совместимость [ править ]

Linux не предоставляет стабильного API или ABI для модулей ядра. Это означает, что существуют различия во внутренней структуре и функциях между разными версиями ядра, что может вызвать проблемы совместимости. В попытке решить эти проблемы, данные управления версиями символов помещаются в раздел .modinfo загружаемых модулей ELF . Эту информацию о версиях можно сравнить с информацией о работающем ядре перед загрузкой модуля; если версии несовместимы, модуль не будет загружен.

В других операционных системах, таких как Solaris , FreeBSD , macOS и Windows, API ядра и ABI остаются относительно стабильными, что позволяет избежать этой проблемы. Например, модули ядра FreeBSD, скомпилированные для версии ядра 6.0, будут работать без перекомпиляции с любой другой версией FreeBSD 6.x, например, 6.4. Однако они несовместимы с другими основными версиями и должны быть перекомпилированы для использования с FreeBSD 7.x, так как совместимость API и ABI поддерживается только в пределах ветки.

Безопасность [ править ]

Хотя загружаемые модули ядра представляют собой удобный метод модификации работающего ядра, злоумышленники могут злоупотреблять им в скомпрометированной системе, чтобы предотвратить обнаружение своих процессов или файлов , позволяя им сохранять контроль над системой. Многие руткиты используют LKM таким образом. Обратите внимание, что в большинстве операционных систем модули никоим образом не помогают повышать привилегии , поскольку повышенные привилегии требуются для загрузки LKM; они просто помогают злоумышленнику скрыть взлом. [10]

Linux [ править ]

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

macOS [ править ]

В OS X Yosemite и более поздних версиях расширение ядра должно быть подписано кодом с сертификатом разработчика, который содержит конкретное «право» на это. Такой сертификат разработчика предоставляется Apple только по запросу и не выдается автоматически участникам Apple Developer . Эта функция, называемая «подписывание kext», включена по умолчанию и дает указание ядру прекратить загрузку, если присутствуют неподписанные расширения ядра. [13] В OS X El Capitan и более поздних версиях он является частью защиты целостности системы .

В более старых версиях macOS или если подписание kext отключено, загружаемый модуль ядра в пакете расширений ядра может быть загружен пользователями без полномочий root, если для свойства OSBundleAllowUserLoad установлено значение True в списке свойств пакета. [14] Однако, если какой-либо из файлов в пакете, включая файл исполняемого кода, не принадлежит root и group wheel или доступен для записи группе или «другому», попытка загрузить загружаемый модуль ядра завершится ошибкой. . [15]

Солярис [ править ]

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

См. Также [ править ]

  • Загружаемый модуль NetWare

Ссылки [ править ]

  1. ^ «Устаревшие расширения ядра и альтернативы расширению системы» . Apple , Inc . Проверено 13 марта 2021 года .
  2. ^ "Темы программирования расширений ядра: Введение" . Apple Inc. 1 сентября 2010 года. Архивировано 4 мая 2013 года . Проверено 5 мая 2013 года .
  3. ^ «Что определяет, когда драйвер загружен» . Сеть разработчиков Microsoft . Microsoft . 21 ноября 2012 года. Архивировано 6 марта 2013 года . Проверено 5 мая 2013 года .
  4. ^ «Руководство по программированию модулей ядра Linux, раздел 2.2« Компиляция модулей ядра » » . Проверено 5 октября 2020 .
  5. ^ Линус Торвальдс; и другие. (2011-06-21). "Documentation / oops-tracing.txt" . kernel.org. Архивировано 2 октября 2011 года . Проверено 3 октября 2011 .
  6. ^ "Испорченные ядра" . Руководство пользователя и администратора ядра Linux .
  7. Джонатан Корбет (24 марта 2006 г.). «Заражение из пользовательского пространства» . LWN.net . Архивировано 16 ноября 2011 года . Проверено 3 октября 2011 .
  8. ^ «Справочная документация Novell: испорченное ядро» . 2007-07-26 . Проверено 3 октября 2011 .
  9. Джонатан Корбет (27 апреля 2004 г.). «Честность с MODULE_LICENSE» . LWN.net. Архивировано 2 ноября 2012 года . Проверено 30 октября 2012 года .
  10. ^ Использование загружаемых модулей ядра. Архивировано 4 февраля 2012 г. на Wayback Machine.
  11. ^ "Sysctl / kernel.txt" . Архивировано из оригинального 15 апреля 2013 года . Проверено 4 января 2013 года .
  12. ^ Кис Кук (2012-11-28). «Отключение чистого модуля» . Outflux.net . Проверено 5 октября 2020 .
  13. ^ «Расширения ядра» . Библиотека разработчика Mac . Яблоко. 16 сентября 2015 года. Архивировано 17 августа 2016 года . Проверено 29 сентября 2016 года .
  14. ^ «Свойства Info.plist для расширений ядра» . Apple Inc. Архивировано 26 сентября 2012 года . Проверено 27 сентября 2012 года .
  15. ^ kextload(8)  -  Дарвин и руководство администратора системы macOS