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

Источник: itspecial

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

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

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

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

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

Обзор

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

Все зловреды делятся на две большие группы - это 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. Таким образом, предложенный в статье метод не панацея, и является лишь одной из возможных частей комплекса по обнаружению и противодействию руткитам.


Страница сайта http://test.interface.ru
Оригинал находится по адресу http://test.interface.ru/home.asp?artId=20385