揭示虚拟机可信任执行环境的隐形威胁
撰文 | 王浩睿
编辑 | 刘梦迪
一、背景介绍
随着云计算和虚拟化技术的广泛应用,越来越多的敏感数据和应用程序在虚拟机(VM)上运行。这些虚拟机由虚拟机管理程序(Hypervisor)管理,而虚拟机管理程序本身可能受到恶意攻击者的威胁。在这种背景下,AMD推出了SEV(Secure Encrypted Virtualization)技术,旨在通过加密虚拟机的内存来增强安全性,防止虚拟机管理程序和其他系统级攻击者访问虚拟机内部状态。SEV技术为每个虚拟机提供了一个加密的内存空间,确保了虚拟机的机密性和完整性。
然而,尽管SEV提供了内存加密,但它并不能完全防止所有类型的攻击。特别是微架构侧信道攻击,仍然可能威胁到虚拟机的安全。这些攻击可以利用处理器的微架构特性来推断加密保护下的秘密信息。为了提高攻击的时间分辨率,研究者们开始探索单步执行技术。这种技术允许攻击者在虚拟机执行每条指令后进行干预,从而更精确地控制和观察虚拟机的执行流程。
SEV-Step框架是一个专为AMD SEV设计的单步执行框架,允许攻击者通过精确控制虚拟机的执行流程来提高后续微架构攻击的效果。文中通过SEV-Step框架展示了如何对SEV保护的虚拟机进行端到端的缓存攻击,以及如何利用Nemesis风格攻击来提取有关单步执行指令的类型和操作数的信息。SEV-Step的提出不仅为学术界提供了一个研究和测试SEV安全性的新平台,而且对于理解和评估SEV在现实世界中的安全性具有重要意义。
二、SEV-Step框架基本工作流程
SEV-Step框架通过内核空间和用户空间的紧密协作,实现了对AMD SEV环境中虚拟机的精确控制。内核空间(Kernel Space)负责监控和响应VM事件,例如适应性地调整配置,而用户空间(User Space)负责处理这些事件,如初始化配置、等待事件、处理事件、更新配置以及发送和等待事件的确认。下图即SEV-Step框架中内核空间和用户空间协同工作处理虚拟机事件流程图,其中左边为内核空间部分,右边为用户空间部分。
SEV-Step框架事件处理工作流程图
内核空间和用户空间之间有两个通信通道:IOCTL API和共享内存。其中IOCTL API用于低频操作,如初始化配置和更新VM的中央配置结构。由于VM的更改只能在下一次退出时生效,IOCTL API的作用是更新内核中的配置结构,并将这些更改推迟到下一次VM退出时应用。而共享内存用于高频事件通知,如发送和确认(单步执行)事件。共享内存是一种允许内核空间和用户空间直接交换数据的机制。当内核空间部分发送一个事件后,它会阻塞等待用户空间部分的确认,这会延迟下一次VMRUN指令的执行。
SEV-Step框架运行流程如下:
1、初始化配置(Initialize Config):在开始时,内核空间通过IOCTL API向用户空间发送初始配置信息。这些配置信息定义了SEV-Step框架的行为,例如如何响应特定的VM事件。
2、等待事件(Wait for Event):用户空间持续监控VM的运行状态,等待特定的事件发生,如页面错误或单步执行事件。
3、处理事件(Process Event):当遇到页面错误或者单步执行时,用户空间通过共享内存将事件信息发送到内核空间。这个事件可能是VM执行的一个页面错误,或者是单步执行的结果。
4、事件确认(Acknowledge Event):用户空间接收到事件后,处理该事件,并准备相应的响应。处理完成后,用户空间通过共享内存向内核空间发送事件确认。
5、更新配置(Update Config for Next Entry):内核空间可以根据事件处理的结果调整配置,并通过IOCTL API将更新的配置发送给用户空间。这些配置更改将在下一次VM退出时生效。
6、阻塞和延迟(Blocking and Delaying):内核空间在发送事件后会阻塞,等待用户空间的确认。这意味着在收到确认之前,内核空间不会执行下一次VMRUN指令,从而暂停VM的执行。
7、主动轮询(Active Polling):为了减少延迟,内核空间和用户空间都通过主动轮询来等待新的事件和确认,不断地检查共享内存中是否有新的事件或确认信息。
8、同步更改(Synchronize Changes):用户空间可以在VM运行时动态更改配置,并通过IOCTL API将这些更改发送到内核空间。这些更改将在下一次VM退出时生效,从而同步VM的状态。
内核空间和用户空间的紧密协作的设计,允许SEV-Step框架灵活地响应VM中的事件,并允许用户空间程序根据这些事件动态调整攻击策略。通过这种交互,SEV-Step框架实现了对AMD SEV环境中虚拟机的精确控制和复杂的攻击逻辑。
三、单步执行
为了进一步提高微架构攻击的时间分辨率,文中在SEV-Step框架中引入了单步执行技术。这种技术允许攻击者在每个指令执行后中断执行流,从而极大地提高了攻击的时间分辨率。通过在每个指令后暂停执行,攻击者能够更精确地观察和分析系统的微架构状态,从而增强攻击效果。
下图为单步执行过程的时间线。图中展示了在虚拟机监控器和虚拟机之间进行上下文切换时,指令执行的各个阶段以及APIC定时器中断如何触发VMEXIT以实现单步执行。
单步执行过程的时间线
时间线展示了从VMRUN指令开始,到获取指令阶段(Fetch)、解码指令阶段(Decode)、发出指令阶段和(Issue)退休指令阶段(Retire)的整个过程,以及APIC定时器中断的触发时机。理想情况下,APIC定时器的中断应该在第一个指令执行完成之前触发,这样就可以实现单步执行窗口;如果APIC定时器的中断触发时间设置得太长,可能会导致多个指令被执行,这就是所谓的多步执行窗口(Multi-Step Window);如果APIC定时器的中断触发时间设置得太短,可能会导致没有指令被执行,即零步执行窗口(Zero-Step Window)。为了实现单步执行,需要精确控制APIC定时器中断的触发时间,确保它在第一个指令执行完成之前触发,但又不能太早,以免导致零步执行。
除此之外,单步执行提供了对虚拟机执行的细粒度控制,而页面错误跟踪提供了对虚拟机内存访问的粗粒度监控。两者结合使用,可以在虚拟机访问特定内存区域时激活单步执行,以便进行更详细的分析。并且单步执行允许攻击者在每个指令执行后插入缓存攻击,以便精确地监控和利用缓存状态的变化。页面错误跟踪可以帮助攻击者确定何时虚拟机正在访问敏感数据,从而触发缓存攻击,以泄露或推断出更多的信息。通过这些部分的紧密联系,SEV-Step为攻击者提供一个交互式框架,使得攻击者可以在AMD SEV环境中执行精确的监控和复杂的攻击。
四、对磁盘加密进行缓存攻击
对磁盘加密进行缓存攻击的攻击策略是利用SEV-Step框架提供的缓存攻击和单步执行功能,从LUKS2加密的磁盘中恢复AES卷密钥。
具体的攻击步骤如下:
1、定位AES代码并检测其执行:攻击者利用页面错误跟踪技术,监控磁盘解密操作期间的页面访问,通过分析这些访问模式,识别出执行AES加密和解密操作的代码位置。
2、定位访问AES T表的指令:T表是预计算的加密查找表。通过对AES函数的汇编代码进行详细分析,攻击者构建了一个指令列表,明确了哪些指令会访问AES算法中的T表。
3、定位AES T表:攻击者通过使第一个内存访问指令产生页面错误,牺牲这个指令的执行,来确定T表所在的内存页面,从而知道T表在内存中的确切位置。
4、密钥恢复:在确定了AES代码位置、访问T表的指令以及T表位置后,攻击者使用SEV-Step框架的单步执行功能,在每次访问T表时执行缓存攻击,收集缓存迹线数据。然后,通过机器学习分类器分析这些数据,区分实际的内存访问和由于指令流水线产生的噪声,最终恢复出用于AES-XTS磁盘加密的两个AES密钥,一个是用于加密初始向量IV的密钥,另一个是用于加密实际数据负载的密钥。
实验中通过页面错误跟踪技术和单步执行技术,虚拟机在执行AES加密和解密操作时触发一系列特定的页面错误事件。攻击者能够精准定位每个关键指令定位对应的代码的位置,从而实现对加密密钥的侧信道攻击。下表即为用于识别虚拟机在执行AES加密和解密操作时触发的页面错误事件序列及对应代码位置。
页面错误事件序列及对应代码位置
五、指令延迟攻击
指令延迟攻击(Instruction Latency Attack),是CPU执行指令的时间差异来推断出正在执行的指令类型或其操作数。攻击的目标是展示SEV环境中的指令执行时间可以被用来推断出执行的具体指令,类似于Nemesis攻击。
攻击方法主要为延迟测量和时间戳获取。
延迟测量:研究者们使用rdpru指令来读取实际性能频率时钟计数的MSR(Model-Specific Register)。APERF MSR记录了CPU的时钟周期数,可以用来测量执行单个指令所需的时间。
时间戳获取:在进入虚拟机(VMRUN指令)之前和退出虚拟机(VMEXIT指令)之后,尽可能接近地获取时间戳,以减少系统噪声对测量结果的影响。
在实验中,执行了一个包含1000条汇编指令的滑动窗口并收集每次单步操作的延迟。对于每个指令,重复执行100次,总共收集100,000次测量结果。实验结果表明,基于指令执行所需的时间差异进行分析,能够区分出低延迟指令和高延迟指令;并且发现即使在SEV环境中,由于数据依赖性,指令执行时间也会发生微小变化。
这种攻击展示了即使在SEV这种保护机制下,攻击者仍然可以通过分析指令执行时间来推断出敏感信息。即使是在设计用于提供高安全性的环境中,也需要对微架构攻击进行防御,并且需要对这些环境的安全性进行持续的评估和改进。
六、总结
本文介绍了一个名为SEV-Step的单步执行框架,它用于对AMD SEV环境中的虚拟机进行单步执行攻击。这是一种微架构攻击技术,可以提高对后续攻击的时间分辨率。在本文中,作者介绍了SEV-Step框架的设计和实现,包括可靠的单步执行方法,还提供了页面错误跟踪和缓存攻击等功能。通过这些部分的紧密联系,SEV-Step为攻击者提供一个交互式和可重用的框架,使得攻击者可以在AMD SEV环境中执行精确的监控和复杂的攻击。作者通过两个案例研究展示了SEV-Step框架的能力:首先对磁盘加密进行缓存攻击,从LUKS2加密的磁盘中恢复出AES卷密钥;另外在SEV环境中进行指令延迟攻击,能够区分不同指令的执行延迟,并观察到数据操作数对延迟的影响。
参考资料
[1] Wilke L, Wichelmann J, Rabich A, Eisenbarth T. SEV-Step: A Single-Stepping Framework for AMD-SEV[J]. IACR Transactions on Cryptographic Hardware and Embedded Systems, 2024, 1(Dec. 2023): 180-206. DOI: 10.46586/tches.v2024.i1.180-206.
往期精彩文章推荐
原文始发于微信公众号(数缘信安社区):SEV-Step:一种针对AMD-SEV分析的单步执行框架
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论