Рубрика:
Безопасность /
Угрозы
|
Facebook
Мой мир
Вконтакте
Одноклассники
Google+
|
Артем Баранов
Растущая угроза: руткиты Win32
Для хакеров и вирусописателей во все времена был актуален вопрос, как сделать работающий код, файл на диске или раздел реестра невидимым для программ, работающих в системе. Решение этого вопроса пришло из мира UNIX и называется rootkit.
Под руткитом понимается технология, используя которую, можно скрыть в системе что угодно, в том числе работающий процесс, файл на диске, раздел реестра. Применяя такую технологию, хакер может скрыть раздел в реестре, куда записался бэкдор или работающий клиентский модуль трояна. С появлением такой технологии в Windows у администраторов начались головные боли. Вы сможете гораздо эффективнее решить проблему, если будете понимать, как устроены руткиты, для чего они нужны, с помощью чего можно их удалять и как это делать вручную. В статье рассмотрены руткиты для Windows NT 5 (Windows 2000, 2003 Server, XP).
В Windows существует два вида руткитов, различных в схеме работы и устройстве. Первые, руткиты пользовательского режима, функционируют на третьем кольце х86. Вторые, руткиты режима ядра, функционируют на нулевом кольце или на уровне ядра NT.
Руткиты пользовательского режима
Руткиты пользовательского режима легче в реализации, чем руткиты режима ядра. Первые в свою очередь можно разбить на две группы. К одной относятся руткиты, которые являются троянскими программами и заменяют настоящие приложения. Например, если для отображения процессов используется tlist.exe из Resource Kit, то можно написать свою tlist.exe, например с использованием Psapi или библиотеки Tool Help, скрывающую имя конкретного процесса и подменить ею настоящую tlist.exe. Недостаток такого подхода очевиден. Кому захочется заново написать диспетчер задач Windows для скрытия определенного процесса. Второй тип руткитов 3-го кольца отличается от первого техникой реализации. Руткиты, относящиеся ко второму типу, используют общий принцип функционирования, именуемый перехватом API-вызовов. Он был описан Дж. Рихтером в его монографии «Windows для профессионалов» и М. Питреком «Секреты системного программирования в Windows 95». Этот тип также может быть разбит на два. К первому следует отнести руткиты, перехватывающие вызовы DLL подсистемы окружения Win32 (Kernel32, Advapi32, User32, Gdi32). Ко второму типу относятся руткиты, перехватывающие недокументированные «родные» API (Native API) в Ntdll.dll. Напрашивается вопрос, зачем перехватывать недокументированные API, если можно перехватить «обычные». Дело в том, что некоторые стандартные программы Microsoft, например диспетчер задач (task manager), для получения статистики используют не обычные API, а недокументированные. Тот же диспетчер задач использует для получения списка процессов не что-то вроде Psapi, а функцию NtQuerySystemInformation, которая хоть и документирована в последних SDK, но далеко не полностью. Изучая лишь SDK по этой функции, можно долго недоумевать, как диспетчер задач получает с помощью нее информацию о процессах. Полное описание этой функции вы можете увидеть в книге Г. Неббета «Справочник по базовым функциям API Windows NT/2000». Очевидный недостаток такого руткита заключается в том, что он реализован с использованием структур, которые могут быть изменены в следующей версии Windows. По вышесказанному следует сделать несколько замечаний. Во-первых, руткиты для Windows распространяются очень быстро. Поэтому говорить о том, что что-то является недокументированным, бессмысленно, т. к. хакеры уже давно дизассемблировали код Kernel32.dll и Ntdll.dll и опубликовали свои соображения на этот счет. Во-вторых, перехват API-вызовов на уровне Ntdll.dll дает некоторые существенные преимущества. Дело в том, что все библиотеки, получающие информацию о процессах, типа Psapi, обращаются в конечном счете к одной точке входа в Ntdll.dll, которая предоставляет неисчерпаемую системную информацию – NtQuerySystemInformation.
Руткиты режима ядра
Руткиты режима ядра, как уже упоминалось, функционируют на уровне ядра NT и более сложны в реализации. В их основу положен тот же механизм перехвата API-вызовов, но уже на уровне ядра. С использованием таких руткитов можно модифицировать как само ядро, так и объекты ядра. Учитывая, что устройство объектов ядра является полностью недокументированным, можно смело сказать, что далеко не каждый профессионал в Win32 может разработать такой руткит. Хорошей отправной точкой в этом послужит книга С. Шрайбера «Недокументированные возможности Windows 2000». По сути, руткиты режима ядра представляют собой драйверы, загруженные в период работы Windows. Механизм перехвата API-вызовов на уровне ядра впервые был предложен М. Руссиновичем и Б. Когсвелом, авторами sysinternals.com. Он базируется на подмене адресов в таблице диспетчеризации системных сервисов на свои обработчики, например, на адреса функций драйвера. Перед тем, как менять адреса, руткит сохраняет настоящие адреса системных сервисов в своем буфере. Когда ядро обрабатывает системный сервис, это приводит к активации не настоящей функции, а троянской (т.е. функции драйвера), та в свою очередь вызывает настоящий сервис по сохраненному адресу и фильтрует результат. Основное преимущество таких руткитов в том, что они независимы от процессов, а точнее от их виртуальных адресных пространств. Теперь о недостатках руткитов режима ядра. Как известно, разработка кода режима ядра сама по себе довольно сложна и налагает определенные ограничения. Одна малейшая ошибка в коде, например появление жучка или необработанного исключения, повлечет крах всей системы. Кроме того, разработка такого руткита очень сложна, требует понимания устройства и работы самой системы.
Хотя руткиты пользовательского режима могут воздействовать только на процесс, для которого они предназначены, существуют методы, позволяющие руткиту работать «глобально». Например, руткит может поражать вновь создаваемые процессы. Как только система создаст новый процесс, руткит сможет узнать об этом, используя системный сервис для перечисления процессов. Затем руткиту нужно остановить все потоки в новом процессе и попытаться модифицировать таблицу импорта или переписать первые байты перехватываемой функции. Другой способ заключается в следующем. В реестре существует раздел HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows с параметром AppInit_DLLs. Система автоматически загружает DLL, указанные в этом параметре.
Этапы обработки API в Win32 и места внедрения руткитов
Руткиты режима ядра не являются «полноценными» драйверами устройств, т.к. никакими устройствами они не управляют. Но все же драйверами называться могут. Об этом говорят Руссинович и Соломон в книге «Inside Windows NT», что драйверы пишут не для управления устройствами, а только для внедрения кода, функционирующего в режиме ядра. Аналогичный подход использует программа Руссиновича Regmon (Registry Monitor), которая отображает обращения к системному реестру. Она запускает драйвер во время своего выполнения, тот получает доступ к таблице диспетчеризации системных сервисов и модифицирует ее на свои обработчики. Затем, когда какой-то процесс вызывает сервис реестра, управление получает установленная ловушка, которая в свою очередь вызывает настоящий сервис реестра, запоминает возвращенные данные в буфере, а затем приложение забирает их по IOCTL и выводит. (Подробности см. в книге Руссиновича, Соломона «Внутреннее устройство Microsoft Windows: Windows XP, Windows 2003 Server, Windows XP».)
Чтобы наглядно представить себе вышеприведенную информацию, на рис. 1 показаны этапы диспетчеризации (обработки) системного сервиса в Win32. Изображен поток, пишущий данные в файл, и два руткита: 3-го и 0-го кольца. Также изображены возможные точки проникновения руткитов. Что касается руткита пользовательского режима, то он может внедряться тремя способами:
- Внедрение в работающий процесс путем модификации таблицы импорта в образе EXE-файла. Так перехватываются вызовы DLL, которые связаны неявно с EXE-файлом.
- Модификация первых слов перехватываемой функции на инструкцию jmp, в DLL подсистемы Win32. Если DLL связывается с процессом явно (в периоде выполнения).
- Модификация первых слов перехватываемой функции на инструкцию jmp в Ntdll.dll. Аналогично второму.
Руткит 0-го кольца внедряется путем перезаписи адреса в таблице диспетчеризации системных сервисов.
Помимо перехвата API-вызовов можно использовать стандартные возможности режима ядра, которые применяют антивирусы. Например, драйвер фильтра файловой системы, позволяющий просматривать обращения к файловой системе и модифицировать их. В Windows XP появилась возможность регистрировать функции драйвера у диспетчера конфигурации для перехвата сервисов реестра и их возможной модификации.
В Windows процесс должен иметь права на загрузку драйвера в систему. То есть процесс должен иметь в маркере доступа активированную привилегию SeLoadDriver или иметь право ее активировать в маркере доступа.
Владея технологией rootkits, администратор может, используя специальное ПО, своевременно выявлять руткиты и удалять их из системы, а также использовать их в мирных целях, скрывая необходимые данные от пользователей. Хотя использование rootkit-технологий – это палка о двух концах. Еще не утихли страсти вокруг скандала с Sony BMG, которая использовала свой руткит в мирных целях, скрывая свои программные DRM-компоненты. Но руткит Sony способствует очень частому появлению BSOD (Blue Screen Of Death) и замедлению работы системы. Кроме того, эта история имела печальные последствия. Как известно, после появления руткита Sony в Интернет был выпущен backdoor, использующий этот руткит для сокрытия своего кода на диске. В скандале вокруг Sony BMG участвовал Руссинович, который указал, что Symantec и Kaspersky Lаb используют в своих продуктах технологии, близкие к rootkit. Например, антивирус Касперского использует технологию iStreams. Технология позволяет уменьшить время сканирования за счет создания в файлах на NTFS-томах дополнительных потоков для хранения контрольных сумм. Так как эта информация важна для работы антивируса, он скрывает эти потоки, что очень похоже на rootkit-технологию.
Руткиты, по сути, являются растущей угрозой, т. к. количество их неуклонно растет. Хакеры и вирусописатели используют их для скрытия кода и файлов в системе. Администраторы должны своевременно их обнаруживать.
Если в системе предположительно живет руткит пользовательского режима, скрывающий что-либо, то можно написать программу, получающую информацию аналогично той, которую скрывает инфицированная руткитом программа, и сравнить результаты, полученные ими. Если руткит сидит на уровне ядра, то можно воспользоваться средством, разработанным Руссиновичем, – RootkitRevealer для удаления руткита. Скачать можно с www.sysinternals.com.
Ресурсов и книг, посвященных теме руткитов немного. Вообще же эта тема охватывает многие аспекты системного программирования для Win32. На сегодняшний день существует единственная книга, пока не выпущенная на русском языке – Hoglund, Butler «Rootkits. Subverting the Windows Kernel». Существует также ресурс, посвященный руткитам – www.rootkit.com. На нем размещено достаточно информации о руткитах, в том числе выложен исходный код некоторых из них. Также там можно найти наиболее функциональный на сегодняшний день руткит – Hacker Defender. И конечно, всем известный сайт по продвинутому системному ПО для Windows – www.sysinternals.com, где Руссинович рассматривает технологию руткитов.
Facebook
Мой мир
Вконтакте
Одноклассники
Google+
|