今天和大家分享的论文是Veil: A Protected Services Framework for Confidential Virtual Machines,发表于ASPLOS 2023,由Arizona State University的Adil Ahmad、Purdue University的Botong Ou等人完成。
一、研究动机
AMD SEV提供的机密虚拟机(CVM)为不可信云上的敏感计算提供了受保护的环境。但SEV中部署的通常都是代码量庞大且易受攻击的内核,使云服务器面临内核漏洞的攻击。
针对大型操作系统内核缺乏信任的问题,现有研究主要是security monitors方法,1)基于高特权级的硬件来监控不可信操作系统的行为,2)利用软件方法对内核降权,但这两类方案分别存在兼容性和性能开销的问题。
二、技术挑战
Virtual Machine Privilege Levels(虚拟机特权级,VMPLs)是SEV-SNP中的一种新的特权隔离机制。如下图所示,SEV-SNP提供了四个VMPL,即VMPL-0到VMPL-3,其中编号越低,特权级越高。当创建VCPU实例时,其VMPL被分配到创建的VMSA中,并在整个VCPU生命周期内保持不变。
如果操作系统在较低特权级的VMPL(例如VMPL-3)上运行,Veil在更高特权级的VMPL(例如VMPL-0)上运行监控程序,则可以利用VMPL的保护机制确保受信任软件的正确执行。但不幸的是,直接利用VMPL实现监控架构面临如下几个挑战:
C1:虚拟机特权级的限制。 理论上,Veil需要一个单独的VMPL来隔离每个受保护的服务或飞地,但有限的VMPL(4个)严重限制了可实现的服务或飞地数量。一个简单的解决方案是为所有受信任组件设置一个VMPL,为所有操作系统组件设置另一个VMPL。然而,这是不安全的。例如,操作系统可能会创建一个恶意飞地以在受信任软件的VMPL上运行。
C2:运行环境的限制。一个VCPU可以在执行过程中在不同的ring特权级之间切换(例如,使用SYSENTER在系统调用时切换到操作系统代码),但其VMPL在创建时是静态分配的。如果所有服务和敏感用户计算必须都有单独的VCPU,这非常浪费资源并严重限制了资源的使用。
三、设计实现
Veil设计目标是在不可信的CVM操作系统环境中,确保关键系统服务的正确执行。其架构设计如下图所示,由4个主要组件组成,分别是VeilMon(安全监控器)、受保护服务(Protected Services)、隔离区(Enclaves)和不可信软件(Untrusted Software)。
1. VeilMon(安全监控器):VeilMon是运行在最高特权级别(VMPL-0和CPL-0)的核心组件,负责管理其他所有域的内存访问权限以及创建新的域。在CVM启动过程中,VeilMon的代码和初始数据会被度量,并将SHA-256哈希值发送给远程用户进行验证,确保其在DomMon中安全加载和初始化。
(1)特权域管理:通过将VMPL与传统的保护环ring技术相结合, Veil实现了四个CVM特权域,用于隔离和保护不同的组件:
-
DomMon(VMPL-0 + CPL-0):最高特权域,运行VeilMon,负责管理其他所有域的内存访问权限。
-
DomSer(VMPL-1 + CPL-0):运行受保护的服务。
-
DomEnc(VMPL-2 + CPL-3):运行隔离区(Enclaves)。
-
DomUnt(VMPL-3 + CPL-0/3):运行不可信的软件(操作系统和应用程序)。
(2)VCPU复制:由于每个VCPU实例只能在初始化时被永久分配给一个域,这种静态分区会浪费VCPU资源。与VCPU静态分区不同,Veil为每个VCPU创建副本并将其分配给不同的域,以实现高效利用。这种切换通过Hypervisor完成,域之间通过共享内存进行通信。
(3)内核兼容性:由于操作系统内核在DomUnt域中执行,因此无法实现以下两个功能:(a) 在系统初始启动或热插拔场景中启动VCPU,(b) 接收来自Hypervisor的内存页或更改当前内存页状态。因此,Veil将这些功能委托给VeilMon,VeilMon负责检查这些操作的正确性。
2. 受保护服务(Protected Services):主要包括VeilS-Kci、VeilS-Enc和VeilS-Log,分别用于保护内核代码完整性、数据加密和日志审计。
(1)VeilS-Kci(Kernel Code Integrity):确保内核代码的完整性,防止内核被恶意篡改。
(2)VeilS-Enc(Enclaves):使用较高的VMPL来阻止操作系统访问enclave内存,同时确保无法enclave无法执行特权(CPL-0)指令或访问未授权内存区域。
(3)VeilS-Log:记录重要的系统事件,提供日志和审计支持。
3. 隔离区(Enclaves):类似于SGX的隔离区,VeilS-Enc将进程分为不可信和可信区域,确保可信区域的内存不能与其他软件共享,提供更灵活的分层安全保护。
4. 不可信软件(Untrusted Software):主要包括操作系统和应用程序,运行在较低特权级别。
四、测试评估
作者实现了Veil的原型系统来评估其实用性、安全性和性能。Veil的原型系统仅需要对CVM Linux内核和Hypervisor做少量代码修改(少于1200行),并且整个框架和受保护的服务大约需要4100行代码,可以进行严格测试。
1)安全性测试:通过分析和实验验证,表明Veil可以成功防御来自操作系统的一系列攻击。
2
)性能测试:使用设计基准测试和实际案例研究来评估Veil及其受保护服务的性能。结果显示,Veil将CVM的启动时间增加了不到2秒,对使用受保护服务的实际程序引入了2%至64%的性能开销,在正常的CVM执行下对系统性能影响可以忽略不计。原文始发于微信公众号(COMPASS Lab):论文分享|Veil