VM escape: 101



    В данной статье я попытаюсь рассказать об очевидных (и не очень) методах побега из 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 – это не только хардкорная эксплуатация бинарных уязвимостей с обходом различных механизмов безопасности, но и хорошо забытое старое.
    Digital Security
    Безопасность как искусство

    Похожие публикации

    Комментарии 12

      +1
      Клево, интересный обзор!

      Вопрос: разве CVE-2014-2299 в Wireshark эксплуатируется удаленно? В тексте говорится про ситуацию, когда шарком на хосте анализируется трафик VM, а на видео эксплоит срабатывает при открытии пикапа, который на самом деле внутри не pcap, а mpeg, т.е. там нет пакетов, которые могли бы попасть в сетевой трафик.
        0
        Я так понял: «некий софт собирает пкап, и его шлет на ВМ для анализа, там то и вскрывается». Этот побег в ВМ правда))) Таким образом можно пывнить боксы антивирусников, например. Я однажды сделал RCE на VM для тестирования малварки доктора веба. Абсолютно бесполезное «проникновение» на операционный стол лаборатории.
          0
          После комментария ниже, понял суть атаки. Да, вектор направления другой, и это действительно ИЗ ВМ будет))
          +2
          Да вы абсолютно правы CVE-2014-2299 это локальный по отношению к Wireshark баг. Я не совсем раскрыл саму суть атаки, сделаю это в комментарии: во многих sandbox-системах необязательно даже генерировать трафик для создания malformed pcap, можно напрямую компрометировать log директорию (где хранятся результаты деятельности текущего запущенного вредоноса) и перезаписать своим pcap с эксплойтом.
          0
          Я правильно понимаю, что почти все приведенные методы основываются на том, что есть некий гипотетический интерактивный пользователь, который залогинен и производит какую-то ненулевую активность? Т.е., грубо говоря, если говорить о том, что VM где-то удаленно, доступна только по какому-нибудь VNC / RDP / чему-то такому, то арсенал возможных действий сразу же снижается эдак на порядок?
            +3
            Ну да, все как обычно, больше функциональность — больше простора для уязвимостей. Через VNC файл не кинешь.
            Для VM в вакууме предлагается искать баги в самом софте виртуализации (два последних способа).
              0
              Ну с «шаред директориями» то же иногда вариант, как верно заметил, функциональность ключ к супеху, это золотые слова. Например, вполне реальная ситуация «побега»:

              1) Имеем билд сервер с Дженкинс на ВМваре. Каким то магическим образом мы получили к нему доступ (через тот же Дженкинс, который криво оказался выставлен в Инет, а это RCE).
              2) Пывнем эту ВмВару, и во время билда кладем в сорцы и, соответственно вРПМку бекдор => все это добро в корп. репо
              3) Все обновляют пакет с репо => пывнем все корп боксы
              4) Профит, побег с одной ВМваре на все боксы, без участия человека.

              Так же может быть из шаред директориями если используются для автоматизации, то человек не нужен, тут все зависит от бизнес логики системы, которую пывнем. То есть сбежать можно не сугубо «техническим» образом, а «функциональным», и без участия человека, и как раз второй способ дешевле и опаснее иногда 8)

                0
                Честно говоря, не очень понятно, какое отношение упомянутый сценарий имеет к VMWare и виртуализации вообще. Точно так же «сбежать на все корпоративные боксы» из билд-бокса можно и с физической машины.
                  0
                  Да, к вирутализации — никого. Это к теме, что «функциональность» поражает большее количество векторов, поэтому при реальных операциях, важно изучить сначала бизнес задачи вирутального окружения, в которой мы оказались заперты. Так же как шаред директории вектор и заражение захваченных USB — в статье они описаны, но USB заражаются точно так же как и на физических рабочих станциях. Собственно автор это и резюмировал:

                  Так что VM escape – это не только хардкорная эксплуатация бинарных уязвимостей с обходом различных механизмов безопасности, но и хорошо забытое старое.
            0
            Спасибо за публикацию! Жаль, что я ждал чего-то большего, нового…
              0
              Слышал, у VMware есть некий интерфейс VMCI. Не знаю даже, для чего он нужен, честно говоря, но главный вопрос — возможно ли его использовать в целях «побега из ВМ»?
                +4
                VMCI — это опциональный интерфейс для взаимодействия между виртуальными машинами.Он несомненно добавляет вектор атаки для vm-escape, потому всегда выключен по дефолту (например в ESXi).
                Вот пример теоретического побега 2008 года, бага в VMCI

              Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

              Самое читаемое