О надёжном определении гипервизоров
2014-10-02 10:13 pmКогда-то в интернетах циркулировал код за авторством Joanna Rutkowska из Invisible Things Lab для определения виртуальных машин и гипервизоров, таких как VmWare и Virtual Box, с помощью выполнения некоторых инструкций супервайзора, случайно оказавшихся непривилегированными ещё со времён Intel i80286, таких как SIDT или SGDT. Он назывался Blue Pill, это аллюзия к фильму "Матрица" братьев Вачовски.
Всевозможные гипервизоры и виртуальные машины быстренько подстроили адреса своих дескрипторов под таковые для гостевых ОС или внесли соответствующие инструкции в перечень программно-эмулируемых, и Blue Pill перестал работать.
В этом смысле интересна инструкция RDTSC. Гипервизор может её перехватывать или не перехватывать. Для этого существует соответствующий бит в CR4, который превращает эту инструкцию в привилегированную. Если инструкция не перехватывается, тогда гипервизор можно засечь по большой дисперсии выборки Δt (процессорные "часики" идут рывками). Если инструкция перехватывается, тогда на генерацию соответствующего прерывания, выполнение эмулирующего кода и выход обратно будут уходить тысячи машинных циклов против типично десятков в нормальном режиме. Обычно они её перехватывают, для поддержки того, что по-английски называется virtual machine live migration.
Всевозможные гипервизоры и виртуальные машины быстренько подстроили адреса своих дескрипторов под таковые для гостевых ОС или внесли соответствующие инструкции в перечень программно-эмулируемых, и Blue Pill перестал работать.
В этом смысле интересна инструкция RDTSC. Гипервизор может её перехватывать или не перехватывать. Для этого существует соответствующий бит в CR4, который превращает эту инструкцию в привилегированную. Если инструкция не перехватывается, тогда гипервизор можно засечь по большой дисперсии выборки Δt (процессорные "часики" идут рывками). Если инструкция перехватывается, тогда на генерацию соответствующего прерывания, выполнение эмулирующего кода и выход обратно будут уходить тысячи машинных циклов против типично десятков в нормальном режиме. Обычно они её перехватывают, для поддержки того, что по-английски называется virtual machine live migration.