近年来,由于侧信道攻击的愈发盛行,虚拟化云环境中的隔离难度越来越高。行业中普遍采取的缓解措施并不能根本解决问题。因此,本文提出了一种新的隔离方法:保证虚拟机监视器(Hypervisor)是无秘密的。在无秘密设计模式下,内存被划分为机密的和非机密的,强制所有域拥有最少的无秘密的地址空间。无秘密的虚拟机监视器默认将所有内存视为秘密,通过白名单的机制允许对可以共享的非秘密的访问操作。这种设计可以基于现有的硬件工作,而且几乎不会带来性能损失。
Introduction
在传统的内核和用户分离的系统模型中,用户空间的服务器应用程序的漏洞利用一直都是一个很有吸引力的目标。这类应用程序通常有管理员权限运行并且需要处理多方数据,容易受到恶意客户端的攻击。近年来,已经有相当多复杂的技术并添加到kernel来抵御这些攻击。但是为了抵御推测执行类型的漏洞,比如核心熔毁和幽灵攻击,使得内核与虚拟机隔离的成本再度提高,同时带来了相当的性能退化,甚至需要借助硬件修改来抵御影响。这并不是一种高效的解决方案。在本文中,作者将无秘密的虚拟机监视器作为系统中推测执行攻击的深度防御方案。作者将系统状态归类为秘密或非秘密,并将所有域限制在最低限度,无法访问秘密。 其使用白名单机制运行,默认将所有状态视为秘密。地址空间包含其自己的秘密,并明确识别出非秘密数据。 虚拟机管理程序不再拥有完整访问的权限,而是在进入时仅限于当前的虚拟机域,并且仅在必要时创建临时映射以供秘密访问。
整体来说,这篇文章的主要贡献有:
-
提出了一种将所有域(包括虚拟机管理器)与机密隔离开来的设计。无秘密的设计强制所有域维护其非秘密地址空间;
-
用私有映射将隔离扩展到虚拟机寄存器、vCPU 状态和管理程序堆栈;
-
为临时映射发明了一种有效的缓存机制,证明了一个完整的地址空间对于效率来说是不必要的,从而优化了隔离开销;
-
在开源Type-I Xen虚拟机管理器上实现并评估了无秘密设计。通过对 Xen 的特定调整和优化,与默认缓解措施相比,在现实世界的工作负载中实现了可忽略的开销。我们评估了它的安全性,并证明它不受几类架构和推测攻击的影响。
-
在Hyper-V、bhyve 和FreeBSD内核中实现了无秘密设计。
实验表明秘密自由是一种通用技术,可以改装到各种系统中,包括传统的 UNIX 内核、Type-I 和 Type-II 管理程序。 我们分析了该技术在这些系统上的适用性和有效性,并揭示了进一步的必要调整性能改进和安全强化。
Threat Model
作者假设攻击者驻留在非特权虚拟机中。关于推测执行攻击,作者假设攻击者不与受害者共存于同一个虚拟机中,或者在操作系统内核的上下文中,不存在于同一个进程中,并将推测执行漏洞分为三个不同的类别:
-
违反权限。这些攻击直接在较低特权的上下文中执行,目标攻击在当前域中被严格限制的页表。例如Meltdown。
-
强制:
在更高权限的上下文中触发推测性控制流转换以执行窃密。 利用保留在微架构状态中的推测执行副作用,从较低特权上下文转换为架构状态以提取秘密。例如 Spectre-V1 和 V2。
c) 微架构:从共享微架构结构(例如存储缓冲区、加载端口、L1D 缓存)收集残余信号的攻击。这些攻击是在转换到较低特权域后直接执行的。 例如L1TF 和 MDS。
无秘密设计通过消除虚拟机和虚拟机管理器上下文中的秘密,完全减轻了违反权限和强制的攻击。 但并未直接解决微架构类别中的推测性侧信道攻击,但可以与现有的缓解措施(例如核心调度)相结合。在无秘密管理程序之上构建针对 微架构类的防御比在现有技术水平上构建要简单得多。
Design
作者为所有虚拟机监视器内存分配提供了映射API,确保解引用只在显式映射之后。API的实现会根据该映射是否有关秘密而发生变化。非秘密内存映射的会随着分配而创建、随着回收而销毁,从而可以在所有上下文的生命周期中都可以快速访问。这些通常是与虚拟机中秘密无关的内部数据,包括管理程序映像,主机ISA描述符(例如,X86主机的GDT,IDT,TSS),通用调度程序状态等。对秘密内存的访问将通过以下机制隔离。
-
不允许秘密被全局映射。我们引入了两个新的区域:域私有的以及VCPU私有的。一个vCPU只会被分配到一个pCPU,所以任意时间vCPU私有的就是pCPU私有的。这两个新的区域重新利用了之前被移除的直接映射区域。
在4级分页中,所有L4(根)页表条目可以归类为下图所示的布局。私有区域旨在储存当前域或者vCPU中长期存放的秘密数据结构,例如Hyprovisor堆栈和vCPU寄存器帧。 短期的数据将由之后的临时映射处理。
-
虚拟机管理器栈、vCPU寄存器帧
-
临时映射
-
映射缓存xx
-
微架构隔离
-
总览
将虚拟机的寄存器作为秘密储存后,需要想办法隔离这些寄存器的状态泄露,为了防止切换映射带来的侧信道攻击,虚拟机管理器将不再允许任何对私有页的全局映射。这样可以确保不同域的可见性是隔离的。
在无秘密设计的虚拟机监视器中,虚拟机监视器只能看到虚拟机监视器映像、vCPU的私有堆栈、寄存器状态等。对于暂时的对象以及不存在地址空间中的映射,虚拟机监视器只能用临时映射的方式实现,包括遍历和修改页表的时候。这与现有的虚拟机和OS内核设计形成了鲜明的对比,因为它从不切换到完整的页面表,而是授予虚拟机管理程序完成当前操作所需的临时访问。这样就能避免全局映射和取消映射带来的昂贵开销(因为核心越多,IPI和TLB的访问数量是倍增的。)
自映射:创建临时映射需要修改当前虚拟机监视器上下文的页表。但因为之前已经移除了直接映射,所以这需要通过页表自映射来定位并且修改临时映射的页表项。
由于无秘密设计的开销很小,所以可以用已知的缓解措施来缓解这个问题。
下图展示了一个vCPU的地址空间,其根据机密等级分成了不同的层。最上方是全局无秘密级别,仅可见虚拟机监视器映像和非秘密数据;下一层,域秘密和其他vCPU秘密。临时映射和映射缓存存在于vCPU私有域中,并对其他vCPU不可见。这提供了一个尽可能小的无秘密的地址空间。这与现有的PTI等技术的区别是,其永远不会暴露包含属于其他领域的秘密的完整空间。 虚拟机管理器的地址空间与客人的限制空间相同,并且仅在必要时创建短暂的映射;其次,使用白名单的方式确定秘密,默认情况下,所有数据都通过临时映射进行访问,并优先将数据放在vCPU私有级别。
Evaluation
在实验过程中,作者在AMD 5900X上搭建了无秘密Xen的实现(下表中的SF),运行ubuntu 18.04作为dom0,并运行了一个8vCPU的虚拟机实例。在平台上运行了多种性能基准测试包。为了测试缓解等级带来的影响,作者准备了三套缓解配置:Baseline不开启任何缓解功能并禁用了防御,无法防御任何推测执行攻击;Default:开启缓解以及默认的IBPB,lfence等;XPTI:在Default基础上,强制Xen页表隔离;SF:具有无秘密实现的Xen;SF+EPT:在SF基础上,Guest会将EPT页作为自己的秘密,这会带来额外性能开销。以下是实验结果图表:
Conclusion
无秘密的虚拟机监视器是一种在现有硬件基础上提出的设计,用于最小和无秘密的地址空间。实验证明,这种技术可以在不明显损耗性能的情况下,达到对几类漏洞的纵深防御。 此外它适用于多个平台和不同类型的内核,可作为现有缓解措施的高性能替代方案,并可作为抵御未来潜在攻击的综合框架。
原文始发于微信公众号(COMPASS Lab):[S&P 2022]A Secret-Free Hypervisor