Цель мониторинга за процессами заключается в выявлении исполняемых программ, которые потребляют несоразмерно много ресурсов, а также программ, которые были запущены внешним или внутренним нарушителем для атаки компьютерной системы. Подозрительными и заслуживающими внимания администратора следует считать процессы:
· запущенные от имени root с именами, которые обычно не отображаются в списке задач. Выявление таких процессов затруднено вследствие того, что они обычно не отображаются в списке задач;
· запущенные пользователями потенциально опасные системные утилиты с установленным битом SUID. Правда, в последнем случае, как будет показано ниже, владельцем процессов является суперпользователь root;
· имеющие странные имена, в том числе включающие в себя необычные символы. Это может быть следствием программной атаки на переполнение буфера.
Упомянув программные средства контроля над процессами, нельзя обойти вниманием способы, которые могут применить злоумышленники для их сокрытия. Нарушитель при запуске вредоносной программы закономерно попытается «спрятать» ее процесс от глаз администратора и других внимательных пользователей. Нелояльные пользователи, которые пытаются незаконно повысить свои полномочия, также могут скрытно от администратора запускать ответственные утилиты su, sudo, passwd, mount, chmod и др. Никто, впрочем, не запрещает использовать эти утилиты явно и по их прямому назначению. Разумеется, скрывать от визуального контроля имеет смысл только те процессы, которые выполняются достаточно долго. О нейтрализации программных средств аудита, которые, в частности, фиксируют мгновенные события, речь пойдет отдельно.
Возможности нарушителя определяются многими факторами, среди которых наиболее значимыми являются его права доступа, квалификация и программный инструментарий. Для того чтобы полностью скрыть или сделать неприметной отображаемую информацию, нарушитель может попытаться:
· изменить параметры процесса, по которым его можно отличить от других и идентифицировать;
· осуществить подмену самих утилит ps и top, отображающих информацию о процессах;
· изменить содержимое виртуальных файлов в директории /proc/PID, соответствующей номеру скрываемого процесса;
· произвести вмешательство в «ядерные» процессы в целях перехвата и замены отображаемой информации о процессах.
Обладая правами администратора, нарушитель может:
· внедрить программный модуль;
· обеспечить автоматический или периодический запуск системного процесса или службы;
· запустить процесс из командной строки и использовать методы его сокрытия на уровне ядра.
Так называемые «ядерные» методы сокрытия процессов основаны на соображениях, изложенных в [11]. Виртуальная файловая система /proc содержит по одному «числовому» каталогу на каждый выполняющийся процесс. Если скрыть такой каталог, то процесс с соответствующим идентификатором PID не будет отображаться утилитами psи top.
Для сокрытия каталогов и процессов предлагается одинаковый подход. Он заключается в том, что каждый файл (и каталог) представлен в ядре структурой file, одно из полей которой является указателем на другую структуру file_operations, определяющей допустимые действия с файлами. Если заблокировать обращение к конкретной функции, то она перестанет вызываться. Например, для сокрытия каталога следует заблокировать вызов функции readdir(). Алгоритмические и программные особенности для программистов можно почерпнуть в [8, 10, 11].
Ядро ОС Linux не является монолитным, а использует модульную архитектуру с механизмом загружаемых модулей (LKM – Loadable Kernel Modules). Модульные ядра, как правило, не требуют полной перекомпиляции при изменении состава аппаратного обеспечения компьютера. Это позволяет один раз собрать компактное ядро и, по мере необходимости, добавлять или удалять из него требуемый функционал. Модулями ядра могут быть и драйверы аппаратных устройств компьютера. После загрузки модуля он становится частью ядра.
Модули могут быть загружены с помощью команды modprobe или insmod. Как правило, команда modprobe более предпочтительна, потому что она загружает все вторичные модули, от которых зависит основной загружаемый модуль. Просмотреть список загруженных модулей можно командой lsmod (рис. 2.9).