Что такое хост машина
Виртуальные машины. Как сделать компьютер в компьютере
Содержание
Содержание
В одном обычном компьютере можно создать сразу несколько виртуальных, чтобы познакомиться с возможностями Linux или другими экзотическими ОС, запустить очень старую и сегодня неподдерживаемую программу, пройти заново игру детства на современном железе. Или же запустить Windows Vista внутри Windows 7 внутри Windows 8 внутри Windows 10. Просто потому, что захотелось.
Что такое виртуальные машины
Виртуальная машина — это эмулятор компьютера в самом широком смысле. Это почти как эмулятор игровой приставки или Android-устройства, только настраивается гораздо гибче.
Например, на эмуляторе Sony PlayStation не получится запустить игру под Nintendo GameBoy. А эмулятор DOSbox — это очень условный, специализированный виртуальный компьютер с эмуляцией определенного списка старого оборудования и со встроенной системой DOS, так что запустить там Windows 10 не получится.
Виртуальная машина же — это эмулятор персонального компьютера с практически любым железом. И на этот компьютер можно устанавливать любую операционную систему и программы, которые нужны.
Зачем нужны виртуальные машины
В деловых процессах виртуальные машины используются активно — там это нужно. Центры обработки данных, облачные вычисления, виртуальные серверы, разграничение доступа и все такое. На одном и том же железе может работать отдельный файловый архив, отдельный веб-сервер, отдельный сервер авторизации — и все на разных системах, полностью изолированных друг от друга. Но зачем нужна технология виртуальных машин обычному домашнему пользователю?
Вот простой пример: у вас есть компьютер и на нем, скорее всего, установлена операционная система Windows. Для изучения программирования вам требуется linux, но вы не хотите экспериментировать со своим компьютером, разбивать личный диск на несколько разделов и рисковать потерей данных. Виртуальная машина позволит работать в другой системе, при этом родная Windows никак не пострадает.
Или, например, есть очень важная и нужная программа, которая запускается только под WindowsXP конкретной версии и сборки. Причем эта программа откажется запускаться, если оперативной памяти больше 128 мегабайт. Можно отпилить часть микросхем от современного модуля на 16 гигабайт, но что-то вам подсказывает, что так делать не нужно. А вот виртуальная машина поможет запустить капризный софт, эмулируя компьютер с нужным объемом памяти.
А вот, допустим, игра двадцатилетней давности, которую вы нашли на антресолях и пытаетесь установить в приступе ностальгии. Игра отказывается верить в существование восьмиядерного процессора и вылетает с ошибкой «так не бывает». Виртуальная машина с нужными характеристиками поможет вспомнить былые времена и запустить игру.
Часто виртуальная машина используется в качестве «песочницы» — маленькой игровой площадки для программы, которая вызывает у вас подозрения. Чтобы не рисковать, вы запускаете сомнительную программу внутри виртуальной машины, а не на настоящем компьютере: софт честно делает свою работу, потом шифрует все файлы и требует денег, например. Но в виртуальной системе, в той самой «песочнице» не было никаких ценных данных, поэтому вы можете спокойно удалить виртуальную машину с наглой программой внутри. Здорово же!
Наконец, приверженцы техники Apple или убежденные Linux-пользователи тоже могут использовать виртуальную машину, чтобы запустить какой-то специфический софт, который работает только под Windows.
Как видите, даже для домашнего пользования виртуальные машины могут пригодиться. Поэтому разберемся с основными характеристиками и научимся создавать компьютер в компьютере.
Основные термины и их понимание
Гость (guest, гест, гостевая система, таргет) — это виртуальный компьютер, один или несколько, который запускается на хосте.
Хост — это основной компьютер, на котором запускаются виртуальные машины. Производительность хоста должна быть достаточной, чтобы тянуть и собственную систему, и гостевую. Для запуска одной виртуальной машины вполне достаточно возможностей любого современного компьютера. Но для нормальной работы нескольких систем одновременно лучше иметь не меньше шестнадцати гигабайт оперативной памяти, а образы компьютеров создавать на скоростном SSD-накопителе. По очевидным причинам, у вас не получится создать виртуальную машину с характеристиками выше, чем у самого хоста — если на основном компьютере всего 8 гигабайт оперативной памяти, то создать таргет с 16 ГБ не выйдет.
Гипервизор — специализированная программа для создания виртуальных машин и управления ими. Для домашнего пользования есть бесплатные программы-гипервизоры с минимальным количеством настроек и функций. В бизнес-сфере используются более продвинутые решения, а некоторые гипервизоры и вовсе устанавливаются вместо операционной системы, чтобы сразу несколько мощных компьютеров можно было объединить в большой виртуальный хост. Это называется «консолидация серверов». Дорогое удовольствие, как по затратам на железо, так и на гипервизор.
Образ — термин достаточно известный, обозначает файл с полной цифровой копией какого-либо носителя внутри. Обычно применяется в отношении оптических дисков, но в нашем случае в образе может храниться и дискета, и виртуальный жесткий диск.
Установка
Чтобы начать знакомство с виртуальной машиной потребуется установить гипервизор. Таковых существует множество: платных и не очень, для тонкой настройки всего и вся или базового «нажал — заработало». Virtualbox — один из наиболее популярных гипервизоров, потому что бесплатный, доступен под Windows, Mac OS и Linux, активно развивается и поддерживается сообществом разработчиков и энтузиастов. Скачать VirtualBox можно с официального сайта, но учтите, он на английском.
Начиная с шестой версии в VirtualBox убрали поддержку 32-битных хост-систем, но пятая версия до сих пор доступна для скачивания. В любом случае, можно скачать обе версии. Для более комфортной работы потребуется еще и набор расширений — ExtensionPack.
Устанавливается VirtualBox довольно просто, достаточно последовательно соглашаться со всеми предложениями. Перед установкой появится большое предупреждение о том, что компьютер будет отключен от сети, на время установки виртуальных сетевых карт — это нормально. А в ходе установки появится несколько подтверждающих окон — это устанавливается эмулятор USB, сетевых карт и других устройств.
Ну а после установки появится основное окно гипервизора на родном русском языке.
Первым же делом желательно установить пакет расширений — он добавляет поддержку USB 2.0, подключение по протоколу RDP, поддержку накопителей с NVMe и прочие полезные вещи. В стандартной установке все эти возможности отсутствуют из-за различных лицензий: сам гипервизор бесплатный во все стороны, а расширения бесплатны только для личного пользования и ознакомления.
Чтобы установить расширения достаточно запустить файл Extensionpack дабл-кликом, но делать это нужно после установки самого Virtualbox — потому что установщик расширений запускается внутри гипервизора.
Как работает виртуальная машина
Гипервизор создает файл образа жесткого диска, резервирует определенное количество оперативной памяти и занимает процессорное время — это необходимо для работы «контейнера», в котором будет работать виртуальная машина. Изнутри же «контейнер» выглядит как полноценный компьютер с жестким диском, оптическим приводом, дисководом, сетевой картой, видеоадаптером, звуковой картой и прочим оборудованием. Причем заменить видеокарту обычно нельзя — она эмулируется как встроенная в материнскую плату. А вот в оптический привод можно либо загрузить образ из файла, либо использовать существующий привод хоста.
Процессор виртуализируется как минимум одним ядром. Для старых систем лучше не использовать многоядерность — не поймут, испугаются и будут глючить. А новым больше двух ядер нужно выдавать только при реальной необходимости.
Подключенные к хосту USB-устройства можно пробросить внутрь виртуальной машины. Достаточно выбрать для конкретной машины нужный пункт из меню «Устройства — USB». При этом, например, флэшка исчезнет из списка накопителей в хост-системе и станет видна в виртуальной машине. Также можно поступить с любым другим USB-устройством, но не забудьте сначала установить Extensionpack, иначе скорость USB 1.1 вас огорчит.
Чтобы файлы на основной системе были доступны в виртуальной ОС можно воспользоваться общими папками: они монтируются как сетевые пути, но удобнее автоматически их монтировать как сетевой диск — он будет подключаться при загрузке системы. Подробности разберем на этапе настройки.
Создаем виртуальный компьютер
Создать новую виртуальную машину в VirtualBox поможет встроенный мастер настройки. Достаточно ввести название виртуального компьютера, а гипервизор на его основе попытается определить нужную операционную систему и выдаст рекомендуемые параметры. Если название слишком оригинальное, то потребуется указать тип гостевой операционной системы вручную.
Несмотря на то, что в списке поддерживаемых систем есть даже Windows 3.1, лучше всего виртуализируются относительно свежие системы, начиная хотя бы с Windows 2000. С win9x немного сложнее: сначала нужно загрузить DOS из образа дискеты, а уже потом запускать установщик — в те времена загрузочные CD не делали, потому что оптические носители только-только появлялись.
Следующим шагом будет выбор объема оперативной памяти и виртуального жесткого диска — если нет специальных требований, то автоматически предложенные значения можно не менять.
После создания виртуальной машины необходимо открыть ее настройки и подключить образ загрузочного компакт-диска на вкладке «носители». И теперь можно запускать виртуальный компьютер.
Установка системы у многих пользователей не вызовет лишних вопросов, поэтому подробно описывать этот процесс не будем. А последующая установка драйверов — другое дело. В VirtualBox есть специальный «диск с драйверами», который называется «Дополнения гостевой ОС» — его можно подключить через пункт меню.
Дополнения — это диск с драйверами, который загружается в виртуальный привод оптических дисков. В Windows-системах достаточно запустить файл autorun с диска, а под Linux — соответствующий скрипт. Главная выгода от установки гостевых драйверов — возможность произвольно менять размеры окна виртуальной машины, а разрешение экрана автоматически подстроится. А, ну и цвета станут повеселее: не 16 базовых, а 32 миллиона оттенков.
Настраиваем взаимодействие с хостом и сеть
Виртуальная машина с настройками «по умолчанию» получает доступ в интернет, но не имеет никакой связи с основным компьютером. А иногда эта связь нужна…
В настройках можно включить двусторонний буфер обмена. Он, правда, работает только с текстовой информацией, но упрощает ввод интернет-адресов и консольных команд. Для приема-передачи файлов можно настроить сетевые папки. Любая папка на хосте может быть подключена в виде сетевой папки в гостевой системе. Дополнительно можно выдать права гостевой системе на запись в эту папку и автоматически подключать папку в качестве диска при загрузке системы. Так, например, папка Downloads на хост-системе может быть доступна из гостевой системы через сетевое окружение по адресу //vboxsvr/Downloads или автоматически подключаться как сетевой диск.
Для экспериментов с Linux-системами и виртуальными серверами часто требуется доступ из хоста к веб-серверу, который запускается на гостевой ОС. Для этого нужно переключить режим сетевой карты с «NAT» на «виртуальный адаптер хоста» или же «Virtualbox Host-only Ethernet Adapter». В последнем случае у гостевой системы не будет личного доступа в интернет, но она сможет общаться с основным компьютером. Так, например, с хоста можно постучаться на файловый сервер, который работает на виртуальной машине.
В данном случае это специализированный linux-дистрибутив openmediavault для создания сетевого хранилища, который запущен в виртуальной машине с типом сетевого адаптера «только хост».
Проблемы с виртуализацией
Главная проблема — отсутствие вменяемой поддержки видеоадаптера и 3D-ускорения. На обычной хост-системе вы можете пользоваться новейшей видеокартой, но все ее преимущества в виртуальной машине будут недоступны. Впрочем, старые игры не особо требовательны к видео — в большинстве случаев справится и встроенный видеоадаптер процессора.
Второй момент — поддержка современного интернета старыми системами. Открыть любой сайт в системе, которая устарела лет на 10–20, может быть проблематично. Либо страница загрузится не полностью, либо не загрузится вовсе.
Виртуализируй это!
Виртуальные машины позволят вам изучить экзотические ОС на современном компьютере. Помимо множества современных Linux-дистрибутивов, это может быть:
Также можно установить старую версию Windows и попробовать покорить современный интернет. Во времена технологии Active Desktop в windows98 интернет был очень другим.
Что такое хост-машина
Хост (от англ. host — «хозяин, принимающий гостей») — любое устройство, предоставляющее сервисы формата «клиент-сервер» в режиме сервера по каким-либо интерфейсам и уникально определённое на этих интерфейсах. В более частном случае под хостом могут понимать любой компьютер, сервер, подключённый к локальной или глобальной сети.
Слово «хост» само по себе является практически жаргонным термином, и не несёт никакой информации об устройстве или его функционировании. Употребление слова «хост» имеет смысл только вместе с пояснением, хостом какого сервиса предполагается называемое устройство. Тем не менее, зачастую название сервиса опускают, предполагая, что оно очевидно из контекста.
Например, в реализации протокола USB управлением и координацией каждой группы клиентских устройств занимается отдельный USB Host Controller. В данном случае он выступает в качестве хоста протокола USB. С другой стороны, при выполнении, например, команды ping по произвольному IP-адресу хостом может называться компьютер, обладающий этим адресом, и предоставляющий сервис ответа на ICMP-пакеты. В этом случае такой компьютер выступит как хост сервисов ICMP.
Чаще всего, однако, под «хостом» без дополнительных комментариев подразумевается хост протокола TCP/IP, то есть сетевой интерфейс устройства, подключённого к IP-сети. Как и всякий другой хост, этот имеет уникальное определение в среде сервисов TCP/IP (IP-адрес). С хостом протокола TCP/IP может быть также связана необязательная текстовая характеристика — доменное имя.
В компьютерных играх и других сетевых приложениях, где подключение по сети создаётся динамически, под хостом обычно подразумевают того из участников соединения, который организует управление сеансом связи, в противовес остальным, которые подключаются к организованному им сеансу.
Виртуалка-камуфляж: Вредоносный подход к виртуализации
Виртуализация – это палка о двух концах
Победоносное развитие облаков в последние годы можно связать с постепенным совершенствованием сразу множества технологий, относящихся как к аппаратному, так и к программному обеспечению. Но, наверное, наиболее известна технология, в которой две эти области смыкаются: речь о виртуализации. Упрощенно говоря, виртуализация – это акт абстрагирования аппаратных компонентов (например, процессора, памяти, дисковых приводов, т.д.) и представления их на программном уровне, который динамичнее аппаратного и лучше масштабируется. Данная ключевая характеристика виртуализации располагает к созданию заказных, надежных, высоко доступных онлайновых сервисов, используемых по требованию – сегодня это называется «облако».
Однако, в этой великой технологии, выводящей на новые парадигмы, кроется и темная сторона. Есть производители облаков, годами извлекавшие пользу из того абстрагирования, что обеспечивается при помощи виртуализации и применяется, чтобы вас защитить, а есть и злоумышленники, вскоре осознавшие, как виртуализацию можно обратить против вас. В последние годы наблюдаются некоторые угрозы – одни из них лишь продуманы концептуально, другие уже встречаются на практике – применяющиеся при вторжениях для маскировки вредоносной активности. Это «деструктивная виртуализация» или, как мы ее называем, «виртуальный камуфляж».
Предыстория виртуализации
Как упоминалось выше, виртуализация – это акт абстрагирования аппаратного обеспечения. Но, чтобы лучше понять материал этого поста, нужно углубиться в тему немного сильнее. Итак, давайте перенесемся к тому моменту, с которого началась эпоха виртуализации. Идея виртуализовать аппаратное обеспечение не нова; ее корни можно проследить до 1960-х, когда IBM потратила немало сил на реализацию новой концепции под названием «разделение времени» (рис. 2).В простейшем виде концепция сводится к следующему: пользователи могут совместно использовать процессор благодаря непрерывному сверхскоростному переключению контекстов. К этой идее удалось прийти, заметив, что каждый пользователь успевает потребить лишь малую толику потенциала всего компьютера. Учитывая, что в те времена компьютер занимал целую комнату и стоил около 20 миллионов долларов США (с поправкой на инфляцию), казалось целесообразным использовать его на полную. Современная виртуализация опирается на тот же принцип – совместное использование ресурсов машины, но с поддержанием логического разделения.
Рис. 1: Пульт управления IBM 7094, где была впервые реализована концепция разделения времени (изображение принадлежит пользователю Wikipedia ArnoldReinhold, лицензировано под Creative Commons BY-SA 3.0)
С чего начиналась современная виртуализация
В статье «Formal Requirements for Virtualizable Third Generation Architectures« («Формальные требования к виртуализируемым архитектурам третьего поколения») Джеральд Попек и Роберт Голдберг ввели первую четко определенную модель виртуализации, заложившую основы концепций, применяемых по сей день (рисунок 3). В этой статье были представлены некоторые базовые требования к виртуализации, а также классифицированы и проанализированы различные машинные команды. Ниже в формате шпаргалки дан обзор вышеупомянутых концепций.
1971 Representation // Как виртуализацию видели в 1971
Modern Representation // Современное представление
VMM // Монитор виртуальной машины
VM // Виртуальная машина
Operating System // Операционная система
Virtual Machine // Виртуальная машина
Virtual Machine Monitor // Монитор виртуальной машины
Physical Machine/Hardware // Физическая машина/железо
Рисунок 2: Сравнение: представление Попека и Голдберга vs современное обобщенное представление (взято из usenix)
Глоссарий по виртуализации
Рисунок 3: Типы виртуализации
Bare metal hypervisors // Гипервизоры для голого железа
Hosted Hypervisors // Хостовые гипервизоры
Hardware virtualiaztion // Аппаратная виртуализация
Интуитивное представление о виртуализации
В вышеприведенном глоссарии, как и в любой шпаргалке, для полноты восприятия не хватает контекста, зато много модных словечек (см. рис. 4). Мы попытаемся обобщить важнейшие из перечисленных элементов, пожертвовав некоторыми деталями для большей ясности. Как понятно из глоссария, один из самых сложных участков работы при виртуализации связан с обработкой привилегированных/чувствительных инструкций.
Привилегированными называются такие инструкции, которые позволяют вызывающей стороне получить контроль над критически важными ресурсами. Они принципиально важны для защиты системы от вредоносных действий и неконтролируемых программ из пользовательского пространства. Таковы, например, инструкции HLT (контроль потока выполнения в CPU с возможностью приостановки), влияние на отображение в памяти путем инвалидации страничных записей в буфере ассоциативной трансляции (INVLPG) или доступ к специальным регистрам (RDMSR, WRMSR, MOV CR). Привилегированные инструкции могут предоставить неограниченный доступ хост-машине (например, контроль над всеми обработчиками прерываний).
Чувствительные инструкции можно трактовать как инструкции, привилегированные «с точки зрения» гостя. К их числу относятся такие операции как взаимодействие с устройствами ввода/вывода (IN/OUT), запись в регистры, отображаемые в память (MOV ) или такие инструкции, которые работают по-разному в зависимости от того, в каком кольце защиты выполняются; такова, например, запись в регистр EFLAGS (POPF). Чувствительные инструкции могут предоставить неограниченный доступ к гостевой машине (например, запись непосредственно в устройства ввода/вывода и получение хост-привилегий).
Кольца защиты применяются для перехвата привилегированных инструкций и активации ядра для обработки их выполнения. Однако не так давно еще не существовало аппаратной поддержки для подобного подхватывания чувствительных инструкций, что не обязательно представляет опасность для хоста, но вот для гостя – та еще точка отказов. Приемы, основанные на работе с программным обеспечением, в частности, эмуляция с использованием статической или динамической двоичной трансляции или паравиртуализации через модификацию гостя применяются, но ценой серьезного снижения производительности/гибкости.
В качестве решения была введена аппаратная поддержка для чувствительных инструкций, это было сделано путем добавления еще одного кольца безопасности (также называемого «кольцо 1» или «режим администратора»). Широкое распространение такая практика получила в 2005 и 2006, когда Intel и AMD представили VT-x и AMD-V, соответственно. Изначально оптимизация была очень проста, и лишь немногие операции по виртуализации обладали аппаратной поддержкой. Но вскоре такая поддержка распространилась и на многие другие операции, в частности, на виртуализацию блока управления памятью (MMU). В настоящее время виртуализация с аппаратной поддержкой является предпочтительным решением, так как обладает эксплуатационными достоинствами и повышенным уровнем безопасности, а также позволяет удерживать на минимуме издержки по производительности – что бесценно в облачной среде.
Виртуализуй и защищай
Рисунок 4: Стек KVM-QEMU и соответствующий поток (изображение представлено пользователем Википедии V4711, по лицензии Creative Commons BY-SA 4.0)
Важнейший довод в пользу виртуализации – использовать ресурсы по максимуму, в то же время, обеспечивая защищенность ресурсов, и их изоляцию друг от друга. Современные гипервизоры, оснащенные новейшими программными и аппаратными возможностями, позволяют создавать разнообразные изолированные виртуальные машины; от классических полнофункциональных операционных систем (скажем, Ubuntu) до современных минимальных MicroVM, выполняющих легковесные ядра (напр., Firecracker + OSv). Изоляция ресурсов, например, памяти, устройств файловой системы и ядра защищает от вмешательства взломанной гостевой VM как хостовую виртуальную машину, так и другие гостевые виртуальные машины.
Например, если на гостевой VM был успешно выполнен эксплойт ядра, и злоумышленник получил на ней права администратора, он все равно не пробьется через изоляцию. Если он не располагает уязвимостью гипервизора, то хост-VM и другие гостевые VM вторжением затронуты не будут, поскольку у них и у взломанной машины ядра отличаются. Как и любая другая стратегия защиты, виртуализация не решает всех проблем; с виртуализацией связаны и присущие только ей уникальные векторы атак. Вот несколько примеров специфических атак, направленных именно на уязвимость виртуализации:
Виртуализуй и атакуй
14 мая 2020 года эта теория как следует подтвердилась на практике, когда новости заполонили сообщения о новом штамме-вымогателе под названием «RagnarLocker.» Его жертвами стали крупные компании, работающие в сфере игр, энергетики и алкоголя. Небольшой VirtualBox, доверенный и снабженный цифровой подписью, выполнял маленькую виртуальную машину Windows XP (менее 500 мб), что позволяло ему тайно зашифровать и выудить данные с машины жертвы. Позже в том же году почти такая же стратегия была применена картелем «Maze«.
Во всех атаках, рассмотренных выше, использовался VirtualBox, и в качестве контейнера для вредоносов он довольно тяжеловесен. Кроме того, он не опирается на преимущества виртуализации с аппаратной поддержкой. Прежде, чем углубиться в тему, давайте подробнее рассмотрим, какими качественными аспектами виртуализации может воспользоваться злоумышленник:
Виртуализация с аппаратной поддержкой и KVM
Диверсионный функционал в нашем учебном проекте реализуется во многом при помощи гипервизора, находящегося как в пространстве ядра, так и в пользовательском пространстве. В этом исследовании мы экспериментировали с некоторыми свободными реализациями; подробный анализ их внутреннего устройства выходит за рамки этого поста.
Проще говоря, виртуализация с аппаратной поддержкой возможна благодаря двум дополнительным режимам работы процессора (привилегии администратора для VMM и их отсутствия для гостя), а также особым инструкциям Intel, написанным на ассемблере (для эффективного перехвата), которые в большинстве своем выполняются ядром. Вот несколько примеров:
К счастью, для тех, кто не хочет все строить с нуля, в современном ядре Linux поддерживается KVM (kvm.ko); этот модуль ядра фактически превращает ядро Linux в гипервизор. KVM предоставляет возможности Intel VT-x через интерфейс ioctl (2). Также KVM активно использует встроенные возможности ядра Linux для управления песочницами, которые (в усиленной версии) более известны как виртуальные машины.
История атаки
Такая атака подразумевает привилегированное использование скомпрометированной хост-машины с Ubuntu, на которой включена функция VT-x. Атака использует вредоносные информационные нагрузки (майнеры и вымогатели), незаметно выполняясь на скомпрометированном хосте, прикрытая самодельной виртуальной маскировкой (Рисунок 6)
Время засучить рукава! Для большей удобочитаемости мы пропустим некоторые фрагменты кода, а другие подробно разберем.Приглашаем вас полностью исследовать код к этой реализации, а также связанные с ним инструменты и информацию; все это лежит в репозитории, ссылка на который дана ниже.
Подготовка камуфляжа для уровня 1
Построим vCloak1, который позволит нам выполнить первый уровень нашей маскировки. Воспользуемся минимальной виртуальной машиной под Ubuntu (мы могли бы с тем же успехом скомпилировать Ubuntu для firecracker) с QEMU. Этот этап реализован при помощи vcloak1.sh, который автоматически выполняется предположительно привилегированной точкой входа:
Листинг 1: Строим уровень 1 виртуального камуфляжа, минимальный вариант Ubuntu на QEMU с virtiofs
В этот момент мы достигли первой границы виртуализации. Как только vCloak1 закгрузится, он выполняет vCloak2, конфигурирующий и выполняющий второй уровень нашего камуфляжа.
Подготовка камуфляжа для уровня 2
vCloak2 выполняет ядро VT-x с минимальной системной обвязкой (Unikernel) изнутри виртуапьной машины. Таким образом, наша гостевая виртуальная машина с уровня 1 также должна поддерживать KVM и VT-x (это легко проверить; см. листинг 2), поэтому он может служить в качестве отдельной хост-машины. Такая рекурсивная возможность известна под названием «Вложенная виртуализация».
Листинг 2: Проверяем KVM и собираем уровень 2 нашего камуфляжа
Второй уровень нашего камуфляжа реализован в виде скрипта vcloak2.py, который автоматически выполняется задачей crontab. Он выполняет три разные виртуальные машины с технологией firecracker, которые могут коммуницировать через разделяемый сокет. На каждой VM выполняется ядро Unikernel, передаваемое в виде «kernel.elf,» с единственным процессом, выполняемым из корневой директории (»/») файловой системы, передаваемой как «fs.img.» Чуть ниже мы объясним природу этих процессов, но пока просто опишем начальную настройку и выполнение типичной виртуальной машины с технологией firecracker.
Листинг 3: vcloak2.py выполняет три контейнера VT-x
Пока все нормально, но что же выполняют эти инстансы firecracker? Для затравки в истории об атаке уже упоминалось, что они выполняют приложения OSv. OSv – это свободное универсальное модульное ядро вида unikernel, рассчитанное на безопасную поддержку единичного немодифицированного приложения Linux в виде microVM поверх гипервизора, в результате чего получается минимальное ядро, совместимое с Linux на уровне двоичного кода. Такие решения как OSv – это, по сравнению с MicroVM, уже следующий шаг на пути к минимализму; когда по ядру unikernel создается на каждое приложение, получается приложение OSv с ядром, ужатым до сухого остатка.
Рассмотрим, как просто собрать приложение OSv из нативного кода на C++:
Листинг 4: Сборка и запуск простой программы на C, где OSv служит оберткой
Аналогично, можно собрать приложение OSv и на Python:
Листинг 5: Собираем и запускаем простую программу на python с OSv в качестве обертки
Как было кратко продемонстрировано выше, OSv – это мощный и легкий способ превращать обычные приложения в приложения Unikernel. В комбинации с микро-виртуальной машиной, например, с Firecracker (или даже с еще более мелкими вариантами аппаратной виртуализации), создается минимальная и при этом высокопроизводительная виртуализованная полезная нагрузка. Подробнее об этом отличном продукте рассказано на странице OSv в GitHub. На данном этапе все, что нам остается доделать – написать нужный код на python для каждого из трех приложений OSv, как мы и обещали.
Рисунок 6: Вложенная виртуализация порой бывает немного запутанной
Вложенная виртуализация
Мы рассмотрели, как уровень за уровнем создавался наш камуфляж, и проследили развертывание вредоносного ПО от первого привилегированного выполнения до создания множества минимальных ядер Unikernel, образующих второй уровень нашего камуфляжа. Эти ядра Unikernel (уровень 2) виртуализованы с применением VT-x, KVM и firecracker поверх другой виртуальной машины с Ubuntu (уровень 1), хотя, firecracker также может использоваться на этом уровне.
Такое «зачаточное» состояние достижимо благодаря вложенной виртуализации – возможности, поддерживаемой KVM. Такая виртуализация позволяет гостевой машине выступать в качестве хост-машины. В этой статье я весьма вольно употреблял термин «уровень камуфляжа», поэтому смысл данного термина, возможно, будет понятнее, е6сли сравнить его с терминами KVM для описания вложенной виртуализации (т.e., L1 – это виртуальная машина, исполняемая с физического хоста; L2 – это виртуальная машина, выполняемая с гостевой машины L1).
Создание майнера
В ходе описываемых исследований предпринималось множество попыток маскировки, создавались как опенсорсные майнеры, пригодные для реального использования, так и минималистичные инструменты такого рода, которые могут послужить только в качестве доказательства осуществимости. Для простоты картины быстро презентуем опенсорсный майнер, разработанный subhan-nadeem:
Листинг 6: Фрагменты кода из майнера
Создаем код вымогателя
Точно, как и в случае майнеров, на роль вымогателей было протестировано много решений. Но ради ясности мы рассмотрим PoC-версию вымогателя под авторством guihermej:
Листинг 7: Фрагменты кода из вымогателя
Создание извлекателя
Задача этого компонента проста. Он слушает ввод, поступающий либо от майнера, либо от вымогателя, после чего в безопасном виде отсылает его доверенным API (напр., Facebook). В данной части мы получаем так называемое «свободное закрепление SSL-сертификата». Опять же, стоящие перед нами задачи мы решим, воспользовавшись силой опенсорса. На этот раз мы базируем наш код на проекте с GitHub от zone13.
Листинг 8: Фрагменты кода Извлекателя
Повторение и анализ
Повторим, что нам удалось. В качестве доказательства осуществимости мы написали вредоносный код, который майнит, шифрует и выуживает данные из пораженного хоста. Первичная полезная нагрузка образует первый уровень камуфляжа (или виртуализации) при помощи микро-виртуальной машины на основе Ubuntu, которой, предположительно, доверяет хост.
Отсюда и в дальнейшем память всех различных процессов будет представлена как единый сплющенный двоичный блоб. Все вызовы API и экосистема ОС, заключенные в MicroVM, извне невидимы. На сертификатах MicroVM не отражается конфигурация хоста, эти сертификаты скрыты от хоста (в частности, это позволяет спрятаться от инструментов анализа трафика, воспользовавшись защитой SSL MITM).
Рисунок 7: Программный стек vCloak; цветными линиями обозначены границы отдельных областей виртуализации
Как только MicroVM завершит процесс загрузки, она загрузит три разных ядра Unikernel, основанных на VT-x и Firecracker, и в этих ядрах будет содержаться вредоносная логика. При помощи таких Unikernel-ядер в модель памяти вносится еще один уровень хаоса, не только потому, что здесь добавляется еще один слой виртуализации, но и потому, что у ядра Unikernel пространство пользователя и пространство ядра не отделены друг от друга. Из-за всего этого коверкания серьезно усложняется работа оператора первой хост-машины, который обнаружил первый слой камуфляжа и хочет обратить вспять его логику.
Получившееся в результате многоуровневое замаскированное вредоносное ПО не только коварно как никогда, но и имеет минимальный размер, и поэтому отлично портируется. Поскольку виртуальная машина предоставляет все окружение, снижается вероятность отказа из-за вычислимости или проблем с зависимости.
Дальнейшие исследования и оптимизация
Рисунок 8: Таблица для самопроверки
В вышеприведенной таблице показаны различные приемы (столбцы с рисунка 9), организованные по признаку аспектов атаки и целесообразности того или иного вектора атаки (первая строка с рисунка 9). Приемы, рассмотренные в этой статье, перечислены в зеленых клетках, а другие ракурсы, также затронутые нами в ходе исследования – в белых клетках. Прежде, чем мы попытаемся дать некоторые советы и завершить этот пост, давайте уделим внимание «укреплению» нашего вредоносного ПО с применением приемов, упомянутых в белых клетках вышеприведенной таблицы (рисунок 8).
Инструменты
Занимаясь исследованием виртуализации, я создал несколько инструментов, которые помогли мне в этих изысканиях:
Устранение угрозы
Вселенная виртуальных машин и операционных систем стремительно расширяется, новые программные и аппаратные возможности появляются одновременно. Исследование этих новых возможностей с точки зрения развертывания вредоносного ПО может помочь командам, занимающимся обеспечением информационной безопасности
Устранять некоторые вредоносные варианты поведения, замаскированные при помощи виртуализации, весьма сложно, поскольку в виртуализованном пространстве ничего не видно. Есть некоторые способы подсвечивать эти слепые пятна, но в настоящее время отсутствует стандартное или нативное решение такого рода. Правда, если исследовать всю цепь атаки, то можно обнаружить некоторые очень эффективные контрмеры, позволяющие противодействовать злонамеренной виртуализации.
Что можно сделать/доступные ресурсы:
Заключение
Виртуализация – это круто! На основании абстрагирования, обеспечиваемого при помощи виртуализации, построены многие инновационные вещи, в частности, облака, машины конечных точек и даже новейшие автомобили. Виртуализация усиливает производительность и безопасность вообще, но у нее есть и темная сторона. Как показали недавние реальные атаки, и как рассмотрено в этой статье, злоумышленник может обратить себе на пользу многие из возможностей виртуализации. Использование новейших технологий, в частности, VT-x и минималистичных песочниц, позволяет сделать виртуализацию еще более малозаметной.
Назначение vCloak – послужить практичным введением в проблему того, как виртуализация может использоваться для незаметного внедрения вредоносного ПО, чтобы пользователи были осведомлены в угрозах такого рода и могли от них защититься.
Также в статье упомянуты некоторые методы устранения таких угроз, доступные сегодня, плюс решения, планируемые в будущем. Важная возможность, которую следовало бы реализовать, чтобы защита от вредоносной виртуализации стала более подъемной задачей – повысить прозрачность процессов, творящихся в виртуальной машине, а также позаботиться об эффективной нейтрализации угроз. Индустрия киберзащиты развивается и идет в ногу с современными решениями для виртуализации, но сейчас самое время остерегаться подобных угроз и заблаговременно выстраивать защиту от них.
Облачные серверы от Маклауд быстрые и безопасные.
Зарегистрируйтесь по ссылке выше или кликнув на баннер и получите 10% скидку на первый месяц аренды сервера любой конфигурации!