убийство часового КРИС КАСПЕРСКИ, АКА МЫЩЪХ Спецвыпуск: Хакер, номер #072, стр. 072-072-5 Patch-Guard инициализируются только в отсутствии системного отладчика, подключающегося при загрузке (или его имитации в виде «затычки»), в противном случае отладчик не смог бы устанавливать программные точки останова (представляющие собой однобайтовую машинную команду CCh) и делать массу других жизненно важных вещей. Будучи инициализированным, Patch-Guard в случайные промежутки времени (приблизительно один раз в 5-10 минут) запускает процедуру проверки целостности ядра, наводящую в системе настоящий шмон. Текущие версии создают копии всех критических структур данных и подсчитывают контрольные суммы NTOSKRNL.EXE (ядро), HAL.DLL (библиотека абстрагирования от оборудования) и NDIS.SYS (один из самых низкоуровневых сетевых драйверов). Почему Patch-Guard работает по принципу обходчика а-la «в Багдаде все спокойно», вместо того, чтобы пресекать всякую попытку модификации в момент ее появления? Некоторые утверждают, что во всем виноват процессор, не предоставляющих таких возможностей. Ну, на самом деле, процессор предоставляет, только парни из Рэйдмонда воспользоваться этим не умеют, во всяком случае, не в той мере, в какой это необходимо. Полный список контролируемых элементов приведен ниже (естественно, в последующих версиях Висты он может измениться): - ТАБЛИЦА ГЛОБАЛЬНЫХ ДЕСКРИПТОРОВ — GDT; - ТАБЛИЦА ДЕСКРИПТОРОВ ПРЕРЫВАНИЙ — IDT; - СТЕК ЯДРА, ВЫДЕЛЕННЫЙ НЕ ЯДРОМ, А КЕМ-ТО ЕЩЕ; - ТАБЛИЦА ДЕСКРИПТОРОВ СИСТЕМНЫХ СЕРВИСОВ — SSDT; - ОБРАЗЫ СЛЕДУЮЩИХ СИСТЕМНЫХ ФАЙЛОВ: NTOSKRNL.EXE, NDIS.SYS, HAL.DLL; - СЛУЖЕБНЫЕ MSR-РЕГИСТРЫ STAR/LSTAR/CSTAR/SFMASK, ОТВЕЧАЮЩИЕ ЗА SYSCALL'Ы; - AMD X86-64 ПРЕДОСТАВЛЯЕТ ВОЗМОЖНОСТЬ КОНТРОЛЯ ЗА ОБРАЗОМ ЯДРА БЕЗ РАСЧЕТА CRC. Контроль целостности системных файлов уже не позволяет перехватывать функции путем внедрения в них начало jump'а на хакерский обработчик, а слежение за SSDT препятствует подмене адресов сервисных функций на хакерские переходники к ним. Так же хакер не может вмешиваться в работу менеджера исключений или воздействовать на внутренние аргументы команды SYSCALL, хранящиеся в MSR-регистрах. Вот с таким противником нам придется сразиться. Но так ли он страшен, как кажется?! Чтобы не пересказывать своими словами статью «Bypassing PatchGuard on Windows x64» (чего лишний раз повторяться?), авторы которой раздербанили Patch-Guard в пух и прах, мыщхъ сосредоточится на том, чего в этой статье не было. [симбиотические пути выживания.] Собственно говоря, а чего это мы так встрепенулись? Чем нам, хакерам, мешает этот Patch-Guard, и зачем его убивать? Пускай живет и защищает нашу машину от всяких непрошеных тварей (типа кривых пионерских драйверов или червей), в то время как мы запустим свой хвост в чужие. Все современные 64-разрядные процессоры семейства AMD x86-64 и Intel IA64, выпущенные после августа 2006 года, поддерживают механизмы аппаратной виртуализации. Достаточно, находясь в режиме ядра, выполнить машинную команду VMCALL (AMD) или VMXON (Intel), чтобы запустить гипервизор (в терминологии Intel – монитор виртуальных машин), переводящий операционную систему в гостевой режим и полностью контролирующий ее, перехватывая все обращения к портам ввода/вывода, прерывания, чтение/запись MSR-регистров (через которые, в частности, реализована инструкция SYSCALL). Мы как бы «подминаем» под себя операционную систему, работая в минусовом кольце (естественно, в «минусовом» чисто условно) и осуществляем перехват без модификации базового кода/данных гостевой системы, так что Patch-Guard ничего не сможет определить. Причем, заткнуть эту дыру без значительного ущерба для функциональности Microsoft не сможет хотя бы по чисто маркетинговым соображениям, иначе — прощай аппаратная виртуализация! |