Скрытая угроза - найти и уничтожить

В последние годы распространение разнообразных вредоносных программ - вирусов, троянских коней, программ-шпионов - приобрело масштабы эпидемии. Согласно статистике, компьютер с Windows XP SP1 без последних исправлений безопасности при подключении к Internet и простой загрузке файлов или просмотре определенных Web-страниц в течение нескольких минут рискует оказаться зараженным. Конечно, средства защиты от вредоносных программ постоянно совершенствуются, на рынке появляются заслуживающие доверия антивирусы, средства борьбы с программами-шпионами, брандмауэры; свой вклад вносят и пакеты исправлений, выпускаемые по мере обнаружения слабых мест. Но технологии под названием root kit угрожают изменить расстановку сил в противостоянии вредоносного кода и средств защиты. Root kit позволяет настолько искусно скрывать отдельные объекты, что обнаружение и удаление вредоносного кода может оказаться делом исключительно сложным или просто невозможным.

Термин root kit применяется для описания различных способов и технологий маскировки кода. Если вредоносная программа применяет root kit, она может стать невидимой для антивирусных систем и диагностических инструментов типа Task Manager. Данная статья посвящена основным технологиям, используемым root kit для маскировки, а также способам обнаружения присутствия root kit и средствам борьбы с этой напастью.

Растущая угроза

Средства root kit известны с начала 90-х, но в то время они применялись исключительно против операционных систем семейства UNIX. Ситуация изменилась в конце десятилетия, когда сообщества хакеров начали исследовать возможности применения технологий root kit против Windows. Тогда некоторые программисты опубликовали собственные наборы для создания root kit, которые могли быть расширены и дополнены другими разработчиками. Некоторые из этих пакетов настолько просты в использовании, что автору вредоносной программы достаточно внести минимальные изменения в файл настройки root kit и включить его в свой дистрибутив.

Сегодня каждый может зайти на сайт www.rootkit.com - это одно из наиболее известных мест, посещаемых как разработчиками, так и противниками root kit. Причем на поверку иногда оказывается, что автор средства борьбы с root kit использует свою разработку для распространения собственного root kit. В числе опубликованных на Rootkit.com пакетов можно найти наиболее известные - Vanquish, FU, Afx Rootkit 2005, NT Rootkit и Hacker Defender.

Учитывая доступность root kit для всех желающих, остается только удивляться, что еще не все хакеры используют это средство для маскировки своих вирусов. Еще более удивительно, что root kit пренебрегают разработчики шпионских и других вредоносных программ, которые благодаря этой технологии могли бы стать абсолютно невидимыми. Подразделение обслуживания и поддержки пользователей Microsoft CSS (MS Customer Service and Support - новое подразделение, включившее в себя Microsoft Product Support Services) и антивирусные компании иногда сообщают об обнаружении подобных пакетов, установленных на компьютерах клиентов, но случается это достаточно редко.

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

Основы root kit

Ранние средства root kit представляли собой довольно немудреные программы, подменявшие некоторые основные системные утилиты собственными версиями, которые скрывали вредоносные программы и процессы. Например, известна версия из набора root kit популярной утилиты ps, служащей для просмотра списка текущих процессов в UNIX. Версия ps из этого root kit не показывала имена «дополнительных» процессов, аналогично этому исправленная версия утилиты ls, предназначенной для просмотра содержимого каталогов, не показывала имена отдельных файлов и каталогов в общем списке.

По мере того как системные утилиты становились все сложнее, появлялись утилиты независимых разработчиков и антивирусные программы, применявшаяся в root kit техника простой подмены системных утилит уже не могла обеспечить желаемого результата. Что же касается Windows, то разработка утилит типа root kit для замены Task Manager, Tasklist и других программ, обычно используемых для просмотра списка выполняющихся процессов, потребовала бы значительных усилий со стороны автора root kit. Кроме того, подмена системных утилит не защищает root kit от обнаружения нескомпрометированными утилитами - антивирусными программами и другими утилитами просмотра списка процессов или любой программой, использующей прямой вызов к системному программному интерфейсу API.

Это вынудило разработчиков пакетов root kit искать более сложные решения, которые подменяют не отдельные приложения, а сами вызовы API, используемые всеми утилитами для получения необходимой информации. Перехватывая вызовы API, с помощью которых программы получают список активных процессов и могут обнаружить вредоносные программы, root kit скрывает себя не только от Task Manager, но и от всех программ обработки списков процессов, напрямую или опосредованно вызывающих API. Современные root kit используют перехват вызовов API для сокрытия файлов, каталогов, разделов и параметров реестра, служб Windows, драйверов устройств, портов TCP/IP, учетных записей пользователей и процессов - словом, любых объектов, в которых можно скрыть вредоносные программы. Благодаря root kit вредоносные программы могут получить полные права для управления зараженной системой.

Экран 1. Спрятанные Hacker Defender файлы

На экране 1 приведен пример работы распространенного root kit, известного под названием Hacker Defender. Hacker Defender состоит из файла настройки и исполняемого модуля. При запуске hxdef.exe скрывает файлы, каталоги, накопители, службы, процессы и порты TCP/IP, перечисленные в файле настройки. По умолчанию файл настройки скрывает все элементы, содержащиеся в hxdef. Поэтому после вызова hxdef каталог, содержавший root kit, кажется пустым.

В Windows имеется несколько уровней вызовов API, как видно из рис. 1. Различные root kit работают на разных уровнях API, в зависимости от целей и мастерства разработчика. API более высокого уровня лучше документированы и более доступны для подмены root kit, перехват API более низкого уровня позволяет более тщательно скрывать «добавленные» функции. Root kit, перехватывающий API более высокого уровня, может быть обнаружен при прямом вызове низкоуровневых функций API.

Если учетная запись пользователя, от имени которого произошел запуск root kit, имеет стандартные ограниченные права, то root kit может обеспечить маскировку относительно процессов, работающих с теми же правами. Если же запуск root kit произошел от имени учетной записи с правом отладки программ (Debug Programs privilege), то в этом случае root kit может менять все системные процессы, включая работающие от имени учетной записи Local System, в том числе антивирусы и антишпионские программы. Поэтому существование root kit является дополнительным основанием для того, чтобы придерживаться лучших практик и в повседневной работе обходиться без административных привилегий.

Самыми могущественными (и сложными для разработки) являются root kit, работающие в режиме ядра системы. Однако root kit уровня ядра системы должны требовать, чтобы программа работала с правами на установку драйверов устройств и, таким образом, при запуске от имени непривилегированного пользователя она не сможет сделать ничего (в отличие от root kit пользовательского уровня). Root kit уровня системного ядра требуют от разработчика глубоких знаний и экспертного кодирования, поскольку малейшая ошибка может привести к немедленному краху системы. А крах системы крайне нежелателен для разработчика root kit, поскольку его главная задача - делать свое черное дело незаметно.

Root kit уровня пользователя

API пользовательского уровня является самым высоким уровнем API в Windows. Этот уровень содержит основные вызовы операционной системы, которые описаны Microsoft в Platform Software Development Kit (SDK). Windows API для просмотра списка файлов используют вызовы FindFirstFile и FindNextFile, которые реализованы в динамической системной библиотеке windowssystem32kernel32.dll. Приложения типа Windows Explorer и интерпретатор командной строки, которые задействуют вызовы API для доступа к названным функциям, импортируют эти вызовы из kernel32.dll статически или динамически.

Загрузка DLL осуществляется только в тот момент, когда исполняемое приложение обращается к функции API, предоставляемой DLL. При статическом импорте API в тело исполнительного модуля загружаются ссылки на библиотеку DLL и функции API - эта информация содержится в разделе, называемом таблицей импорта, которая обрабатывается операционной системой при загрузке программы. Загрузчик загружает каждую DLL, перечисленную в таблице импорта, в адресное пространство процесса и подключает в образе ссылки на используемые функции (см. рис. 2).

Динамический импорт выполняется, когда исполняющийся процесс использует вызов функции Windows API LoadLibrary и Get ProcessAddress для получения от операционной системы адреса функции, которая экспортируется DLL. Утилита Dependency Walker, доступная для бесплатной загрузки с сайта http://www.dependencywalker.com, позволяет просмотреть список статических импортируемых и экспортируемых модулем функций, а также, запустив программу в режиме профилирования, определить динамически импортируемые функции. На экране 2 представлено, как Notepad импортирует функцию FindFirstFile.

Экран 2. Импорт функции FindFirstFile приложением Notepad

Один из основных методов маскировки, используемых многими root kit, - просмотреть таблицу импорта процесса и заменить вызовы ключевых системных функций собственными обработчиками, которые реализованы в виде отдельной DLL или в теле самого процесса. Эта технология перехвата называется DLL import hooking. После произведенного таким образом перехвата вызовов обращение из приложения к функциям FindFirstFile/FindNextFile вызывает выполнение кода root kit. Обработчик root kit вызывает в свою очередь исходную функцию в Kernel32, но, получив обратно управление после выполнения системной функции, проверяет возвращаемое значение и удаляет данные, относящиеся к скрываемым файлам и процессам. В случае динамического связывания root kit перехватывает системный вызов GetProcAddress и возвращает вызвавшей программе указатель на собственную функцию-перехватчик вместо той, которую вызывал пользовательский процесс. Эту технику, схематично представленную на рис. 3, использует root kit Vanquish.

Большинство функций Windows API для работы с файлами, памятью и процессами обращаются к функциям API нижнего уровня, которые экспортируются библиотекой windowssystem32 tdll.dll. Эта библиотека представляет собой интерфейс между приложениями, работающими в режиме пользователя, и функциями ядра системы. Task Manager использует предоставляемую ntdll.dll функцию NtQuery SystemInformation для просмотра списка исполняющихся процессов, так что root kit, стремящийся скрыть процесс, может перехватить этот вызов и исправить возвращаемое значение для удаления имен вредоносных процессов.

Упоминавшиеся ранее функции Windows для просмотра списка файлов обращаются в свою очередь к размещенной в ntdll.dll функции NtQueryDirectoryFile, так что манипулирование данными, возвращаемыми этой функцией, оказывает влияние на обращения к функциям FindFirstFile и FindNextFile. Root kit обычно перехватывают функции API верхнего уровня и стараются подменять вызовы ntdll.dll только в случае необходимости - обычно это проще, и большинство системных утилит сами обращаются только к функциям API верхнего уровня.

Root kit пользовательского уровня также модифицируют Windows API и API ядра в пользовательском режиме. Уже упоминавшийся Hacker Defender использует именно эту технику. Модификация заключается в записи кода root kit в целевой процесс и замене нескольких первых байтов изменяемой функции таким образом, что управление передается в код root kit. После того как root kit получает управление, вызывается исходная версия вызываемой функции, затем данные после соответствующей обработки возвращаются вызвавшему процессу.

Root kit уровня ядра

Более сложные root kit перехватывают вызовы API уровня ядра при обращении к операционной системе - эта техника называется «перехват системных вызовов» (system-call hooking). Функции ntdll вызывают системные вызовы для перехода в режим ядра, и в этом режиме происходит диспетчеризация выполнения запросов. Внутренние системные вызовы API идентифицируются по номерам, так что вызовы API ядра в пользовательском режиме указывают диспетчеру системных вызовов номер соответствующей функции ядра системы. Диспетчер использует этот номер в качестве индекса в таблице адресов системных функций. Подобно тому как происходит перехват вызовов к функциям в библиотеке DLL, root kit может заменить указатель на системную функцию собственным обработчиком (обычно это обработчик, расположенный в драйвере устройства, который вызывает исходную функцию и фильтрует возвращаемые значения). NT Rootkit использует перехват системных вызовов. Метод изменения вызываемой функции, применяемый Hacker Defender, может использоваться и в режиме ядра, но в настоящее время ни один из известных root kit не задействует этот метод для ядра.

Широкое распространение получила технология root kit для уровня ядра операционной системы, заключающаяся в прямом манипулировании объектами ядра. При этом методе атаки подменяются структуры данных ядра системы, а не API, которые возвращают информацию о структурах данных. Для сокрытия процесса, к примеру, root kit удаляет процесс из списка активных процессов, который поддерживается ядром системы. Таким образом, NtQuerySystem Information не может сообщить о наличии некоторых процессов, так как функция извлекает эти сведения из списка активных процессов, ядро же по-прежнему планирует передачу управления потокам исполнения, которые располагаются в процессе. Такой тип сокрытия также применяется к структурам драйверов устройств, но не может применяться для разделов реестра, параметров реестра, файлов и каталогов, поскольку указанные объекты не могут быть представлены в виде простых статических структур данных. Технику непосредственного изменения объектов ядра для маскировки применяет root kit FU.

Наконец, последний способ маскировки, применяемый root kit уровня ядра, — это драйвер фильтра файловой системы. Этот драйвер располагается поверх драйверов файловой системы (примером такого драйвера является драйвер NTFS), но под уровнем API системных вызовов. Таким образом, драйвер фильтра файловой системы может наблюдать всю работу приложения с файловой системой. Все срабатывающие по доступу к файлу антивирусные сканеры используют технологию фильтра файловой системы для перехвата операций открытия файла, таким образом, антивирус получает возможность сканирования запускаемого на исполнение файла перед тем, как передать ему управление.

NT Rootkit использует эту же технологию фильтра файловой системы для перехвата запросов к каталогу и удаления ссылок на файлы вредоносной программы до того, как результат запроса будет передан запросившему процессу от драйвера файловой системы. Таким образом, любой процесс, выполняющий запрос к файловой системе на просмотр оглавления каталога, будь то Windows Explorer или драйвер уровня ядра, получит данные, отфильтрованные NT Rootkit.

Сокрытие процессов

Наверное, одной из самых сложных форм маскировки является захват памяти, занимаемой уже выполняемыми процессами. Вредоносные программы, использующие эту технику (например, червь Code Red, поражающий Microsoft IIS), не нуждаются в том, чтобы скрываться от инструментов типа Task Manager. Но если вредоносная программа не записывает себя на диск перед выключением компьютера, она не восстановится в системе после очередной перезагрузки. Некоторые авторы вредоносных программ ставят необходимость избежать обнаружения выше, чем риск потерять контроль над захваченной системой после перезагрузки.

Предотвращение появления и обнаружение root kit

Лучше предотвратить заражение компьютера root kit, чем пытаться обнаружить и удалить root kit, уже проникший в систему. Предохранительные меры означают использование периметра безопасности, сочетающего антивирусные средства и антишпионские программы, брандмауэры и, главное, использование в повседневной работе учетных записей, которые не обладают административными правами. Если вы заподозрили, что компьютер заражен root kit, в первую очередь лучше подвергнуть его всем возможным проверкам. Современные антивирусы и антишпионы не обнаруживают root kit, но уже имеются специализированные программы поиска root kit, отладчики ядра и средства диагностики процессов, которые позволяют обнаружить многие root kit.

Все известные на сегодня root kit содержат уязвимые места в своей маскировке, которые могут использоваться детекторами для обнаружения присутствия root kit. Например, если root kit скрывает свое присутствие, маскируя файлы на уровне Windows API, его можно обнаружить приложением, которое использует API ядра для сканирования файловой системы. Хотя NT Rootkit является одним из самых совершенных известных root kit, он не манипулирует непосредственно объектами ядра. Таким образом, инструмент отладки ядра Microsoft Debugging Tools for Windows WinDbg (доступно для свободной загрузки по адресу http://www.microsoft.com/whdc/ddk/debugging) позволяет произвести проверку списка процессов в ядре и обнаружить посторонние вредоносные процессы, которые скрывает NT Rootkit, в том числе процесс драйвера устройства самого NT Rootkit.

Общая методика обнаружения присутствия root kit - подвергнуть компьютер исследованию со всех возможных точек зрения и на всех уровнях, а затем проанализировать полученные результаты. Любые несоответствия могут указывать на присутствие в компьютере root kit. То есть для обнаружения присутствия в системе замаскированных вредоносных процессов необходимо собрать результаты работы различных диагностических утилит, проанализировать результаты, предоставленные отладчиком ядра, и сопоставить полученные результаты. Относительно простой способ обнаружения замаскированных файлов - проверить содержимое каталогов в работающей системе Windows, затем загрузить заведомо «чистую» систему, вновь выполнить сканирование каталогов и сопоставить результаты двух проверок. Пользователи программы Microsoft Software Assurance (SA) могут воспользоваться средой Windows Preinstallation Environment (Windows PE), которая представляет собой загрузочный компакт-диск для запуска полнофункциональной среды Windows - идеальный вариант эталонной системы для такого сопоставления.

Команда Microsoft Research разработала инструмент под названием Strider Ghostbuster для автоматизации такого сравнения онлайновых и офлайновых данных. Во время подготовки статьи на сайте Strider (http://www.research.microsoft.com/rootkit) сообщили, что инструмент будет доступен в качестве прототипа для проверки систем или в качестве составного элемента других продуктов Microsoft. Пока Strider недоступен, можно воспользоваться приведенными на сайте указаниями для самостоятельной проверки системы на возможность заражения root kit.

В настоящее время по крайней мере одна антивирусная компания, F-Secure, выпустила бета-версию продукта для обнаружения root kit - это F-Secure Blacklight Rootkit Elimination Technology. Несомненно, скоро появятся и другие разработки в этой области.

Обнаружение с RootkitRevealer

Еще одна утилита обнаружения root kit, RootkitRevealer от Sysinternals, доступна для бесплатной загрузки по адресу http://www.sysinternals.com/ntw2k/ freeware/rootkitreveal.shtml. RootkitRevealer выполняет сравнение двух онлайновых сканирований системы, одно сканирование проводится с использованием Windows API верхнего уровня (см. рис. 1), а второе - на самом нижнем уровне - сырая файловая система и данные реестра. RootkitRevealer сообщает обо всех найденных несоответствиях, так что, если объект (файл или параметр в реестре) обнаруживается при низкоуровневом сканировании и невидим на более высоком уровне, это попадает в отчет. RootkitRevealer не выполняет сканирование памяти, поэтому не может обнаружить root kit, использующие для сокрытия методику прямого манипулирования объектами ядра и присутствующие только в оперативной памяти компьютера. Вместо этого Rootkit Revealer позволяет обнаруживать те root kit, которые сохраняют себя на диске и возобновляют работу после перезагрузки компьютера. На экране 3 показан экран Rootkit Revealer при сканировании системы, зараженной Hacker Defender.

Несоответствия, которые могут быть обнаружены RootkitRevealer, не обязательно свидетельствуют о наличии в системе root kit. Любые изменения, относящиеся к реестру или файловой системе, - создание, удаление и изменение файлов или параметров в реестре, которые могут произойти между сеансами сканирования с вызовами API верхнего и нижнего уровней, могут быть отражены RootkitRevealer как несоответствия. Например, служба Microsoft SQL Server периодически обновляет значения отметки времени (timestamp) в системном реестре, и это изменение будет включено в отчет Rootkit Revealer как несоответствие.

Другим типичным примером несоответствия являются параметры реестра, содержащие признак конца строки (символ с кодом 0) в имени. Такие имена не полностью видны для Windows API, поэтому параметры недоступны для редактирования в regedit. Поскольку эти разделы видны для API-ядра, некоторые приложения используют такие параметры для сокрытия лицензионных данных и другой важной информации. RootkitRevealer полностью показывает эти несоответствия, поскольку потенциально root kit может скрывать свой вредоносный код даже в небольших объемах данных.

Сокрытие root kit и вредоносных процессов от обнаружения Rootkit Revealer потребует от root kit спрятать структуры данных файловой системы и реестра, что выдаст присутствие процессов root kit. Многие из структур данных не документированы, и манипулировать ими таким образом, чтобы RootkitRevealer не обнаружил несоответствий, весьма затруднительно. В настоящий момент еще ни один известный root kit не достиг такого уровня совершенства.

Это, впрочем, не означает, что root kit не может атаковать RootkitRevealer. Служба Microsoft CSS уже сообщила об обнаруженной на компьютерах одного из клиентов модификации Hacker Defender с защитой специально от RootkitRevealer. Автор вредоносной программы добавил в раздел root process файла настройки Hacker Defender имя процесса Rootkit Revealer. Перехватчик Hacker Defender скрывает свои объекты от процессов, перечисленных в разделе root process. Таким образом, в этой конфигурации RootkitRevealer не обнаруживает различий, которые бы свидетельствовали о присутствии Hacker Defender. Сразу после получения информации о подобного рода атаке Sysinternals выпустила обновленную версию RootkitRevealer, которая производит сканирование от имени процесса со случайно сгенерированным именем.

Это всего лишь вопрос времени, когда разработчики root kit найдут другие способы обнаруживать факт сканирования RootkitRevealer и будут маскировать сокрытие своих процессов. В ответ Sysinternals будет выпускать собственные обновления, чтобы не дать root kit возможности обнаружить себя. Все продукты обнаружения root kit подвержены такого рода нацеленным атакам, и чем более распространенным становится детектор, тем больше вероятность того, что разработчики root kit будут искать в нем уязвимые места. Некоторая ирония заключается в том, что для противостояния обнаружению со стороны root kit программы-детекторы начинают использовать технологии, применяемые в root kit.

Как искоренить root kit

Что же делать, если у вас возникло подозрение о заражении компьютера вредоносной программой, скрытой с помощью root kit? Если средство удаления получено из надежных источников, таких как Microsoft CSS или поставщики антивирусных программ, можно воспользоваться им, в противном случае единственным надежным средством является переформатирование жесткого диска с переустановкой Windows. Не стоит заблуждаться на счет декларируемых некоторыми программами удаления root kit средствами борьбы типа переименования файлов, которые якобы позволяют бороться с root kit. Современные root kit содержат встроенную защиту от переименования, более того, ваше средство может просто не обнаружить отдельные компоненты root kit, и компьютер все равно останется зараженным.

Существование технологий root kit повышает ставки в борьбе с вредоносными программами. Разработчики root kit могут применять техники, о которых разработчики средств безопасности пока не знают. Это позволит вредоносным программам оставаться незамеченными длительное время, достаточно долгое, чтобы нанести катастрофический урон. Представьте себе, что ваши конфиденциальные корпоративные данные оказались в распоряжении посторонних лиц. Разработчики антивирусных средств должны приложить максимум усилий для анализа уязвимых мест операционных систем семейства Windows с точки зрения угрозы root kit и стараться опережать авторов вредоносных программ. А форсированное применение жестких правил безопасности должно стать абсолютной нормой для всех пользователей без исключения.

Марк Русинович - Редактор Windows & .NET Magazine, автор многих популярных утилит для Windows, в том числе Process Explorer и Regmon. mark@sysinternals.com