Борьба с Ring0 троянами

Оригинальный способ противодействия зловредному программному обеспечению на рабочих местах.

Одной из задач для специалиста по IT-безопасности является своевременный поиск и выявление троянских программ на компьютерах пользователей. В этой статье мы рассмотрим оригинальный способ выявления и удаления RING0 троянов без использования дорогостоящих программных комплексов и привлечения сторонних специалистов.

Теневая IT-коммерция

По данным экспертов, в 2006 году теневой доход, полученный в результате незаконной деятельности в сфере IT, превысил аналогичные показатели в сфере сбыта наркотиков. Основными подвигами этой отрасли является незаконная реклама в виде рассылки спама и атака определенных сетевых ресурсов. Поскольку для решения этих задач требуются большие вычислительные мощности, хакеры придумали, каким образом можно нелегально брать в аренду чужие компьютеры. Для этого создаются так называемые бот-сети (трудно представить, что всего 4-6 лет назад о них знали только избранные). Эта сеть состоит из серверов и клиентов (впрочем, и те и другие представляют собой пользовательские компьютеры, пораженные соответствующими зловредами).

Технологическая цепочка

Заказчик платит деньги за аренду сети под рассылку спама или атаки на сетевой ресурс; 
Хакер устанавливает на серверы задачу; 
Каждый клиент периодически соединяется с сервером, чтобы получить новую работу или обновления трояна. 

Обзор


Чтобы эффективно бороться со зловредным программным обеспечением, нужно немного представлять основные принципы их работы.

Все зловреды делятся на две большие группы – это ring3 и ring0 трояны, в виде программы или драйвера соответственно.

Про ring3 трояны мы говорить не будем, поскольку они уже давно побеждены антивирусами, файрволами, проактивными защитами или просто умелыми руками. Практический же интерес составляют трояны-драйверы (далее – просто трояны), поскольку, работая на уровне ядра, они имеют самые высокие привилегии. Антивирусы, файрволы и проактивные защиты тоже имеют свои драйверы, но хакер заранее может найти слабые места этих программных продуктов и заложить соответствующие алгоритмы поведения в своего зловреда.

В настоящее время мы являемся свидетелями постоянной борьбы между хакерами, открывающими дырки, и производителями ОС или анти-троянского ПО.

Сейчас существует огромное количество анти-троянов (как платных, так и бесплатных), но воз и ныне там. Логично предположить, что рано или поздно должен был найтись достаточно универсальный и надежный способ, и такой способ нашелся!

Алгоритм действия

Попадая в систему, зловредный программный продукт прежде всего должен обеспечить свою загрузку при рестарте системы. Для этого он создает запись в специальном разделе реестра – [HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services].

Каждая запись имеет следующий формат:

DisplayName 
Экранное имя, отображаемое служебными приложениями на экране. Этот параметр необязателен. При его отсутствии именем считается имя подраздела.

ErrorControl 
Определяет, каким образом реагировать на ошибки.

ImagePath 
Путь к исполняемому файлу драйвера или службы.

Для драйверов не обязательно указывать значение этого параметра, но тогда файл драйвера должен находиться в каталоге \%SystemRoot%\System32\Drivers.

Start 
Указывает, как нужно запускать драйвер. 
Значение 2 – драйвер запускается автоматически на этапе загрузки системы. 
Значение 3 – драйвер запускается по требованию.

Type 
Определяет тип службы. 
Значение 1 обозначает драйвер.

Разумеется, троян, так наследивший при установке, обязательно должен сокрыть факт своего присутствия, спрятав запись реестра и файл драйвера на диске. Для реализации этого он перехватывает функции ядра и при каждом вызове этих функций эмулирует отсутствие скрываемых объектов. В современном представлении трояна, технологии сокрытия имеют один из самых важных аспектов. Эти технологии носят название rootkit. Обнаружив действие руткита, можно со 100% гарантией говорить и о наличии в системе трояна. Стереотипом обнаружения руткитов в анти-троянском ПО является проверка целостности кода ядра системы и легальности стека вызовов функций. Мы же пойдем другим путем! Мы будем получать информацию раздела реестра описания драйверов с помощью операционной системы и с помощью утилит, которые не используют функции ОС для работы реестра, а потом будем сравнивать эту информацию. Если она различается – мы нашли руткит!

Практика


Как мы уже говорили, самое слабое место трояна – это загрузка. Троян обязан прописать себя в реестре в разделе драйверов, иначе он просто не загрузится при следующем старте системы. Именно здесь мы и будем его ловить, сравнивая два дампа реестра.

Первый дамп мы сделаем стандартными средствами ОС, а точнее, с помощью встроенного в Windows редактора реестра regedit.

Второй дамп мы сделаем утилитой, которая читает реестр непосредственно из файла, при этом не обращаясь к функциям ОС. Если какой-то драйвер скрывает свое присутствие, при сравнении вылезут расхождения, а каждое расхождение – это скрытый драйвер.

Технология состоит из следующих этапов:

1. С помощью встроенного в Windows редактора реестра regedit мы экспортируем раздел реестра         [HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services]

2. Копируем файл реестра (%windir%\system32\config\system). Поскольку все файлы реестра заблокированы и недоступны для каких бы то ни было действий, мы будем использовать утилиту RegCopy.exe, которая считывает файл реестра по кластерам, обращаясь к диску напрямую, минуя стандартные функции ОС.

3. С помощью утилиты RegView мы открываем этот файл и делаем еще один экспорт этой ветки реестра.

4. Сравниваем два файла. Поскольку сравнивать эти файлы вручную очень сложно, я написал утилиту для их сравнения – RegistryCompare.exe. Чтобы воспользоваться ей, дампы п1 и п3 нужно назвать orig.reg и raw.reg соответственно, и лежать они должны в папке с исполнимым файлом программы. Сравнивать эти файлы вручную крайне сложно, я написал утилиту для их сравнения – RegistryCompare.exe

Практиковаться мы будем на рутките Unreal.a (многие трояны используют его модификации для сокрытия в реестре и на диске).

Итак, запускаем руткит.

Далее копируем файл реестра, запустив RegCopy.exe. Теперь с помощью RegView делаем экспорт нужной ветки, нажав F2 и не забыв назвать файл именем raw.reg. Остается сделать то же самое с помощью regedit и запустить RegistryCompare.exe.

Поиск завершен

Вот так, произведя несколько несложных действий, мы можем свести на нет могучие усилия высококвалифицированных rootkit-developerов. Весьма вероятно, что со временем программисты могут многое придумать для обхода этого метода. Тем не менее, и наши ответные действия не ограничены представленным алгоритмом – например, пункты 2-4 можно выполнить на другой ОС (переставив HDD на другой ПК) или загрузиться с параллельно установленной ОС, а 1 пункт выполнить на системе с трояном. Проверяя реестр на другой ОС, нам теперь не надо копировать его с помощью специальных утилит, поскольку файл не заблокирован – т.е. 2 пункт выполняем вручную.

МНЕНИЕ РЕДАКЦИИ

Лозовский Александр, редактор рубрики БЕЗОПАСНОСТЬ

Читателю, знакомому с ситуацией на антивирусном рынке образца середины 90-х годов этот способ наверняка напомнит в чем-то аналогичную ситуацию с принципом работы антивирусного ревизора ADInf:

Так как стелс-вирусы перехватывают обращения к дисковой подсистеме компьютера и скрывают присутствие вируса, ADinf считывает информацию с диска, минуя операционную систему. Для чтения диска ADinf обращается непосредственно к соответствующей функции BIOS, записанной в ПЗУ компьютера. В этом случае вирус не может перехватить обращение к диску, и ADinf получает достоверную информацию.

Как видите, прошло уже более 10 лет, и зловредное программное обеспечение из неких активно скрывающихся и противодействующих обнаружению произведений искусства, показывающих мастер-класс своего создателя, превратилось в мощное орудие для незаконного заработка денег, а принципы их поиска остались в чем-то похожими.

Мнение эксперта

Deeoni$, программист в сфере IT-безопасности

На данный момент нет средств, дающих 100% гарантию от проникновения руткитов в систему. Метод, описанный в данной статье, конечно, позволяет обнаружить большинство модулей, загружаемых в ядро ОС, но, прибегнув к небольшой хитрости, загрузка драйвера уже не будет прописана в ключе HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services. Например, можно прописать программу-загрузчик драйвера в ключ HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run, которой будет создавать нужный ключ для подгрузки драйвера, загружать его, а потом сразу же удалять этот ключ. Драйвер в свою очередь уже будет скрывать параметр в ключе Run. Есть еще более радикальный метод – зашифровать файлы реестра и расшифровывать их только при обращении к ним доверенных приложений. Данный трюк исключает возможность доступа к реестру из другой ОС.

Помимо документированного способа загрузки модулей режима ядра (через реестр), есть множество хакерских способов, доступных из-за ошибок в коде Windows. Таким образом, предложенный в статье метод не панацея, и является лишь одной из возможных частей комплекса по обнаружению и противодействию руткитам.