Как стать автором
Обновить

Гипервизор против руткитов: как это работает

Время на прочтение4 мин
Количество просмотров12K
В последнее время наша компания разрабатывала детектор руткитов на базе аппаратной виртуализации. Проект задумывался с целью разобраться, как можно использовать новые возможности процессоров Intel и AMD для информационной безопасности. После нескольких итераций мы остановились на вполне работоспособном методе детектирования руткитов. О нем и пойдет речь.

Метод основан на технологии аппаратной виртуализации памяти (англ. nested paging или hardware assisted paging, общепринятого русскоязычного термина нет). Эта технология появилась в последних моделях процессоров Intel и AMD. Версия Intel называется Intel Extended Page Table (EPT) и поддерживается процессорами начиная с семейства Nehalem (Intel Core i3, i5, i7). Аналог AMD называется AMD Rapid Virtualization Indexing (RVI) и присутствует на процессорах, начиная с поколения AMD K10. Технологии схожи, поэтому все, что описывается далее об Intel EPT, применимо и к AMD RVI.

Теория


Итак, у нас есть гипервизор и работающая под его контролем гостевая операционная система (гость).



Переход управления из гипервизора в гостевую ОС называется VM Entry, обратный переход – VM Exit. Вся работа – это последовательность VM Entry и VM Exit, сменяющих друг друга. Гипервизор работает в изолированном адресном пространстве и «невидим» со стороны гостевой ОС. При этом он может изменять состояние гостевой ОС (виртуальный процессор, память, виртуальное аппаратное обеспечение и т.д.).

Читателю есть смысл ознакомиться с нашей предыдущей статьей, где речь шла о методе, основанном на теневой таблице страниц (shadow paging). Описываемый здесь метод – дальнейшее логическое его развитие.

Аппаратная виртуализация памяти, в противовес программной виртуализации в shadow paging, резко упрощает гипервизор и, как следствие, делает его надежнее. Кроме того, значительно повышается производительность и снижается расход памяти.

При обычной работе процессора любое обращение к физическому адресу немедленно ведет к его выставлению на адресной шине процессора (кроме таких случаев, как обращение к APIC, но мы их опустим для простоты изложения). В случае с nested paging любое обращение гостя к физическому адресу (он получает название «гостевой физический адрес») сперва транслируется через специальную таблицу страниц. Физический адрес, полученный из гостевого физического адреса, выставляется на адресной шине, после чего происходит обращение к памяти.

Преобразование гостевых физических адресов для Intel EPT аналогично обычному страничному преобразованию:



Таблица страниц четырехуровневая и напоминает таблицу страниц для преобразования виртуальных адресов в 64-битном режиме Intel 64. Основное отличие – строение записей таблицы. На рисунке приведено строение записи для нижнего уровня таблицы (PTE):



Нас интересуют три младших бита записей, которые определяют доступ к физической памяти. Если сброшены биты R, W, X (биты 0...2), то доступ к описываемой PTE памяти соответственно на чтение, запись и исполнение вызывает выход в гипервизор (EPT Violation по терминологии Intel).

Это дает возможность контролировать исполнение кода на процессоре и записи в память c кодом.

Суть метода


Полная виртуализация не является в нашем случае целью. Для контроля над выполнением и модификацией кода нам достаточно виртуализировать память и процессор.

Для виртуализации памяти нам нужно построить таблицу страниц EPT с отображением гостевых физических адресов в реальные физические адреса «один в один» (identity mapping). При этом в записях на нижнем уровне таблицы (PTE) мы сбрасываем биты W и X. Каждая такая запись описывает доступ к странице памяти размером 4 КБ.

Далее возможны два варианта выхода в гипервизор (VM Exit) с EPT Violation:
  1. Доступ к странице памяти на запись. При этом происходит выход в гипервизор, после чего он разрешает запись в страницу (устанавливает бит W), но запрещает выполнение (сбрасывает бит X).
  2. Доступ к странице памяти на выполнение. При этом гипервизор разрешает выполнение на странице (устанавливает X), но запрещает запись в нее (сбрасывает W).



Таким образом, страница памяти может быть либо только исполняемой, либо только записываемой. Запись и исполнение соответственно влекут выход в гипервизор (VM Exit) и переводят страницу из одного состояния в другое.

Обрабатывая эти события, гипервизор может перехватывать запись в невыгружаемый код, а также выполнение вне пределов системных модулей. При наступлении каждого из событий можно анализировать код, вызвавший его.

Практическая реализация


Мы реализовали детектор руткитов Hypersight Rootkit Detector, использующий вышеописанный метод. Он спроектирован так, чтобы его можно было загружать и выгружать по запросу пользователя. Это позволяет использовать его совместно с программами виртуализации, такими как VMware и VirtualBox.

Наш детектор руткитов может обнаруживать следующую активность в ядре:
  • Попытки перехода в режим гипервизора.
  • Модификации управляющих регистров кодом вне ядра и HAL.
  • Модификации невыгружаемого кода ядра, HAL и драйверов в памяти, модификации SSDT. В том числе модификации путем отображения виртуальной памяти.
  • Выполнение кода за пределами исполняемых секций драйверов, ядра и HAL. Так называемый «скрытый код», козырная карта руткитов, теперь легко обнаруживается.

Падение производительности при включенном мониторинге – в пределах одного процента и практически незаметно «на глаз». Потребление памяти гипервизором – около 40 МБ для четырехъядерного процессора. Это дает возможность использования метода на компьютерах с памятью от 1 ГБ, предназначенных для офисных задач и разработки.

Дальнейшая работа


Возможности гипервизора не ограничиваются лишь детектированием руткитов. Возможно также и блокирование вредоносной активности. Мы ведем исследования в этой области и надеемся представить результаты в скором будущем. Также на повестке дня стоит портирование на 64-битную архитектуру и процессоры AMD RVI.

Заключение


В последнее время антивирусные компании обратили внимание на гипервизоры и стали нанимать их разработчиков. Однако стоит заметить, что разработка гипервизора «с нуля» – достаточно трудоемкий и дорогостоящий процесс, несмотря на кажущуюся внешнюю простоту. Наша компания может предложить свой опыт в этой области, а также работающее решение.

Литература


Документация по процессорам Intel: www.intel.com/content/www/us/en/processors/architectures-software-developer-manuals.html

Документация по процессорам AMD: developer.amd.com/documentation/guides/Pages/default.aspx
Теги:
Хабы:
Всего голосов 37: ↑33 и ↓4+29
Комментарии5

Публикации

Истории

Работа

Ближайшие события

One day offer от ВСК
Дата16 – 17 мая
Время09:00 – 18:00
Место
Онлайн
Конференция «Я.Железо»
Дата18 мая
Время14:00 – 23:59
Место
МоскваОнлайн
Антиконференция X5 Future Night
Дата30 мая
Время11:00 – 23:00
Место
Онлайн
Конференция «IT IS CONF 2024»
Дата20 июня
Время09:00 – 19:00
Место
Екатеринбург
Summer Merge
Дата28 – 30 июня
Время11:00
Место
Ульяновская область