Загружаемый модуль ядра - Loadable kernel module

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

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

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

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

Недостатки

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

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

Linux

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

Проблемы с лицензией

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

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

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

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

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

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

FreeBSD

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

macOS

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

NetWare

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

VxWorks

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

Солярис

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

Двоичная совместимость

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

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

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

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

Linux

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

macOS

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

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

Солярис

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

Смотрите также

использованная литература

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