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