Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР #77, МАЙ 2005 г.

Поиграем с туксом в прятки

Крис Касперски ака мыщъх

Хакер, номер #077, стр. 077-102-2


# insmod my_module.o

Загружать модули может только root. Не спрашивай меня, как его получить — это тема отдельного разговора. Чтобы модуль автоматически загружался вместе с операционной системой — добавь его в файл /etc/modules. Команда "lsmod" (или "dd if=/proc/modules bs=1") отображает список загруженных модулей, а "rmmod my_module" выгружает модуль из памяти. Обрати внимание на отсутствие расширения в последнем случае.

Список модулей, выданный командой lsmod, наш модуль носит имя my_module

Module Size Used by Tainted: P

my_module 240 0 (unused)

parport_pc 25128 1 (autoclean)

lp 7460 0

processor 9008 0 [thermal]

fan 1600 0 (unused)

button 2700 0 (unused)

rtc 7004 0 (autoclean)

BusLogic 83612 2 (autoclean)

ext3 64388 1 (autoclean)

Неожиданное появление новых модулей всегда настораживает админов, поэтому прежде чем приступать к боевым действиям, мы должны как следует замаскироваться. Автору известно три способа маскировки:

1. исключение модуля из списка модулей (метод J.B., см. на диске файл modhide1.c) – крайне ненадежен, препятствует нормальной работе ps, top и других подобных утилит, часто роняет систему;

2. перехват обращений к /proc/modules (метод Runar'a Jensen'а, опубликованный в Bugtraq и реализующийся так же, как и перехват остальных обращений к файловой системе) — довольно громоздкий и ненадежный метод, бессильный против команды "dd if=/proc/modules bs=1";

3. затирание структуры module info (метод Solar'a Designer'a, описанный в статье "Weakening the Linux Kernel", опубликованной в 52 номере PHRACK'a) — элегантный и довольно надежный. Расскажем о нем поподробнее.

Вся информация о модуле хранится в структуре module info, содержащейся внутри системного вызова sys_init_module(). Подготовив модуль к загрузке и заполнив module info надлежащим образом, он передает управление нашей функции init_module (см. "man init_module"). Любопытная особенность ядра — безымянные модули без референсов не отображаются! Чтобы удалить модуль из списка достаточно обнулить поля name и refs. Это легко. Определить адрес самой module info намного сложнее. Ядро не заинтересовано сообщать его первому встречному хакеру, поэтому приходится действовать исподтишка. Исследуя мусор, оставшийся в регистрах, на момент передачи управления init_module, Solar Designer обнаружил, что в одном из них содержится указатель на... module info! В его версии ядра это был регистр EBX, в иных версиях он может быть совсем другим или даже вовсе никаким. К тому же существует специальная заплатка для старых ядер, затыкающая эту лазейку, правда, далеко не у всех она установлена. Впрочем, эффективный адрес module info легко установить дизассемблированием, точнее не адрес module info (память под него выделяется динамически), а адрес машинной инструкции, ссылающейся на module info. Правда, в каждой версии ядра он будет своим... Простейший пример маскировки выглядит так (кстати, в PHRACK'e опечатка: "ref" вместо "refs"):

Назад на стр. 077-102-1  Содержание  Вперед на стр. 077-102-3