Как VirtualBox обрабатывает сбои страниц с поддержкой аппаратной виртуализации и без нее? - PullRequest
1 голос
/ 07 апреля 2019

VirtualBox - это гипервизор типа 2, в котором ядро ​​полностью виртуализировано и работает в кольце 1 или, если доступна аппаратная поддержка, работает в режиме без корня кольца 0.Узнав, что гостевые операционные системы не могут быть полностью виртуализированными на 64 бита, если поддержка аппаратной виртуализации недоступна, сразу становится понятно, почему не будет места для таблиц теневых страниц в контексте текущего процесса или состояния виртуального процессора и т. Д.

Для полной виртуализации без поддержки аппаратной виртуализации (32-разрядная гостевая система) одна мысль, которая пришла в голову, заключается в том, что гипервизор может перезаписывать PTE в своем пространстве ядра по виртуальному адресу, где ОС хоста устанавливает свою IDT, чтобы указывать на установленную IDT гипервизора.,Это может быть сделано, поскольку гость будет использовать только нижние 4 ГБ.Должен быть способ сделать это, хотя Windows не позволяет отображать файл на базовый адрес в пространстве ядра.Если бы он мог поместить свою собственную IDT в тот же виртуальный адрес ядра, то любые исключения в контексте процесса динамического перекомпиляции / гипервизора будут обрабатываться IDT гипервизора и указывать на код гипервизора, который может имитировать исключение в гостевой системе и заполнять виртуальный.cr2, но при повторной попытке сбойной инструкции снова произойдет сбой страницы, и обработчик исключений гипервизора распознает, что гость уже выполнил сопоставление (возможно, из ранее установленного и не очищенного флага), поэтому он выполнит сопоставление в SPT.Гипервизору также необходимо смоделировать кольцо 0 для гостя с гостевым CPL, когда он перехватывает программное прерывание или до того, как имитирует доступ к IDT сбоя страницы и потенциально вставляет прерывание в дескриптор кольца один в IDT гипервизора, чтобы отразить изменение в ЦП.,Не то чтобы это даже нужно.Когда он сталкивается с привилегированной инструкцией, он потенциально перекомпилирует ее в программное прерывание в дескриптор гипервизора кольца 0, который будет выполнять действие с физическими регистрами виртуального оборудования / программы.Я не уверен, как еще это все это делает, и это кажется угрозой безопасности, потому что гипервизор может привязать любой старый код к обработчику исключений или заставить дескриптор звонить 0, и он будет немедленно запущен в кольце 0 плюс, позволяя процессуизменение его карты ядра привело бы к таким аппаратным лазейкам, поэтому я не уверен, как можно договориться о доверии с ядром хоста.

Для полной виртуализации с аппаратной поддержкой без EPT 64-битный гость занимает всю виртуальнуюНасколько мне известно, адресное пространство процесса означает, что SPT и виртуальное оборудование необходимо переместить в другое адресное пространство процесса гипервизора, а cr3, используемый для гостевого процесса, - это процесс гипервизора.Отказ страницы вызывает выход виртуальной машины (настроенный в VMCS) к точке входа гипервизора (RIP).В гипервизоре типа 1, таком как VMware ESXi, это нормально, потому что гипервизор имеет полный контроль над этим, но в сценарии Virtualbox гипервизор представляет собой процесс пространства пользователя в операционной системе хоста, которому будет разрешено работать в кольцевом режиме корневого режима vmx 0 и указывать RIP.,Конечно, это означает, что если вредоносное ПО влияет на процесс VirtualBox, оно может получить полный контроль над системой и памятью ядра операционной системы?

В любом случае, гипервизор видит, что это код ошибки страницы в VMCS, и тогда я предполагаю, что он имитирует исключение для гостя. Не уверен, как он это делает, но, возможно, он записывает фрейм-ловушку в стеке ядра, указанном в виртуальном TSS гостя (что он может сделать, поскольку процесс гипервизора cr3 аналогичен гостевому процессу cr3), и заменяет RSP в карте состояний VMCS. , замените другие регистры, замените RIP / CPL на тот из виртуальной IDT для гостя, вставьте cr2, а затем VM Resumes. (Windows может преобразовать cr2 в PTE, используя MiAddressToPte). После обработки он снова попытается получить доступ к памяти, а затем снова произойдет сбой страницы, поскольку настоящее сопоставление не было выполнено. Это приведет к выходу из ВМ, и гипервизор должен будет распознать это условие, используя ранее установленный и не очищенный флаг, и обновит SPT и VMRESUME.

Если EPT поддерживается, то гость использует реальный cr3 и может получить доступ без вмешательства гипервизора, поскольку он работает в режиме vmx без полномочий root. Когда имеется ошибка страницы, гость может обновить это отображение, и гипервизор не должен вмешиваться, обычные ошибки страницы не вызывают выход виртуальной машины. При повторной попытке доступа сбой EPT вызовет выход виртуальной машины с EPTP-эквивалентом cr2 и указателем на гипервизор EPTP для гостя. Затем он обновит свое отображение и VMRESUME в RIP ошибочной инструкции. Таким образом, выход из виртуальной машины происходит 1 раз вместо 3.

Может кто-нибудь добавить или исправить мое мышление здесь?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...