Издательский дом ООО "Гейм Лэнд"СПЕЦВЫПУСК ЖУРНАЛА ХАКЕР #69, АВГУСТ 2006 г.

ядро — на вилы

КРИС КАСПЕРСКИ АКА МЫЩЪХ

Спецвыпуск: Хакер, номер #069, стр. 069-032-1


ПЕРЕХВАТ СИСТЕМНЫХ ВЫЗОВОВ

Техника внедрения в ядро BSD и принципы перехвата системных функций мало чем отличаются от LINUX и NT, однако здесь есть своя специфика. Разберемся на конкретных листингах, учитывающих архитектурные особенности FreeBSD, NetBSD и OpenBSD

Ядро изолированно от адресного пространства прикладных приложений, и для взаимодействия с ним операционная система представляет ряд интерфейсов. FreeeBSD и NetBSD имеют монолитное ядро, поддерживающее загрузку динамических модулей, очень похожих на модули LINUX и чем-то напоминающие NT-драйвера. Загрузка модуля осуществляется «на лету», не требуя перезагрузки операционной системы, что очень хорошо. Естественно, для этого требуется права root'а, которые необходимо каким-то образом заполучить (но это уже тема для отдельного разговора). В GENERIC-ядре OpenBSD модули по умолчанию включены, но многие администраторы собирают монолитное ядро без поддержки модульности, считая, что это увеличивает защищенность, лишая атакующего возможности внедрять в ядро вредоносный код, однако...

Все xBSD-системы поддерживают псевдоустройство /dev/[k]mem (аналогичное тому, что имеется в LINIX) и библиотеку функций libkvm для работы с ним, прямых аналогов которой в LINUX нет. Поэтому, даже когда модули недоступны, у нас по-прежнему остается возможность модификации ядра, осуществляемая непосредственно с прикладного уровня, при условии, что мы владеем правами root'а.

[LKM-модули NetBSD и OpenBSD.]

Операционные системы NetBSD и OpenBSD поддерживают LKM-модули (Loadable Kernel Module, загружаемые модули ядра), «слизанные» с SunOS 4 и совместимые на интерфейсном уровне, реализованном через псевдоустройство /dev/lkm, с которым прикладные приложения взаимодействуют посредством вызовов ioctl (подробнее в «man 4 lkm»). В OpenBSD модули могут быть загружены только на нулевом уровне безопасности. Если же уровень отличен от нуля, а загрузить модули все-таки необходимо, следует отредактировать файл /etc/rc.securelevel, загружая модули до того, как уровень безопасно будет установлен на необходимую величину. Но в этом случае о динамической загрузке следует забыть, расставшись с одним из наиболее элегантных свойств оси.

Модули бывают разных типов:

- System Call Modules - реализующие новые системные вызовы (или замещающие уже существующие).

- Virtual File System Modules - поддерживающие виртуальные файловые системы.

- Device Drive Modules - управляющие существующими или несуществующими шинами и устройствами.

- Execution Interpreter Modules - отвечающие за загрузку различных исполняемых форматов.

- Miscellaneous Modules - к ним относятся все модули, не попадающие ни под одну из классификаций. Подробнее - в «man 9 module».

Каждый тип модуля имеет свои особенности реализации, но нам они без разницы. Управлять оборудованием мы не собираемся, устанавливать новую файловую систему — тоже. Перехват системных вызовов может быть осуществлен из любого модуля, а не только из MOD_SYSCALL. Это можно сделать непосредственно в процедуре начальной инициализации модуля, что избавит от необходимости заполнять все служебные структуры, которые в случае Device Drive модулей довольно громоздки.

Содержание  Вперед на стр. 069-032-2