我想知道虚拟机的主机系统(在我的例子中是 VM - VirtualBox OSE)执行恶意软件是否安全。
病毒能否爆发并从主机系统读取或写入数据?如果我在 VM 中禁用它,它可以建立 Internet 连接吗?
虚拟机是一个安全的环境来尝试找出病毒的作用吗?
如果我将内存减少到总实际内存的 1/4 左右,叉子炸弹可以“杀死”主机系统吗?它可以使用多少 CPU 时间/资源?
我想知道虚拟机的主机系统(在我的例子中是 VM - VirtualBox OSE)执行恶意软件是否安全。
病毒能否爆发并从主机系统读取或写入数据?如果我在 VM 中禁用它,它可以建立 Internet 连接吗?
虚拟机是一个安全的环境来尝试找出病毒的作用吗?
如果我将内存减少到总实际内存的 1/4 左右,叉子炸弹可以“杀死”主机系统吗?它可以使用多少 CPU 时间/资源?
从理论上讲,客户系统完全被虚拟机隔离,甚至无法“看到”主机,更不用说攻击它了;因此来宾无法脱离虚拟机。当然,在实践中,它偶尔会发生(网络存档链接)。攻击需要利用 VM 实现中的安全问题(即会产生严重后果的编程错误),或者可能利用 VM 所依赖的硬件功能。数据离开虚拟机的出口路径很少;例如,对于 Internet 访问,VM 正在模拟一个虚拟网卡,它只处理最低级别的数据包,而不是完整的 TCP/IP——因此,大多数 IP 堆栈问题仍然局限于 VM 本身。因此,导致 VM 爆发的错误往往很少发生。
VM 对某些类型的攻击非常有效,例如分叉炸弹。从主机系统的角度来看,VM 是一个单一的进程。来宾中的分叉炸弹将使来宾操作系统中的调度程序瘫痪,但对于主机而言,这将是完全无害的。内存也是如此:VM 模拟具有给定 RAM 数量的物理机器,并且将需要大约该数量的“真实”RAM 来有效地备份它。无论来宾做什么,VM 都不会独占更多的 RAM。(您仍然希望将 VM RAM 大小限制为最多为物理 RAM 大小的 1/2,因为额外的“真实”RAM 对于磁盘缓存很方便;并且主机操作系统也需要使用一些。)
免责声明:我将寻求相对较高的理解。如果您想要详细的指南,那超出了范围。此外,还有其他方法(完全在软件中)来实现不适用的虚拟机。我还专注于仅通过虚拟化机制“突破” - 即不是那些可以在实际硬网络主机上发生 PC 到 PC 的机制。
我喜欢细节,所以我们在这里做一些。首先,codeproject 对x86 CPU 的不同模式(真实、受保护和长)和虚拟化的使用有一些优秀的汇编器参考。有一个Intel VT 博客(我不确定 Intel 是否会写这篇文章),最后,Rootkit Arsenal的第一部分专门解释 x86,是一本优秀的读物,配有演练和漂亮的图表。理解这一切需要耐心,所以我将在这里做一个非常简单的介绍它是如何工作的。
我们运行 DOS 时的震撼方式
DOS 和早期的 16 位实模式系统运行分段内存模型。无法控制段的大小,并且这些段中的任何一个都没有保护开关。代码被加载到一段内存中并运行;它可以跳转到其他段,因此任何代码,任何地方都可以更改任何内容,包括生成 TSR(终止并保持驻留)代码段,只需将 IVT 条目(中断向量表)之一指向其空间中的地址,在执行原件之前。基本上没有保护。没有任何。纳达。
32位保护模式的兴起
保护模式很快变得复杂。它包含三个部分——分段、分页和 PAE。每个都需要一个数据表来告诉 CPU 那个段、页或帮助它扩展地址空间 (PAE)。其中包括实现进程隔离的著名环形标志(它们适用于段和页面)。分页是您将数据从 RAM 加载到磁盘并创建诸如虚拟内存之类的奇特事物的方式(请参阅虚拟这个词!我们到了!)
长模式
长模式消除了分段,并简单地要求 PAE/分页结构。同样,为了完全简化操作系统的实现,分页由内存中的结构控制,然后通过特殊指令进行设置。瞧,可以通过正确的设置实现进程隔离。再一次,我有点轻描淡写......
给我虚拟化!
好的。虚拟化是相同的一般概念。虚拟机是使用虚拟机控制结构设置的,这些控制结构决定了它们的内存如何映射回物理内存,有点像分页。至关重要的是,在某些情况下,虚拟机将需要向主机操作系统请求一些东西,有点像进程隔离,有点像软件中断。这些被称为 VM 出口并向主机提供信息,例如退出时的寄存器状态。有点像系统调用。
一个恶意软件可以突破虚拟机吗?
因此,就虚拟机而言,主机操作系统拥有自己的所有内存空间,并且可以随意被感染/损坏/破坏。
在直接影响主机内存方面,虚拟机不能,因为它看不到。主机必须将所需内存映射到虚拟机空间。它还必须在该内存空间中实现从 BIOS 开始的所有内容。为了与某些主机设备进行某些任务的通信,主机必须设置这些 VM 退出条件,并且目标 VM 必须触发它们。发生这种情况时,控制权将转移到主机。
因此,有两个可能的风险领域:
这将引导您进入您的漏洞利用机制。您需要在 VM 退出例程中处理错误,然后您需要能够说服该代码执行一些内存,理想情况下是您刚刚从来宾 vm 放入页面的代码。完成后,告别堪萨斯。
正如 Tom Leek 所说,VM 在防御叉形炸弹方面非常有效。与操作系统可以限制进程可以分配多少内存的方式类似,因此它可以限制映射到 VM 的内存量。用完并且客户操作系统认为它的物理内存不足;除非您实施 VM 退出来执行此操作,否则主机不会分配更多,这会有点危险,我不相信这已经完成。
这可能性有多大?
不是特别的。这完全取决于那些 VM 退出实现,或者从主机上的来宾读取内存,而您的读取代码中有一个很好的错误。它还要求该错误将允许您以这样一种方式控制崩溃,即您可以强制执行到您的主机持有的内存地址。VM 出口必须能够访问该内存。
我没有涵盖什么?
最后,我之前说过进程隔离是沙盒的一种形式。阅读那个答案和这个答案,你现在应该能够理解我为什么这样定义它们了。x86 中的进程隔离和虚拟机之间有显着的相似之处。
更新
因此,我对此进行了更多研究,尤其是对蓝色药丸的研究。我所描述的是一个非常简单的高级视图。我发现了更多细节。这是Invisible Things Lab专门针对它的一整篇论文。事实证明,他们的防御讨论包括拒绝从环 0 对用户模式页面的执行访问的概念,从而防止直接执行虚拟机已放入内存的数据。事实证明,这是在 Intel CPU 中实现的,并且补丁当前存在于 Linux 内核中。因此,根据具体情况,这种性质的攻击很可能会变得更加困难,即使存在漏洞利用。
我在虚拟机中做了很多恶意软件实验——主要是使用 backtrack4 从一个主机闯入下一个主机。我主要是 VMware Workstation 用户。
最大的问题来自您的虚拟机的网络连接可能会转移回您的主机操作系统。您想完全禁用网络和/或使用无法访问您的主机的网络。
限制内存是一个很好的最佳实践。我一般保持在四分之一左右,和你一样。CPU 时间受限于内核数量或(如果您的软件中有更细粒度的控制)为特定 VM 定义的 CPU 时间百分比。
能够突破虚拟环境的有针对性的攻击确实存在并且在商业上是可用的——例如@Hendrick 提到的 cloudburst——但相对较少。及时更新您的虚拟化补丁是一个非常好的主意。
除了这里关于病毒是否可以逃出虚拟机的所有有用信息之外,让我指出另一个需要考虑的问题:
恶意代码有可能检测到它是否在虚拟机内部执行。这通常被称为虚拟机检测或“红色药丸”,并且有许多可用的 技术。
此外,一些病毒和其他恶意软件使用这些技术来检测它们是否在 VM 中运行,如果是,则关闭它们的有效负载(避免采取任何恶意行为)。他们这样做是为了让人们更难对恶意软件进行逆向工程或检测它。
因此,VM 不是找出恶意软件做什么的好方法。恶意软件可能无法突破虚拟机,但与此同时,它在虚拟机内部运行时可能不会做任何事情。如果您在 VM 中运行它并看到它什么也没做,确定它是无害的,然后决定在 VM 之外运行它——您可能会被拥有。在外面小心点。