为什么 VirtualBox 客户内核在 ring 1 而不是 ring 3 中运行?

为什么 VirtualBox 客户内核在 ring 1 而不是 ring 3 中运行?

什么时候虚拟盒运行于x86平台,根据文档

什么时候硬件虚拟化(即 VT-x 或 AMD-V)已启用,虚拟机管理程序(即 VirtualBox 本身)在VMX 根模式(又名环-1),并且虚拟机运行在VMX 非根模式(又名环 0)其他虚拟机管理程序也是这样工作的。

另一方面,当硬件虚拟化不可用时,软件虚拟化而是使用客户内核运行环 1。 从第10.6节上面的链接:

  • 客户环 3 代码尽可能不加修改地全速运行......

  • 对于环 0 中的客户代码,Oracle VM VirtualBox 采用了一个巧妙的技巧。它实际上重新配置了客户机,以便其 ring-0 代码在 ring 1 中运行(通常不用于 x86 操作系统)。因此,当客户机 ring-0 代码实际在 ring 1 中运行时,例如客户机设备驱动程序尝试写入 I/O 寄存器或执行特权指令时,“真实”ring 0 中的 Oracle VM VirtualBox 虚拟机管理程序可以接管

...

  • 在 Ring 1 中运行 Ring 0 代码会导致很多额外的指令错误,例如ring 1 不允许执行任何特权指令,其中客户机的 ring-0 包含大量此类错误。对于每个此类错误,VMM 都必须介入并模拟代码以实现所需的行为。虽然这种方法可行,但模拟数千个此类错误非常昂贵,并且会严重损害虚拟化客户机的性能。

这很有趣,因为这是我遇到的唯一一个环 1 的应用。

根据上面引用的部分,即使客户机内核在 Ring 1 中运行,当客户机设备驱动程序尝试写入 I/O 寄存器或执行特权指令时,VirtualBox 虚拟机管理程序 (Ring 0) 也需要接管。因此,无论客户机内核是在 Ring 1 还是 Ring 3 中运行,由于软件虚拟化而导致的性能损失似乎都是相同的。

我确实遇到过因此帖子说:

Ring 1 和 Ring 2 在某种程度上“大部分”是特权级的。它们可以访问管理页面,但如果它们尝试使用特权指令,它们仍然会像 Ring 3 一样进行 GPF。因此,对于驱动程序来说,这并不是一个糟糕的位置,正如英特尔计划的那样……

问题

  1. 运行 Ring 1 而不是 Ring 3 中的客户内核如何提高性能。

  2. 在环 1 中运行客户内核(并因此授予客户内核“访问主管页面的权限”)有哪些安全隐患?

答案1

我从 freenode 上的 #vbox-dev 以及其他在线资源的人们那里得到了一些非常有用的答案。

  1. 它不会提高性能。如 VirtualBox 文档中所述,客户机用户空间在 ring 3 中运行,客户机内核空间在 ring 1 中运行。这样可以通过分页保护客户机内核空间免受客户机用户空间的影响(见幻灯片 19)。下面解释一下如何使用分页来实现这种保护。

    https://manybutfinite.com/post/cpu-rings-privilege-and-protection/

    每个内存页都是一个字节块,由页表条目描述,其中包含两个与保护相关的字段:一个管理标志和读/写标志。主管标志是内核使用的主要的 x86 内存保护机制。当它打开时,页面无法从 ring 3 访问。虽然读/写标志对于强制执行特权并不那么重要,但它仍然有用。

  2. 好消息是,客户无法执行特权指令,因为只有 ring 0 可以执行特权指令。坏消息是,在 64 位系统上,ring 1 可能可以访问主机的内存页面。这是因为在 64 位模式下,段限制不再适用,因为分割大部分已被取代分页。不幸的是,在内存隔离方面,分页不区分特权级别 0-2。这个问题被称为环压缩见幻灯片 19)。

    https://cseweb.ucsd.edu/~jfisherogden/hardwareVirt.pdf

    环压缩

    为了在虚拟机之间提供隔离,VMM 在 ring 0 中运行,而虚拟机则在 ring 1 中运行(0/1/3 模型)或环 3(0/3/3 模型)。0/1/3 模型虽然更简单,但是在支持 x86 架构 64 位扩展(AMD64 和 EM64T)的 CPU 上以 64 位模式运行时无法使用。

    为了保护 VMM 免受客户操作系统的影响,可以使用分页或段限制。但是,64 位模式不支持段限制,x86 上的分页不区分环 0、1 和 2。这会导致环压缩,其中客户操作系统必须在环 3 中运行,不受用户应用程序的保护。

    上段指出,在 64 位系统上,由于分段被删除,客户机内核和客户机用户空间必须跑进环 30/3/3 模型)以保护主人免受客人的侵害。然而参见第 37 页这表明有可能维持0/1/3 模型并阻止 ring 1 通过非常复杂的方式访问主机二进制翻译(BT)。也许这就是 VirtualBox 实施的策略?

重要的是要记住,整个讨论只涉及完整软件虚拟化因此非常过时,因为很少有 CPU 不支持硬件虚拟化. 作为一名来自#vbox-dev指出。

软件虚拟化但它正逐渐消亡。很少有 CPU 不支持硬件虚拟化。在某个时候,我们必须做出一个艰难的决定——让代码存活需要时间和金钱。

答案2

有关的:https://stackoverflow.com/a/58611521/7194773

它在 ring 1 中运行,因为客户操作系统代码直接在 CPU 上执行。如果客户内核设为 ring 0,则客户内核中的恶意内核模式驱动程序可以通过更改 cr3 来读取主机内核内存。如果控制代码以 ring 1 从虚拟机管理程序返回(通过在主机内核堆栈上设置 ring 1 CPL),则移动到 cr3,或者实际上任何其他可以利用主机操作系统的特权指令,都会导致由虚拟机管理程序挂载的硬件异常陷阱。

相关内容