VM escape: 101


Читать на Хабре: http://habrahabr.ru/company/dsec/blog/222993
Автор: Петр Каменский,
аудитор Digital Security

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

VMware WorkStation, VirtualBox (Oracle VM VirtualBox) – программные продукты для виртуализации, позволяющие запустить на компьютере несколько операционных систем одновременно.

VM escape будоражит умы многих исследователей безопасности. Среди хакеров данные эксплойты считаются весьма продвинутыми и сложными. Такие примеры есть, но их совсем немного (одни из самых интересных: VMware CloudBurst, Advanced Exploitation of Xen Hypervisor Sysret VM Escape Vulnerability). Но не всегда для того чтобы ваш код из виртуальной машины попал на реальную (или на оборот) надо придумывать что-то эдакое. Так, в случае атаки на рядового пользователя мы можем взять наш топор и рубить по самым банальным вещам. Без лишних слов – поехали.

Заражение общих папок

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

Параметры общих папок для VMware Workstation

Параметры общих папок для VirtualBox

Заражение захваченных USB-устройств

Не уступающий по эффективности предыдущему рассмотренному методу вариант. Также достаточно реализованных ITW-вредоносов (как исторический пример – Flame) со встроенными watchdogs, мониторящими подключение USB-устройств, автоматически распространяющихся путем заражения исполняемых файлов, проброса злосчастного файла autorun.inf, уязвимости LNK и т. д.

Естественно, главным условием данного метода является наличие устройства USB-контроллера с определенной конфигурацией у виртуальной машины.

В VMware Workstation, как мне кажется, настройки USB-контроллера реализованы некорректно: работа фильтра распространяется сразу на все устройства, причем эти опасные настройки выставлены по умолчанию при создании новой виртуальной машины.

Параметры USB-контроллера для VMware Workstation


VirtualBox, напротив, более гибок, позволяет нам ставить фильтр контроллера на определенные устройства, хотя в тоже время есть возможность установить пустой фильтр на захват любого USB, что плохо в плане безопасности.

Параметры USB-контроллера для VirtualBox


Атака на общий буфер обмена


VMware Workstation

Параметры виртуальной машины


Для начала обобщенно рассмотрим архитектуру DnD (Drag'n'Drop) и общего буфера обмена. Передача данных между гостем и хостом реализована через механизм GuestRpc, который по сути является командой (0x1E) BackDoor I/O (для тех кто не знает или забыл, что такое VMware BackDoor I/O: https://sites.google.com/site/chitchatvmback/backdoor).

Модель DnD, общего буфера обмена на основе иерархии классов (взято из исходников OpenTools):


В свою очередь, GuestRpc также имеет таблицу команд, весь список которых можно получить только после тщательного реверсинга VMware (кстати говоря, в стандартный набор гостевых утилит входит RpcTool, с помощью которого вы можете, соответственно, отправлять GuestRpc-команды). В случае DnD и общего буфера обмена используются такие команды (также именуемые «транспортные интерфейсы»):
dnd.transport
copypaste.transport

Каждый транспортный интерфейс имеет свои наборы команд, которые передаются уже в служебных заголовках пакета с данными.

Так, например, выглядит набор команд для copypaste.transport:
typedef enum {
   CP_CMD_REQUEST_CLIPBOARD = 2000,
   CP_CMD_REQUEST_FILES,
   CP_CMD_RECV_CLIPBOARD,
   CP_CMD_SEND_CLIPBOARD,
   CP_CMD_GET_FILES_DONE,
   CP_CMD_SEND_FILES_DONE,
} CopyPasteCmdV4;
Пакет CP_CMD_SEND_CLIPBOARD, красным выделен непосредственно буфер обмена в 
кроссплатформенном формате:


Итак, возможные сценарии подмены общего буфера обмена VMware:

  • При копировании пользователем какого-либо исполняемого файла с гостя на хост;
  • При копировании пользователем какого-либо исполняемого файла на хосте с промежуточной фокусировкой в гостевой машине.
Соответственно, реализуется это либо написанием своей мониторилки буфера обмена (слать запросы напрямую через BackDoor I/O), либо установкой ряда хуков плюс инжектированием своего вредоносного кода в процесс гостевой утилиты vmtoolsd.exe (под NT-системой).

Очевидно, что вместо исполняемого файла может быть любой офисный документ-эксплойт и т. д.

Простая демонстрация данной атаки (используется непосредственно инжект в гостевую утилиту):


VirtualBox

К сожалению (для атакующего), VirtualBox официально не поддерживает передачу исполняемых файлов в DnD и общем буфере обмена.


Но не могу не упомянуть сторонний проект VMTransferFiles, расположенный на официальном форуме VirtualBox.

С его помощью вы можете расширить функционал до передачи любых файлов, на свой страх и риск, конечно.

Атака на софт, косвенно относящийся к виртуализации


Не секрет, что множество разнообразных исследователей в области ИБ так или иначе используют виртуальные машины в своей работе. Так, например, malware-аналитики зачастую анализируют трафик или поведение вредоносов, используя прелести виртуализации.
Отсюда и растут корни этой подтемы: бить по софту, используемому ими при той или иной работе. 

Wireshark
Издавна завелось во всякой разной малвари использовать блэк-листы на различный исследовательский софт, и Wireshark фактически является одним из самых популярных кандидатов в этот список.

Пример блэк-листа буткита Rovnix:


Поэтому очень часто я наблюдал простое и ленивое решение обхода детектирования Wireshark: попросту запускать его на своем хосте, анализируя трафик виртуальной машины. Кроме того, многие sandbox-системы автоматически генерируют pcap-файлы трафика, которые, в свою очередь, обычно анализируют также на хосте с помощью Wireshark. Значит неплохой идеей будет использовать различные удаленные и локальные баги в диссекторах Wireshark, для VM-escape целей.

Как пример уязвимости, я решил использовать CVE-2014-2299 – переполнение буфера в парсере MPEG-файлов. В наличии уже имеется исходный код эксплойта, модуль под MetaSploit.

Видео демонстрация с боевыми калькуляторами:


VirtualKD
Прежде чем начать, обращаю ваше внимание на старую, но интересную статью о том, как можно атаковать хост из виртуальной машины через протокол удаленной отладки ядра с задействованным отладчиком WinDbg.

VirtualKD – это open-source-проект, призванный улучшить производительность отладки ядра под VMware либо VirtualBox. Реализовано это весьма кастомным методом (я рассмотрю реализацию с VMware) – на стороне хоста в процесс vmware-vmx (процесс нашей виртуальной машины) инжектируется dll, которая в свою очередь патчит/добавляет в таблицу GuestRpc новые команды и ее обработчики. Со стороны же гостя перехватывается ряд функций Kd* (KDCOM.DLL) на свою имплементацию, реализованную в драйвере KDVM.DLL.

По сути получается простая схема – протокол KDCOM туннелируется через VMware BackDoor I/O (GuestRpc) на хост и далее разворачивается напрямую в пайп-канал, который прослушивает WinDbg.

Архитектура VirtulKD (специфичная для VMware):


И все бы прекрасно, утилита действительно работает, но я решил ввиду моей темы пройтись по ее исходникам в поисках быстрых багов. И действительно, в течение часа был найден тривиальный integer overflow.

Итак, в заголовочном файле rpcdisp.h, в методе KdRpcDispatcher::SendPacket обрабатываются данные KDCOM-пакета, обернутого дополнительной служебной информацией.
Некоторые из этих данных валидируются неправильно.


Как мы видим на рисунке, результат сложения pParams[1] и pParams[2] можно спокойно переполнить (например, pParams1== 0xFFFF0000 и pParams2==0x18000 в результате даст нам 0x8000). И далее по коду pParams[1] будет использоваться как смещение до данных, что в результате приведет к общей ошибке чтения.

Напомню, что обработка этих данных идет в контексте инжектированного модуля.dll в процессе виртуальной машины vmware-vmx, исключительная ситуация в которой приводит к падению процесса виртуальной машины VMware.

Естественно, я написал об этой баге команде sysprogs, на что они ответили в стиле: “Спасибо, но патчить мы это не будем, так как не видим impact”. К тому же они почему-то посчитали, что бага эксплуатируется только в kernel-mode под гостем, хотя в реальности все как раз наоборот и даже лучше – эксплуатация не нуждается ни в каких привилегиях вообще! По факту эксплойт шлет напрямую в BackDoor I/O наши злобные пакеты, размер концепта в принципе получается очень мал, и его легко, при желании, внедрить в любую malware.

Также хочу заметить, что данная DoS VM бага найдена очень быстро, и кто знает – может быть, в VirtualKd зарыты более весомые уязвимости ведущие уже к действительному VM-escape. Для тех, кто хочет поближе ознакомиться с эксплойтом, здесь его исходный код.

И небольшая демонстрация данной атаки:


Использование устаревших уязвимых технологий


VMGL
Этот частный случай, хоть и относится больше к KVM и Xen, как мне кажется, прекрасно характеризует данную под тему.

VMGL – это уже давно заброшенный проект по front-end OpenGL 3d hardware акселерации, на который, однако, до сих пор есть ссылки – например, на официальной странице KVM-проекта.

Сайт проекта, откуда можно взять исходный код.

Грубо говоря, VMGL является клиент-серверной технологией, туннелирующей через стек TCP/IP-протоколов поступающие с виртуальной машины гостя GL-команды напрямую в GPU на хосте.


Архитектура VMGL
Изучив глубже реализацию и взглянув на исходные коды, я увидел, что в основе VMGL лежит проект Chromium. Так вот, этот самый проект Chromium также лежит в основе 3D-акселерации виртуальных машин VirtualBox и уже был достаточно успешно изучен на наличие багов.

Итак, с установкой VMGL вы получаете не просто акселерацию, а к тому же как минимум три известные уязвимости (CVE-2014-0981; CVE-2014-0982; CVE-2014-0983) дизайна Chromium-движка.

Несмотря на то, что уязвимости не дают нам прямого исполнения кода, теоретический VM escape все же возможен, что определенно должно вас заволновать, если вы, по какой-либо странной причине, все еще используете этот заброшенный проект.

Фрагмент патченого Chromium (util\net.c) в составе VirtualBox (теперь уязвимые обработчики команд попросту физически не существуют на хосте):


Заключение

Эти незамысловатые и довольно простые в эксплуатации методы приносят результат и встречались нам на практике в некоторых атаках. Так что VM escape – это не только хардкорная эксплуатация бинарных уязвимостей с обходом различных механизмов безопасности, но и хорошо забытое старое.
← Вернуться к списку
Оставить заявку