Red Pill
Red Pill — реализация метода обнаружения формы виртуализации, реализуемой программой Blue Pill. Red Pill основывается на отслеживании обработки вызовов x86-архитектуры. Обе программы (и Blue Pill, и Red Pill) разработаны Йоанной Рутковской.
Название «Red Pill» является отсылкой к сцене в фильме «Матрица», в которой главному герою на выбор предлагают красную и синюю таблетки. Выбор красной пилюли позволяет герою осознать виртуальность своего привычного мира и выйти в мир реальный. Аналогично, применение Red Pill позволяет операционной системе обнаружить использование гипервизора, то есть выявить виртуализацию. Это позволяет как системному администратору, так и операционной системе принять соответствующие меры, например, заблокировать гипервизор или взять его под контроль. Именно в этом и проводится параллель с фильмом, причём Blue Pill, в свою очередь, намекает на применение синей пилюли, в результате чего операционная система не понимает, что используется виртуализация и считает, что работа проходит для неё естественным образом.
Механизм
В x86-архитектуре используются указатели на выделенную память. Как правило, память организована в виде таблицы адресов памяти с адресами и смещениями, при этом более старые записи обладают меньшим смещением от базового адреса.
Операционной системе для работы необходим доступ к так называемой таблице векторов прерываний. Начиная с процессора 80286, адрес в физической памяти этой таблицы хранится в 48-битном регистре IDTR.
Поскольку регистр (Interrupt Descriptor Table Register, сокр. IDTR) находится под контролем операционной системы, то создаётся альтернативная таблица, с которой работает гипервизор. Для этой новой таблицы выделяется отдельное место в памяти с более старшим адресом, чем у оригинальной таблицы, и этот более старший адрес записывается в IDTR. Рутковская обнаружила, что адрес IDTR с старшим байтом более 208 (или D0 в шестнадцатиричной системе) указывал на факт перезаписи IDTR более старшим адресом для таблицы прерываний, то есть сравнив значение старшего байта указателя из IDTR с D0 можно было сделать вывод о присутствии гипервизора. Значение указателя из IDTR считывалось при помощи команды SIDT.
Код Рутковской для данной проверки выглядел так:
int swallow_redpill () { unsigned char m[2+4], rpill[] = "\x0f\x01\x0d\x00\x00\x00\x00\xc3"; *((unsigned*)&rpill[3]) = (unsigned)m; ((void(*)())&rpill)(); return (m[5]>0xd0) ? 1 : 0; }
Значение \x0f\x01\x0d\x00\x00\x00\x00
— это команда SIDT, которая имеет формат 0F010D<адрес>, \xc3
— команда RETN. Результатом выполнения команды является запись по указанному адресу значения указателя из IDTR. Интересной особенностью этой команды является то, что она может быть вызвана не привилегированным клиентским кодом (3-го кольца защиты).
В принципе, подобный подход вполне срабатывал в однопроцессорных системах, но Рутковская считала, что его можно использовать и для систем с несколькими процессорами или ядрами, для которых необходимы более сложные проверки, за счёт проверки соответствующих контекстов.
Недостатки
К сожалению, функционал программы обладал серьёзными ограничениями, поэтому программа являлась в большей степени демонстрацией лежащих в её основе идей, нежели полноценным ПО. Это стало одной из причин, по которой разработка программы была прекращена.
Значимость
После выхода программы последовала масса критики, причём вполне обоснованной. Но, вместе с тем программа вызвала и интерес специалистов. После прекращения поддержки программы Йоанной, сама идея программы была использована в других проектах, разрабатываемых уже другими исследователями.
Ссылки
- The Invisible Things: Red Pill… or how to detect VMM using (almost) one CPU instruction Архивная копия от 11 сентября 2007 на Wayback Machine (англ.)
- Detecting the Presence of Virtual Machines Using the Local Data Table (англ.)
- Analysis of the Intel Pentium’s Ability to Support a Secure Virtual Machine Monitor (англ.)