Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР #95, НОЯБРЬ 2006 г.

Зверский взлом Windows Vista

Крис Касперски

Хакер, номер #095, стр. 095-068-3


4. Дожидаемся выгрузки драйвера на диск. Момент выгрузки легко определить эвристическим путем. При исчерпании оперативной памяти система вытеснит часть только что выделенных VirtualAlloc страниц, скачкообразно увеличивая количество доступной физической памяти, объем которой легко установить API-функцией VirtualQuery. Затем начинаем прочесывать диск на секторном уровне в поисках ранее обозначенной сигнатуры драйвера-жертвы.

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

6. Вызываем API-функцию CreateFile, передавая ей имя хакнутого драйвера (в данном случае NULL.SYS), и... операционная система тут же считывает модифицированные страницы с диска, вызывает IRP_MJ_DEVICE_CONTROL, передавая shell-коду управление. А дальше, как говорится, дело техники!

Успешно осуществив атаку, Жанна (как и положено «белому» хакеру) тут же предложила несколько контрмер. Самое простое, но не самое умное, что может сделать Microsoft, - это заблокировать выгрузку ядерных компонентов на диск. Все необходимые ингредиенты у нее уже есть, достаточно только убрать из реестра ключ DisablePagingExecutive, пожизненно установив его значение - «1». В результате мы потеряем некоторое количество физической памяти (по подсчетам Жанны, около 80 Мб, а по моим подсчетам, даже меньше). К примеру, совокупный объем драйверов на моей машине составляет 30 Мб, и я не думаю, что на висте их размер сильно больше, гарантируя при этом, что никакой драйвер не будет скомпрометирован. Если учесть, что сама виста требует не менее 1 Гб RAM (а для реальной работы понадобится как минимум 2), потеря 30-80 Мб вряд ли покажется значительной. Однако можно пойти другим путем, подсчитывая контрольную сумму каждой страницы перед вытеснением ее на диск и проверяя ее при загрузке. Но поскольку контрольные суммы надо где-то хранить (причем не на диске, а в невытесняемой оперативной памяти), мы не получим никакого выигрыша, впустую расходуя процессорное время. Можно, конечно, шифровать страницы каким-нибудь высокоскоростным криптоалгоритом, храня в памяти всего лишь ключ, случайным образом генерируемый при загрузке, но это уже чересчур. К тому же существует возможность модификации самого файла ядра операционной системы, отключающей все защитные механизмы и тут же инициирующей перезагрузку, против которой предложенные защитные меры бессильны!

Назад на стр. 095-068-2  Содержание  Вперед на стр. 095-068-4