像 VirtualBox 这样的虚拟机是否可能存在安全漏洞“spectre”?我认为虚拟机可能执行无序操作,但我认为不可能查看缓存来读取结果。
能否解释一下如何读取虚拟 CPU 的缓存?
答案1
是的,Spectre 可以跨越主机/客户机、客户机/主机和客户机/客户机边界,因为这是一个 CPU 级别的缺陷,这意味着潜在的敏感信息可能在 CPU 核心上运行的任何东西上泄露。
互联网上的大多数新闻报道都谈到云提供商受到的打击最严重,因为他们拥有大量虚拟化的系统集群,可能会被滥用来泄露敏感信息。
大多数大型供应商现在应该已经尽力修复了这些漏洞,但这个问题还会伴随我们一段时间。
Security.SE 有一个经典问答关于这一点,它提到了VM:
我正在运行虚拟机/容器,我的脆弱程度有多大?
- Meltdown 攻击不会跨越虚拟机,只会将内核内存泄漏到本地进程。
- Spectre 可以跨虚拟机工作。
另外,来自斯特芬再次,Meltdown 和 Spectre 与容器一起工作,因为容器依赖于主机内核。
虚拟机使用系统中的实际 CPU,并捕获一些特权指令,并可重定向。它使用与主机相同的缓存和指令。它本质上只是系统中物理 CPU 内的另一层。
虚拟化之所以快速,是因为它尽可能少地使用物理 CPU,并依靠 CPU 硬件来提供隔离。像 qemu 这样的东西可以做到仿真因为它不是硬件 CPU,所以会更安全,但它很多速度较慢,并且与虚拟化不同。
来自Security.se 规范帖子再次:
Spectre 的工作层级不同,不允许从用户空间访问内核空间数据。在这种攻击中,攻击者会欺骗推测执行,使其预测性地错误执行指令。简而言之,预测器被强制预测特定的分支结果(if -> true),这会导致请求受害进程通常不会请求的越界内存访问,从而导致错误的推测执行。然后通过侧信道检索此内存的值。这样,属于受害进程的内存就会泄露给恶意进程。
因此,由于虚拟机运行在实际的 CPU 硬件中,它所需要做的就是运行一个特定的循环来“训练”推测执行引擎。然后它可以使用精确的时间来观察缓存中特定的访问模式,这些模式表明它希望利用的主机或客户机(或其他虚拟机)进程。
这样就意味着一台机器可以在各个方向被利用。从主机到虚拟机,从虚拟机到主机,从虚拟机到虚拟机。
是的,这绝非易事,而且很难实现,因为虚拟机 CPU 核心可能会随主机的意愿而变化,主机也可以愉快地在不同的核心上安排任务,但经过很长一段时间,可能会泄露足够的信息,从而泄露一些重要系统或帐户的密钥。只要有足够的时间和一些适当的隐秘软件,一切都可能公开。
如果您想要一个“安全”的虚拟机,那么您必须保证其核心是隔离的。阻止这种攻击的唯一真正方法是“强制”主机和虚拟机仅使用某些核心,以便它们永远不会在同一硬件上运行,但这会导致成本的有效增加,因为您将无法在给定主机上拥有尽可能多的虚拟机。您永远无法运行比可用核心更多的虚拟机,这是我希望在“低负载”服务器上完成的事情,因为许多系统在其生命周期的 90% 时间里处于闲置状态。
答案2
gem5模拟器模拟CPU微架构,可以用来研究Spectre
如果您有兴趣仅通过模拟来研究/重现漏洞,而不使用主机 CPU,我认为 QEMU 不够详细,无法观察它们,因为它没有模拟 CPU 管道。
gem5但是,它用于估计研发中的系统性能,并且确实模拟了足够的 CPU 内部结构,以便您在完全干净和受控的环境中观察 Spectre。
一个很酷的带有可视化功能的 x86_64 演示已发布于:http://www.lowepower.com/jason/visualizing-spectre-with-gem5.html
gem5 的缺点是它比 QEMU 慢得多,但模拟更详细。