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-го кольца защиты).

В принципе, подобный подход вполне срабатывал в однопроцессорных системах, но Рутковская считала, что его можно использовать и для систем с несколькими процессорами или ядрами, для которых необходимы более сложные проверки, за счёт проверки соответствующих контекстов.

Недостатки

К сожалению, функционал программы обладал серьёзными ограничениями, поэтому программа являлась в большей степени демонстрацией лежащих в её основе идей, нежели полноценным ПО. Это стало одной из причин, по которой разработка программы была прекращена.

Значимость

После выхода программы последовала масса критики, причём вполне обоснованной. Но, вместе с тем программа вызвала и интерес специалистов. После прекращения поддержки программы Йоанной, сама идея программы была использована в других проектах, разрабатываемых уже другими исследователями.

Ссылки