Для зарегистрированных пользователей |
|
Информационная безопасность |
Возможности rootkit и борьба с ними
Юрий Машевский, Алексей Монастырский, Константин Сапронов
Одной из самых больших проблем для авторов вредоносных программ всегда была невозможность длительного сохранения присутствия стороннего кода в системе незаметным для пользователя, а в идеале - и для антивирусных средств. В последнее время, когда написание вредоносного программного обеспечения превратилось из занятия «для души» в прибыльный, хотя и криминальный бизнес, задача «сокрытия следов» становится особенно актуальной для хакеров-бизнесменов. Каким же образом можно скрыть программу, ворующую банковские реквизиты, или нелегальный прокси-сервер, предназначенный для рассылки спама, от хозяина компьютера?
Современные киберпреступники решают эту проблему точно так же, как ее решали «киберхулиганы» 10-15 лет назад. Одним из первых известных вирусов для PC был Virus.Boot.Brain.a - загрузочный вирус, который перехватывал системные функции доступа к диску и при чтении загрузочного сектора (например, антивирусной программой) подставлял на место зараженных оригинальные данные. Со временем те же самые stealth-механизмы (перехват системных функций и подмена возвращаемых ими данных) стали использоваться в Windows-вирусах (Virus.Win32.Cabanas.a).
В мире UNIX вредоносные программы пока не получили такого распространения, как в DOS и Windows, однако именно оттуда пришел термин rootkit, который сейчас часто используется для обозначения stealth-технологий, применяемых авторами троянских программ под Windows.
Изначально термин rootkit - это набор программ, позволяющих хакеру закрепиться на взломанной машине и предотвратить свое обнаружение. Для этого подменяются системные исполняемые файлы (login, ps, ls, netstat и т.п.) или системные библиотеки (libproc.a), либо устанавливается модуль ядра - все с той же целью: перехватить попытки пользователя получить истинную информацию о том, что происходит на его компьютере.
В последнее время использование rootkit-технологий для сокрытия присутствия вредоносного ПО становится все более популярным, что подтверждается ростом стабильным числа ежемесячно обнаруживаемых новых rootkit-программ (рис. 1):
Рис. 1. Рост частоты использования rootkit-технологий во вредоносном ПО.
Рост популярности rootkit связан с открытым распространением в интернете исходных кодов многих rootkit, что позволяет любому вирусописателю без особого труда создавать свои собственные модификации. Еще один аспект, способствующий распространенности rootkit, заключается в том, что большинство пользователей ОС Windows работают под правами администратора, что в значительной степени облегчает успешную инсталляцию rootkit на пользовательские компьютеры.
Невидимость для пользователя и невозможность обнаружения антивирусами вполне открыто рекламируется как вирусописателями-нелегалами, так и разработчиками так называемого «легального» шпионского ПО.
Рассмотрим подробнее сложившуюся ситуацию отдельно для Windows и UNIX.
Rootkit-технологии для Windows
Сокрытие присутствия в системе
В настоящее время используемые rootkit методы сокрытия присутствия в системе можно разделить на две группы:
- модификация пути выполнения обработчиков;
- модификация системных структур.
Данные методы используются для сокрытия сетевой активности, ключей реестра, процессов, т.е. всех тех особенностей, который в той или иной мере позволяют пользователю обнаружить у себя на компьютере вредоносную программу.
Первый метод сокрытия информации может быть реализован как для режима пользователя, так и для режима ядра. Практическую реализацию для режима пользователя отличает сравнительная простота. Чаще других для модификации пути выполнения обработчиков здесь используется способ, основанный на перехвате вызов API-функций (рис. 2):
Рис. 2. Перехват обращений к API-функциям.
Данный способ основан на использовании особенности вызовов системных API-функций, которые производятся приложениями либо через специальные области данных (таблицы импорта/экспорта), либо обращением через полученный с помощью API-функции GetProcAddress адрес. Программный код реализуется в DLL-модулях, которые затем внедряются в адресные пространства существующих в системе процессов, что дает злоумышленнику возможность контролировать все пользовательские приложения. Рассмотренный процесс модификации пути выполнения обработчиков хорошо документирован и прост в реализации, что облегчает его использование в rootkit.
Но вместе с этим преимуществом подобная реализация, как и другие реализации rootkit пользовательского режима, обладает существенным недостатком - низким качеством сокрытия информации. Это означает, что присутствие в системе rootkit пользовательского режима без труда можно обнаружить с помощью специализированных утилит. Именно этой причиной обусловлен отмеченный в последнее время рост интереса к rootkit-технологиям режима ядра, несмотря на более высокую сложность их разработки.
Рассмотрим методы, используемые rootkit режима ядра, которые обладают несравнимо более высоким качеством сокрытия информации. Подавляющее большинство rootkit режима ядра используют недокументированные структуры операционной системы. Например, широко используется перехват обработчиков из таблицы KeServiceDescriptorTable, количество сервисов в которой может изменяться от версии к версии операционной системы, что заставляет разработчиков rootkit прибегать к проведению дополнительного анализа системного кода для определения указателей на обработчики в вышеупомянутой таблице. По принципу реализации данный подход очень напоминает перехват API-функций.
Примером использования метода модификации системных структур является изменение системного списка PsActiveProcessList. Этот подход использует rootkit FU (детектируется Антивирусом Касперского как Rootkit.Win32.Agent.l), что позволяет скрыть любой процесс от просмотра его большинством системных утилит (рисунки 3, 4).
Рис. 3. Список процессов до запуска rootkit.
Рис. 4. Список процессов после запуска rootkit.
Из рисунка 3 видно, что запущенный текстовый редактор Notepad виден в списке активных процессов под именем notepad.exe (имя обведено красной линией). Снимок экрана, приведенный на рисунке 4, сделан после запуска rootkit FU с командой сокрытия процесса. Из рисунка видно, что при активном редакторе, его имя пропало из списка активных процессов (отмечено красной стрелкой).
Обнаружение rootkit
В противостоянии rootkit и средств их обнаружения первые всегда будут впереди. Подобная ситуация обусловлена постоянным появлением новых rootkit-технологий и неминуемой необходимостью их анализа разработчиками антивирусного ПО для создания средств обнаружения. Но, несмотря на кажущуюся сложность обнаружения rootkit, эффективные методы уже разработаны и реализованы в следующей версии наших антивирусных продуктов, которая сейчас проходит тестирование в стенах «Лаборатории». Рассмотрим реакцию нашего продукта на появление в системе вышеприведенного rootkit FU.
Итак, результатом работы rootkit стало сокрытие наличия в системе процесса. Антируткит-подсистема обнаруживает данный факт и выводит пользователю соответствующее предупреждение (рис. 5):
Рис. 5. Обнаружение неизвестных скрытых процессов.
Разработанная подсистема позволяет определять наличие на компьютере пользователя не только уже внесенных в антивирусные базы rootkit-программ, но и еще неизвестных, что и показано на рисунке 5.
В программе имеется аналогичная подсистема для детектирования rootkit пользовательского режима, которые используют внедрение DLL в другие процессы.
В этом случае реакция подсистемы защиты заключается в уведомлении пользователя о том, что конкретный процесс пытается внедрить код в чужое адресное пространство (рис 6):
Рис. 6. Обнаружение внедрения кода в чужое адресное пространство.
Rootkit-технологии для UNIX
Сокрытие присутствия в системе
Ситуация в UNIX очень напоминает ситуацию в мире Windows. Атакующий устанавливает rootkit на компьютер после того, как был получен привилегированный доступ - root. Права root, необходимые для инсталляции подавляющего большинства rootkit, можно получить с помощью использования известных уязвимостей, если злоумышленник имеет доступ в систему с правами обычного пользователя. В этом случае он может использовать локальный эксплойт или утилиты для взлома базы с паролями. Если злоумышленник не имеет соответствующих прав, то для проникновения в систему он может использовать удаленный эксплойт или, например, сниффер для перехвата паролей. Подобный перехват паролей возможен для целого ряда служб (ftp, telnet и др.) по причине того, что они осуществляют передачу паролей по сети в открытом виде.
В зависимости от предоставляемых возможностей rootkit может содержать различные вредоносные программы (Trojan-DDoS, Backdoor и прочие), которые устанавливаются на взломанный компьютер и ожидают команд от атакующего. Кроме того, rootkit могут содержать заплатки, которые закрывают уязвимости в защите системы с целью предотвращения повторного проникновения со стороны другого атакующего.
Также как и в Windows, в UNIX имеются и rootkit уровня приложений, и rootkit уровня ядра.
Рассмотрим уровень приложений. Как правило, подобные rootkit состоят из «троянизированных» версий обычных программ, скрывающих присутствие своих компонент в системе, и бэкдора, предоставляющего скрытый доступ в систему. Примерами rootkit уровня приложений являются lkr, trOn, ark и др.
Продемонстрируем работу rootkit уровня приложений на примере tr0n. Для сокрытия своего присутствия в системе данный rootkit выполняет целый ряд действий: в момент инсталляции он останавливает syslogd-демон, затем подменяет своими троянскими версиями следующие системные утилиты du, find, ifconfig, login, ls, netstat, ps, top, sz. Кроме того, в систему добавляется троянская версия sshd-демона. В завершение, в фоновом режиме запускается sniffer, в inetd.conf добавляется запуск telnetd-, rsh-, finger-демонов, перезапускается inetd и снова стартует syslogd.
Обычно tr0n располагается в /usr/src/.puta, но благодаря установленной ранее троянской версии утилиты ls, этот каталог невидим.
Перейдем к rootkit уровня ядра. Rootkit этого типа предоставляют все возможности предыдущего типа, но на более низком уровне - rootkit уровня приложений должны модифицировать отдельные бинарные файлы, rootkit уровня ядра должны изменить только ядро, что значительно увеличивает «качество» сокрытия информации.
Существует несколько способов внедрения rootkit в ядро системы UNIX:
- Использование LKM. Ядро linux, как и ядра многих других ОС, способны загружать модули (или драйверы устройств) «на лету», что позволяет злоумышленнику изменить системные вызовы ядра и тем самым выдавать некорректную информацию (например, исправленный список файлов). Использование подобного приема можно предотвратить, если скомпилировать монолитное ядро без поддержки LKM, но такое решение имеет существенный недостаток - необходимость включения в ядро всех нужных драйверов.
- Запись в /dev/kmem, который предоставляет доступ к занятой ядром области памяти. Запись в /dev/kmem переписывает ядро «на лету». Таким образом, для изменения ядра необходимо лишь найти нужное место в памяти, но это решаемая проблема. Существует исправление, запрещающее записывать в /dev/kmem напрямую. Также это можно сделать через mmap.
- Заражение существующих модулей. Отличие от первого способа заключается в том, что rootkit не содержит своего отдельного модуля и использует внедрение в уже существующие. Применение данного подхода позволяет сделать rootkit устойчивым к перезагрузке, поскольку чаще всего заражаются модули, которые будут загружены ОС в любом случае (например, драйвер файловой системы).
Обнаружение rootkit
К сожалению, нельзя дать универсальных рекомендаций по обнаружению rootkit, но приведенные ниже действия позволят обнаружить большинство современных rootkit для UNIX:
- Исследование аномального поведения файлов, использования сети, запуска задач по расписанию и в момент загрузки, регистрационных записей пользователей.
- Использование утилит, которые помогают выявить присутствие rootkit в системе: Saint Jude, Chrootkit, RkScan, Carbonite, Kstat, Rootkithunter, Tripware, Samhain и др.
Заключение
Все рассмотренные способы обнаружения активных rootkit для Windows используют факт внесения ими при работе тех или иных «возмущений» в систему. Именно этим пользуется наш новый продукт, позволяющий эффективно обнаруживать даже неизвестные rootkit. Более того, в новых версиях Windows жизнь разработчиков rootkit будет еще более усложнена, т.к. последние версии этой ОС запрещают вносить изменения в системный код и системные структуры. Этот шаг разработчиков позволит на какое-то время снизить темпы появления новых rootkit для последних версий ОС Windows.
Значительное превосходство количества вредоносного кода для Windows по сравнению с UNIX в настоящее время обусловлено большей распространенностью первой. В случае роста популярности UNIX ситуация будет постепенно меняться - появятся как новые rootkit для UNIX, так и методы борьбы с ними.
В заключение отметим, что наиболее эффективная защита от rootkit - превентивная.
|