13.08.2012

Как современные вредоносные программы обходят мониторинг процессов

image

Одна из основных задач любого антивируса (AV) заключается в отслеживании активности всех процессов. Вредоносные программы, в свою очередь, хотят избежать своего детектирования антивирусом.

Авторы: Michael Vincent, Abhishek Singh

Одна из основных задач любого антивируса (AV) заключается в отслеживании активности всех процессов. Вредоносные программы, в свою очередь, хотят избежать своего детектирования антивирусом. Большинство руткитов стараются “залечь тише воды, ниже травы”. Подобной стратегии придерживаются и современные вредоносные программы при обходе антивирусов и систем безопасности корпоративного уровня.

Так как же вредоносным программам удается избежать детектирования при запуске нового процесса? Очень легко: под прицел попадает непосредственно ядро операционной системы. Для мониторинга создания и завершения процессов в ядре Windows, системы безопасности обращаются к функции ядра PsSetCreateProcessNotifyRoutine, предоставляемой Microsoft. Когда происходит создание или завершение процесса, PsSetCreateProcessNotifyRoutine создает соответствующее оповещение. В дальнейшем, системы безопасности используют полученную информацию о процессах, чтобы отследить активность системы и защитить критические ресурсы.

В операционных системах семейства Windows существует массив объектов обратного вызова, который начинается с адреса PspCreateProcessNotifyRoutine. В Windows XP SP2 можно зарегистрировать до восьми объектов обратного вызова. Но к несчастью для разработчиков не из Microsoft’а, указатель PspCreateProcessNotifyRoutine не экспортируется, и открытого метода регистрации на оповещения для сторонних приложений не существует.

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

Рисунок 1. PsSetCreateProcessNotifyRoutine ntoskrnl.exe

В первую очередь необходимо найти внутренний указатель PspCreateProcessNotifyRoutine. Беглый просмотр реализации PsSetCreateProcessNotifyRoutine в ntoskrnl.exe с помощью IDA Pro показывает, что смещение PspCreateProcessNotifyRoutine находится внутри PsSetCreateProcessNotifyRoutine (см. Рисунок 1 выше). Ниже на Рисунке 2 представлен фрагмент кода вредоносной программы, полученный с помощью обратного проектирования. Фрагмент демонстрирует, как авторы вредоносной программы анализируют структуру PsSetCreateProcessNotifyRoutine в ntoskrnl.exe и используют полученную информацию для реализации атаки.

Рисунок 2. Получение смещения PspCreateProcessNotifyRoutine

Реализация атаки довольно проста (см. Рисунок 2). В первую очередь определяется номер сборки Windows, который содержится в экспортированной переменной NtBuildNumber. Для Windows XP номер сборки равен 2600 (0a28 в шестнадцатеричной системе). Следующим шагом получают адрес времени выполнения функции PsSetCreateProcessNotifyRoutine.

Фрагмент кода под меткой jmp_PsSetCreateProcessNotifyRoutine содержит команду перехода jmp на внешнюю функцию PsSetCreateProcessNotifyRoutine. Как видно из Рисунка 3, размер команды jmp равен двум байтам. Поэтому, интересующий нас адрес функции PsSetCreateProcessNotifyRoutine в памяти находится по смещению jmp_PsSetCreateProcessNotifyRoutine + 2.

Для версии сборки NtBuildNumber равной 2600 код команды ‘mov edi’ – 0xBF, а команды ‘push edi’ – 0x57. Теперь осталось только просканировать машинный код и найти фрагмент, в котором пятым по счету байтом после 0xBF был бы байт 0x57. Сразу же за 0xBF следует адрес PspCreateProcessNotifyRoutine в памяти. И это все! Дальнейшие действия эксплойта тривиальны. Нужно просто перейти на указатель PspCreateProcessNotifyRoutine и занулить все объекты обратного вызова.

Рисунок 3. jmp_PsSetCreateProcessNotifyRoutine

Заключение: Любую корпоративную или пользовательскую систему безопасности, которая использует мониторинг процессов обычным образом, можно легко обойти. К счастью, все продукты FireEye защищены от атаки, описанной в данной статье: любой вредоносный процесс будет надлежащим образом отслеживаться и идентифицироваться.

или введите имя

CAPTCHA
16-08-2012 11:56:01
Зато не защищены от user factor и других tricks:)
0 |
freshmarch
16-08-2012 15:57:54
> "Для версии сборки NtBuildNumber равной 2600 код команды ‘mov edi’ – 0xBF, а команды ‘push edi’ – 0x57"А для других buildNumber они что - другие?
0 |
Гость
06-09-2012 16:30:43
По-видимому, в этой фразе изначально предполагалось: 1) сделать оговорку, что приводимые в статье рассуждения (о том, что опкод команды mov edi,offset xxx предшествует искомому значению, а за этим значением следует опкод команды push edi) справедливы для ОС с NtBuildNumber==2600 (как минимум XP, XP sp1, XP sp2, XP sp3, причём бинарники-то могут в разных версиях отличаться, но авторы об этом умалчивают); 2) для нагляности привести значения упомянутых в п.1 опкодов. А вообще, это ж реклама "...К счастью, все продукты FireEye защищены..."
0 |