Поиграем с туксом в прятки Крис Касперски ака мыщъх Хакер, номер #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"): |