LKM (Loadable Kernel Module)

Материал из Национальной библиотеки им. Н. Э. Баумана
Последнее изменение этой страницы: 18:17, 24 августа 2017.
Взаимодействие ядра с загружаемыми модулями и пользовательскими приложениями

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

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

Преимущества и недостатки использования модулей ядра

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

Без загружаемых модулей ядра операционные системы должны были бы иметь всю возможную функциональность в базовом ядре. Значительная часть кода не используется и лишь занимает память. Модуль - это некий код, который может быть загружен или выгружен ядром по мере необходимости. Модули расширяют функциональные возможности ядра без необходимости перезагрузки системы. Например, одна из разновидностей модулей ядра, драйвер устройств, позволяет ядру взаимодействовать с аппаратурой компьютера. При отсутствии поддержки модулей нам пришлось бы писать монолитное ядро и добавлять новые возможности прямо в ядро. При этом, после добавления в ядро новых возможностей, пришлось бы перезагружать систему.[Источник 2]

Недостатки

В свою очередь, не любая программа может быть сделана модулем ядра: на модули ядра накладываются определенные ограничения в части используемых функций (например, они не могут пользоваться функциями стандартной библиотеки С/С++ и должны использовать специальные аналоги, являющиеся функциями API (Application Programming Interface) ядра).[Источник 3]

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

Новый модуль может носить название, сходное с оригиналом, хотя и скрыть от системного администратора наличие нелегального модуля не представит сложность для опытного нарушителя.[1] Также есть возможность не только добавить новый модуль, но и перекомпилировать уже действующий, изменив его функции.[Источник 4]

Анатомия модуля ядра на примере Linux

Код простого загружаемого модуля.

Загружаемые модули ядра имеют ряд фундаментальных отличий от элементов, интегрированных непосредственно в ядро, а также от обычных программ. Обычная программа содержит главную процедуру (main)в отличие от загружаемого модуля, содержащего функции входа и выхода (в версии 2.6 эти функции можно именовать как угодно). Функция входа вызывается, когда модуль загружается в ядро, а функция выхода – соответственно при выгрузке из ядра. Поскольку функции входа и выхода являются пользовательскими, для указания назначения этих функций используются макросы module_init и module_exit . Загружаемый модуль содержит также набор обязательных и дополнительных макросов. Они определяют тип лицензии, автора и описание модуля, а также другие параметры.

Версия 2.6 ядра Linux предоставляет новый, более простой метод создания загружаемых модулей. После того как модуль создан, можно использовать обычные пользовательские инструменты для управления модулями (несмотря на изменения внутреннего устройства): insmod (устанавливает модуль), rmmod (удаляет модуль), modprobe (контейнер для insmod и rmmod), depmod (для создания зависимостей между модулями) и modinfo (для поиска значений в модулях макроса).[Источник 5]

Управление модулями ядра в Slackware Linux

Модули ядра в Windows

Ядро Windows само по себе не поддерживает расширения с помощью загружаемых модулей. Однако, поддерживаются загружаемые драйверы, а модуль, оформленный в виде драйвера Windows, не обязан работать с каким-либо внешним устройством. Благодаря этому, «псевдодрайверы» широко используются для изменения и расширения функциональности ядра Windows — анти-руткиты[2], перехватчики отладочного вывода, вспомогательные «агенты» многих системных программ, выпускаемых Sysinternals и т. п.

Драйверы устройств

Драйверы устройств являются одной из разновидностей модулей ядра. Они играют особую роль. Это настоящие "черные ящики", которые полностью скрывают детали, касающиеся работы устройства, и предоставляют четкий программный интерфейс для работы с аппаратурой. В Unix каждое аппаратное устройство представлено псевдофайлом (файлом устройства) в каталоге /dev. Этот файл обеспечивает средства взаимодействия с аппаратурой. Так, например, драйвер звуковой платы es1370.ko связывает файл устройства /dev/sound со звуковой платой Ensoniq IS1370. Пользовательское приложение, например mp3blaster может использовать для своей работы /dev/sound, ничего не подозревая о типе установленной звуковой платы.

Примечания

  1. В настоящее время доступно большое количество готовых программ, реализующих такого рода атаки. Но также доступными являются и средства противодействия, которые позволяют выявить установленные в системе наборы средств для взлома. Заслуживает внимания программа Rkdet. Программа Rkdet работает в режиме демона и проверяет контрольные суммы двоичных файлов. При выявлении изменений в двоичном файле по электронной почте отправляется сообщение о тревоге, после чего блокируется сетевой интерфейс до вмешательства системного администратора, который должен устранить проблему
  2. Руткит — это программа или набор программ для скрытия следов присутствия злоумышленника или вредоносной программы в системе(компьютере).

Источники

  1. Загружаемый модуль ядра // Wikipedia: сайт. [2017—2017]. Дата обновления: 24.08.2017. URL: https://ru.wikipedia.org/wiki/Загружаемый_модуль_ядра (дата обращения: 24.08.2017).
  2. The Linux Kernel Module Programming Guide // Linuxcenter: сайт. [2017—2017]. Дата обновления: 24.08.2017. URL: http://www.linuxcenter.ru/lib/books/lkmpg.phtml#WHATISAKERNELMODULE (дата обращения: 24.08.2017).
  3. Модульное ядро // Life-prog: сайт. [2017—2017]. Дата обновления: 24.08.2017. URL: http://life-prog.ru/1_61090_modulnoe-yadro.html (дата обращения: 24.08.2017).
  4. Безопасность ядра ОС UNIX // Centos: сайт. [2017—2017]. Дата обновления: 24.08.2017. URL: http://www.centos.su/articles/bezopasnost_linux/bezopasnost_jadra_os_unix/ (дата обращения: 24.08.2017).
  5. Анатомия загружаемых модулей ядра Linux // Ibm: сайт. [2017—2017]. Дата обновления: 24.08.2017. URL: https://www.ibm.com/developerworks/ru/library/l-lkm/ (дата обращения:24.08.2017).

Ссылки

  1. Введение в написание модулей ядра Linux. (linux kernel module gcc)
  2. Ori Pomerantz, Модули Ядра Linux Руководство По Программированию
  3. Red Hat Enterprise Linux 4: Руководство по системному администрированию