为确保虚拟化域不会危及其主机而采取了哪些安全预防措施

信息安全 虚拟化 沙盒
2021-08-23 13:53:27

我最近开始学习 xen 并对可视化变得更感兴趣。我阅读了一些白皮书,在这里进行了搜索,但找不到答案。我的猜测是有人会将我链接到一些有用的文档。

假设我在 xen 中使用 domU(或任何平台上的虚拟机)。

计算机如何防止虚拟机执行任意指令?

由于 dom0 或主机必须执行 domU 需要的指令……这不是很容易吗?

你怎么可能验证某些东西是沙盒的?并且(再一次用不同的词)沙箱化这些步骤是什么?

3个回答

虚拟机的实现是内核的内核。

在典型的操作系统中,有应用程序代码(又名“用户空间”)和内核代码他们使用相同的指令集;但是,CPU 在任何时候都知道它是在执行应用程序还是内核代码。当应用程序代码尝试执行一些访问硬件的操作码(x86的操作码in和操作码)时,CPU 会陷入陷阱:它会暂时跳转到内核代码(该代码的地址注册在特定表中)。内核代码决定如何处理访问(授予它、修改它、终止应用程序进程......)。如果内核代码决定授予访问权限,或者内核阻止它但假装out 执行它,然后应用程序代码可以相信它可以直接访问硬件。

同样,当应用程序代码在内存中读取或写入数据时,它使用内存的抽象:通过MMU映射到物理内存(或不...)的虚拟地址空间MMU 使用内核填充的表(当然,内核注意不要使这些表成为应用程序代码可见的地址空间的一部分)。这样,应用程序就处于一个神奇的世界中,它独自在一个大地址空间中,而实际上有几个并发执行的应用程序,它们彼此看不到。

虚拟机使用相同的结构,上一级。当内核访问硬件或 MMU 时,它实际上会受到虚拟机实现(管理程序)的审查,该实现会捕获不需要的访问。

细节差异很大。主要区别在于内核是否知道它在虚拟机中运行。使用Xen,内核是有意识的;它知道自己处于上位神(虚拟机管理程序)的控制之下,并且不会尝试直接接入硬件;相反,它通过专用界面很好地询问。使用VirtualBox,内核不知道;客户操作系统认为它运行在真正的硬件上,而虚拟机努力工作来维持这种错觉。

在实施虚拟化的方式(即管理程序如何捕获内核代码)上可以做出其他差异。最近的 x86 处理器通过专用操作码提供了一些特定的支持较旧的 x86 处理器,在 32 位模式下,可以使用旧保护机制的各种残余(大部分是段寄存器和四个“环”)(这些已从 64 位模式中删除,这就是为什么 64 位 VM 必须使用 AMD-V/VT-x)。其他技术包括模拟每个虚拟化操作码(对于整个模拟机器或其中的一部分),可能使用或多或少的动态转换(也称为 JIT 编译),就像QEMU在跨 CPU 情况下所做的那样。

关于这个主题有一个完整的术语(虚拟化、半虚拟化、仿真、模拟、管理程序……),这些术语并不是完全一致的,而且通常是拜占庭式的。一些坚持某些特定术语学说的读者可能对我使用这些术语的松散方式有些恼火。

从概念上讲,虚拟机是一个模拟器。您是否见过任天堂模拟器,您将旧的任天堂游戏放入其中并模拟任天堂控制台?它的工作原理是这样的:模拟器反复读取游戏中的指令,然后模拟执行该指令的效果(模拟任天堂硬件,但使用计算机上运行的软件),等等。

虚拟机就是这样,除了模拟 Nintendo 硬件,它模拟 Intel x86 硬件。虚拟机从来宾读取指令,模拟其效果(在沙箱内),然后继续执行下一条指令。由于仿真是由软件完成的,因此可以编写软件来检查指令的效果是否留在沙箱内。

从概念上讲,这就是虚拟机的工作方式。实际上,虚拟机不会那样工作。仿真非常慢,因此虚拟机使用各种方法使进程运行得非常快。许多现代处理器包括对虚拟化的硬件支持,以使虚拟机尽可能快地运行。但是你可以把它想象成一个巨大的、honkin'、神奇的快速 CPU 模拟器,这会给你正确的直觉。

因此,从概念上讲,这就是虚拟机如何确保来宾无法逃离沙箱的方式。虚拟机可以检查每条指令的效果,确保它不会逃逸,只有在一切正常的情况下才执行该指令。

有关此主题的更多信息,我建议阅读本网站上的以下问题:

这将取决于虚拟化的类型,硬件虚拟化(Xen、ESX、Hyper-V)就像 DW 所说,没有问题。

然而,使用内核虚拟化(LXC、openVZ)仍然存在越狱的风险。使用 openVZ 并没有最近报告的攻击主机的漏洞,但是使用 LXC 有。

从安全角度来看,我建议使用硬件虚拟化而不是内核虚拟化。