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) = (unsigned)m; ((void(*)())&rpill)(); return (m>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 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
Категория:Виртуализация