Ядро любой операционной системы является ее основой. Оно управляет
всеми операциями ввода-вывода для всех устройств, выдает системные
ресурсы для каждого процесса и выдает отчет о работе системы. Без него
работа компьютера невозможна. Скомпрометированное ядро представляет
опасность для работы всех служб независимо от того, какие функции
выполняет данный компьютер. В данной статье не раскрыты возможности
относительно безопасности, предоставляемые ядром, а рассказаны
проблемы, связанные с защитой ядра, как такового, а также раскрыты
существующие уязвимости ядра и варианты понижения вытекающих из них
рисков.
Ядро ОС UNIX представляет собой единый полнофункциональный код. При
включении компьютера BIOS передает управление загрузчику, который в
свою очередь передает управление компьютером ядру. Посредствам
загрузчика может быть выбрано то или иное ядро, но, загрузившись, его
невозможно сменить вплоть до последующей перезагрузки компьютера. И
ничего более не оказывает теперь такого определяющего воздействия на
работу системы, как деятельность ядра. Исходные коды различных версий
ядер UNIX открыты и доступны в Интернете. Ядро обычно собирается с
учетом тех функциональных требований, которые предъявляются к
непосредственно взятому компьютеру. Так в ядра некоторых ОС, к которым
предъявляются требования удобств, встроена графическая оболочка. Если
ОС устанавливается на маршрутизаторе, рациональным является исключение
всех средств за исключением самых необходимых.
В случае компрометации системы, например подбора пароля
суперпользователя root, существует предел действий злоумышленника.
Если он запустит несколько резидентных программ, создаст нового
пользователя с привилегиями root, рано или поздно он может быть
обнаружен системным администратором, даже если сможет обойти все
уровни защиты. Системный администратор может обнаружить действия
хакера, воспользовавшись рядом самых простых команд, таких как who,
ps, netstat, просмотрев журналы системы логирования или сравнив
бинарные файлы с их оригиналами, взятыми из достоверных источников. В
случае более профессиональной атаки, если скомпрометировано ядро,
системному администратору обнаружить несанкционированные действия
становится значительно сложнее. А если действует опытный нарушитель,
это становится практически невозможным. Здесь поможет только полная
переустановка ОС, о чем будет рассказано далее.
Модифицировать ядро ОС UNIX можно, дополняя или заменяя модули. Это
позволяет модифицировать его, не прибегая к перекомпиляции, а также к
перезагрузке компьютера, что является очень гибким инструментом.
Загрузка и отключение модулей ядра бывают полезны, когда требуется
добавить какие-то функции ядру или при установке нового устройства.
Модули имеют непосредственный доступ ко всем переменным среды
окружения. Это удобно, но становится опасным, если используется в
негативных целях. Например, злоумышленник может написать и загрузить
свой собственный модуль, используя команды modprobe и rmmod. Такой
<<негативный>> модуль может перехватывать и обрабатывать по своему
усмотрения системные вызовы, например системы логирования, что может
обеспечить хакеру прозрачность нахождения в системе или работы
какого-либо сервиса.
Вот пример программного кода, позволяющего перехватить системный вызов
setuid(). Происходит проверка UID пользователя и в случае, если это
19222, то UID изменяется на новый, равный 0. Т.е. любая программа,
вызвавшая setuid(19222) выполняется с привилегиями root, независимо от
того, какой пользователь ее запустил.
int new_uid (uid_t);
int (*old_uid)(uid_t);
extern void *sys_call_table[];
int init_module(){
register struct module *mp asm ("%ebx");
int cleanup_module(){
sys_call_table[ SYS_setuid] = (void *)old_uid;
return 0;
}
int new_uid(uid_t uid){
if (uid ==19222 ) {
current ->uid =0;
current ->gid =0;
current ->euid =0;
current ->egid =0;
return 0;
}
return (*old_uid)(uid);
}
При грамотной работе злоумышленника (хотя такие средства безусловно
применяются и в благих целях) модуль не будет виден в списке
загруженных модулей и его невозможно будет выгрузить. Здесь перед
злоумышленником открываются возможности, ограниченные лишь его
фантазией.
Новый модуль может носить название, сходное с оригиналом, хотя и
скрыть от системного администратора наличие нелегального модуля не
представит сложность для опытного нарушителя. Также есть возможность
не только добавить новый модуль, но и перекомпилировать уже
действующий, изменив его функции.
В настоящее время доступно большое количество готовых программ,
реализующих такого рода атаки. Но также доступными являются и средства
противодействия, которые позволяют выявить установленные в системе
наборы средств для взлома. По нашему мнению, заслуживает внимания
программа Rkdet (http://www.vancouver-webpages.com/rkdet/). Эту программу
следует запустить, когда компьютер точно не скомпрометирован и
работает нормально. Программа Rkdet работает в режиме демона и
проверяет контрольные суммы двоичных файлов. При выявлении изменений в
двоичном файле по электронной почте отправляется сообщение о тревоге,
после чего блокируется сетевой интерфейс до вмешательства системного
администратора, который должен устранить проблему (не забывайте
отключить Rket при обновлении своего программного обеспечения).
Программа Chkrootkit (http://www.chkrootkit.org) обладает даже большими
возможностями, чем Rkdet, дополнительно сверяя результаты выполнения
команды ps с записями в каталоге /proc и проверяя изменения файлов
wtmp и lastlog. Эта программа специально предназначена для выявления
более чем 35 наборов программ для взлома, включая различные версии
LKR, Knark t0rn, ARK и даже ряда <<червей>>, таких как например Ramen,
Lion и Adore. Программа Chkrootkit может выявлять даже дополнительные
наборы средств для взлома, поскольку многие из них работают по
сходному алгоритму.
Программа Chkrootkit может работать под управлением различных
операционных систем UNIX, например Solaris и *BSD-системах. Весь пакет
управляется специальным сценарием командного интерпретатора, который
при необходимости вызывает обслуживающие программы. В частности, среди
действий, отслеживаемых Chkrootkit, можно назвать следующие:
- удаление записей в файлах lastlog, wtmp и wtmpx;
- перевод сетевого интерфейса в <<неразборчивый>> режим;
- наличие скрытых процессов (указывает на запуск какого-либо
модуля ядра);
- признаки специальных троянских версий двоичных файлов;
- проверка журналов системы логирования;
- наличие конфигурационных файлов, используемых в наборах средств
для взлома.
Несмотря на большое количество проверок, которые выполняет Chkrootkit,
эта программа работает очень быстро. При подозрении в компрометации
компьютеров следует запускать Chkrootkit дважды - первый раз до
отключения системы и второй раз - после ее запуска в
однопользовательском режиме.
Лучше же всего использовать средство, которое бы позволяло отключать и
включать мандаты по своему усмотрению, например система обнаружения
вторжений в ОС Linux LIDS. Это средство является одним из самых
распространенных средств такого рода. Средства контроля целостности
файлов помогут узнать об установке новых модулей ядра или модификации
существующих. Ограничение прав доступа и применение команды chattr +i
в отношении различных каталогов /lib/modules может замедлить атаку
начинающего хакера.
Но единственной реальной защитой против таких сложных атак являются
заплаты ядра наподобие LIDS, когда соответствующая конфигурация
заплаты не позволяет даже суперпользователю устанавливать файлы в
каталог /lib/modules или вообще загружать модули в ядро.
Вообще заплата LIDS (Linux Intrusion Detection System - система
обнаружения и защиты от вторжений в операционную систему Linux,
http://www.lids.org/) на самом деле представляет собой даже нечто
большее, чем то что можно представить, исходя из ее названия. Что
касается <<обнаружения вторжений>>, то LIDS использует систему
оповещения об атаке и встроенный детектор сканирования портов, который
работает на уровне ядра. Но наиболее полезной особенностью LIDS
является усовершенствование модели защиты всей операционной системы
Linux.
LIDS может быть установлена как заплата ядра и как средство
администрирования. Среди предоставляемых ею возможностей можно
выделить следующие.
- Усовершенствование защиты файлов. Защищенные с помощью LIDS файлы
могут быть скрытыми или с установленной защитой от изменений даже со
стороны суперпользователя.
- Защита процессов. Ядро может отклонить отправку сигналов (например,
сигнала SIGKILL) защищенным процессам. Процессы также могут быть
скрытыми - каталог /proc не предоставит никакой информации об этом
процессе.
- Улучшенный контроль за правами доступа. Применяется более
эффективное назначение мандатов для предоставления привилегий, включая
запрещение изменения мандатов пользователю с правами системного
администратора.
- Встроенный детектор сканирования портов. Детектор сканирования может
быть встроен в ядро и позволяет обнаруживать большинство известных
методов сканирования (например, скрытое, SYN - сканирование и т.д.),
выполняемых программами nmap, SATAN и другими подобными сетевыми
сканерами. Информация обо всех действиях, которые совершаются против
всех защищенных LIDS объектов, записывается в системный журнал или
отправляется по электронной почте.
Для установки LIDS необходимо загрузить последнюю официальную версию
ядра Linux и исходный код заплаты LIDS. После этого установите заплату
для исходного кода ядра, выполните его компиляцию, инсталлируйте
утилиту администрирования и перезагрузите систему. После запуска LIDS
разрешает выполнять изменения ядра только суперпользователю, который
будет идентифицирован утилитой lidsam. Сведения обо всех изменениях,
внесенных в ядро на постоянной основе, сохраняются в каталоге
/etc/lids.
С помощью LIDS можно устанавливать жесткие ограничения прав доступа к
большинству файлов. Желательно защитить все двоичные файлы (/bin,
/sbin, /usr/sbin и т.д. ), все файлы системы логирования (/var/log) и
конфигурационные файлы (/etc). LIDS позволяет использовать четыре типа
прав доступа к файлам.
- Deny (запретить). Файлы с этим атрибутом не доступны для любых
пользователей или программ, кроме тех, кому предоставлены особые
полномочия. Например, можно запретить доступ к файлу /etc/shadow всем
пользователям и программам и выдать особое разрешение только для
программы /bin/login с целью предоставления возможности аутентификации
пользователей.
- Read-only (только для чтения). Файлы только для чтения не могут
изменяться ни одним пользователем, включая суперпользователя.
- Append-only (только для добавления). Файлы с атрибутом для
добавления позволяют лишь добавить информацию. Сохраненные данные не
могут быть изменены. Как правило, этот атрибут устанавливается для
файлов системы логирования, которые должны иметь возможность
записывать новые данные, и в то же время необходимо запретить удаление
хакером каких-либо строк, которые бы указали на выполненные им
действия.
- Write (запись). Этот атрибут позволяет предоставить права записи
файлов для определенных пользователей или программ.
К сожалению, LIDS не предусматривает возможность автоматических
ответных действий, но с помощью программ мониторинга системы
логирования или фильтров электронной почты можно организовать просмотр
создаваемых LIDS отчетов и автоматического создания правил для
программ ipchains/iptables.
LIDS представляет собой очень эффективное средство для повышения
безопасности компьютера по сравнению со стандартными возможностями
операционной системы. Она является, на наш взгляд, идеальным средством
для защиты ядра от подобных атак. Кроме того, как мы видим, она
обладает очень широким рядом функций по защите вашей системы. Но это
средство не для боязливых администраторов. Мы советуем внимательно
прочесть документацию и описание возможных настроек LIDS перед ее
использованием на своем компьютере. Следует также учитывать, что на
одном компьютере строго не рекомендуется установка нескольких заплат
ядра.
Если ваше ядро подверглось атаке, вы не можете доверять работе своего
компьютера. Злоумышленник, скорее всего оставил возможность вернуться
в систему в роли суперпользователя. Тема восстановления системы после
взлома была неоднократно освещена и выходит за рамки данной статьи. В
любом случае необходимо постоянно иметь под рукой резервную побитовую
копию системы. В случае компрометации ядра восстановление не займет в
таком случае много времени. Только полная переустановка ОС и возврат
ее в исходное состояние могут давать гарантии надежной работы
компьютера.
Список литературы.
1. Брайан Хатч, Джеймс Ли, Джордж Курц. Секреты хакеров. Безопасность
Linux-готовые решения.- Пер. с англ. - М.: Издательский дом
<<Вильямс>>, 2004.
2. Стивен Норткат, Джуди Новак. Обнаружение нарушений безопасности в
сетях. Пер. с англ. - М.: Издательский дом <<Вильямс>>, 2003.