«Все лгут». Погоня за истиной при поиске руткитов
Алиса Шевченко, eSage Labalisa@esagelab.ru Дмитрий Олексюк, eSage Lab dmitry@esagelab.ru
Вступление
Стандартные способы получения информации о системе Альтернативное решение Заключение Ссылки ВступлениеЗадача охотника за руткитами – будь то человек или программа – сводится к получению правдивой информации, на основании которой можно судить о состоянии системы. У руткита диаметрально противоположная задача: любыми способами скрыть истинное положение вещей. В силу такого конфликта интересов охотник за руткитами вынужден в своих поисках исходить из презумпции ложности любых полученных данных и непрерывно изыскивать такие источники информации, которые могут быть сочтены доверенными в потенциально модифицированной руткитом системе.Проще говоря, выбор правильных источников информации – краеугольный камень задачи о поиске руткитов. Это также и динамический процесс, поскольку с течением времени и эволюции руткитостроения доверенные источники информации имеют свойство утрачивать свою правдивость. В данной статье мы хотели бы осветить один достаточно простой, и, вместе с тем, более эффективный и безопасный, чем общепринятые, метод получения информации о системе. Вначале мы вкратце рассмотрим преимущества и ограничения существующих технологий, широко применяемых в антивирусах и антируткитах. После этого мы приведем детали предлагаемого метода, его плюсы и минусы, очевидные пути обхода и пример практической реализации. Стандартные способы получения информации о системеВ современных антивирусах и антируткитах применяются различные подходы к выявлению аномалий, характерных для модифицированной руткитом системы: сопоставление полученных из разных источников списков объектов, сопоставление системных структур и кода с доверенной моделью и поиск отклонений в них.Независимо от конкретного подхода к поиску аномалий, выбор механизмов сбора потенциально доверенной информации о системе – т.е. информации, потенциально не искаженной вмешательством руткита – ограничен. Фактически, он сводится к двум опциям.
Восстановление ядраВосстановление участков кода ядра – это способ нейтрализовать эффекты руткита глобально, для системы в целом. Обычно в рамках этого подхода восстанавливают таблицу SDT, некоторое количество кода в начале системных функций, IRP-обработчики – и, в общем, все системные структуры, подозреваемые в модификации (см. Рис. 1).![]() Рис. 1. Rootkit-модификация ядра В процессе разработки алгоритмов восстановления структур ядра разработчик сталкивается с несколькими сложностями.
Вместе с тем, техника глобального восстановления структур ядра обладает рядом существенных недостатков.
Углубление в системуПоскольку архитектура Windows NT имеет многоуровневую структуру, информация, проходящая по цепочке от ядра до API и прикладных программ, может быть перехвачена на различных участках этой цепочки. Таким образом, антируткит может попытаться обойти искаженные элементы цепочки, если будет запрашивать информацию с ее участков, исполнительно предшествующих предположительной модификации.Этот подход намного безопаснее и универсальнее, чем предыдущий, но так же ограничен рядом недостатков.
В конце концов разработчик защиты вынужден эмулировать всю операционную систему, чтобы обойти руткит. Альтернативное решениеИз всех недоверенных источников информации, собственные источники являются наименее недоверенными. Антируткит может выполнять системные вызовы самостоятельно, если он оснащен собственной, заведомо чистой копией ядра. Это «дешевый» способ получить чистую информацию в обход искажающих модификаций, не рискуя стабильностью системы.Использование собственного ядра, правильно полученного и настроенного, позволяет надежно детектировать большинство современных руткитов ядра. В частности, облегченная реализация данной техники (описанная ниже в этой статье) позволяет обнаруживать объекты, скрытые посредством модификации таблицы SDT и кода ядра. Более сложная реализация позволит детектировать практически любой руткит ядра. Детали техникиСоздание работающей копии ядра относительно просто и может быть реализовано посредством следующего алгоритма.
![]() Рис. 2. Цепочка вызовов дубликата ядра Поскольку мы должны предполагать, что очевидные источники информации о пути к файлу ядра (такие как файл boot.ini или ключ реестра HKLM\System\CurrentControlSet\Control\SystemStartOptions “KERNEL”) могут быть подставными, рекомендуется использовать вычислительный алгоритм получения имени файла ядра. Последнее определяется двумя системными параметрами: количеством процессоров и поддержкой PAE (Physical Address Extension).
Недостатки
ОбходПути обхода данной техники сводятся к фальсификации или блокированию тех немногочисленных внешних источников информации, на которые полагается антируткит. В частности, путей и содержимого файлов, используемых для построения собственной копии ядра. Рассмотрим некоторые примеры обходов с решениями.
Преимущества
ЗаключениеНе претендуя на панацею, описанная в данной статье техника представляет собой дешевый и безопасный способ обнаружить деятельность большинства руткитов ядра посредством обнаружения скрытых ими объектов.В качестве проверки практической ценности предложенной техники, мы разработали утилиту на ее основе: Trojan.Win32.TDSS remover. [1] Утилита «заточена» под детектирование и лечение руткита TDSS[2], хотя по своим возможностям представляет собой достаточно универсальный антируткит. Несмотря на то, что качественная реализация описанной техники достаточно тривиальна и безопасна, нам не известны прецеденты ее применения в антивирусных программах и антируткитах. Ссылки[1] eSage Lab, Trojan.Win32.TDSS remover[2] Алиса Шевченко, Анализ руткита TDSS |