针对AMD 安全加密虚拟化上存在的密文侧信道攻击的系统分析

最新动态

本文将介绍Teecert Labs与University of Lübeck和Ohio State University合作在IEEE S&P 2022上发表的文章:”A Systematic Look at Ciphertext Side Channels on AMD SEV-SNP”。

摘要:AMD安全加密虚拟化上的密文侧信道攻击最先在基于上下文切换的虚拟机存储区域被研究,相关论文发表在Usenix Security 2021上(Li et al., CipherLeaks)。在此基础上,本文将针对密文侧信道攻击的发展及迭代来阐述密文侧信道攻击为何普适的存在针对大内存加密的可信计算环境技术中以及其所带来的潜在威胁。

背景介绍

AMD 安全加密虚拟化技术(Secure Encrypted Virtualization 或SEV )自从2016年首次在Zen架构下的AMD EPYC(霄龙)服务器级处理器推出之后,获得了工业界广泛的关注。AMD安全加密虚拟化技术通过在芯片集成系统(system-on-chip)上内嵌的安全处理器(AMD secure processor)和内存加密引擎(Memory Encryption Engine)对虚拟机的数据进行实时的加密,来保证虚拟机中的数据安全性并抵挡来自其他恶意用户甚至恶意虚拟机管理器(hypervisor)的攻击。AMD安全加密虚拟化技术提供的保护能从根本层面上解决虚拟机使用者对于己方数据在云端可能泄露的担忧,保证其部署云端虚拟机上的程序以及数据的完整性和机密性。

值得注意的是,不同于Intel Software Guard Extension (SGX) 针对单个应用程序并且需要对源代码进行重构, AMD安全加密虚拟化技术不需要部署者重新撰写代码,只需要在内核层面上实现支持。同时针对AMD安全加密虚拟化技术的内核支持也已经正式被 linux系统接纳。如果虚拟机内核版本大于4.16,用户将可以直接将其部署在AMD SEV平台并且编译运行任何已有的代码和程序,而不需要任何其他额外的代码重构和处理。

针对AMD安全加密虚拟化技术的广泛应用场景和便捷的使用模式, 主流云公司已经加速了部署AMD安全加密虚拟化技术的进程。其中谷歌云,微软云,IBM云已经率先开始提供基于AMD安全加密虚拟化技术下的商用可信虚拟机(confidential VM)服务, 百度云,阿里云,亚马逊AWS也都部署了AMD 霄龙处理器,并可能在未来正式提供针对可信虚拟机的支持。

AMD 安全加密虚拟化技术作为AMD在未来云服务市场尤其是可信计算平台与Intel竞争的重要技术,一经面世就受到学术界的巨大关注。在其宣称的提供对于整个虚拟机层面的保护的同时,也面临着可信计算基 (Trusted computing base) 过大所带来的种种威胁。其中未被加密的虚拟机控制单元(Virtual Machine Control Block), 潜在的密文篡改,未经保护的I/O接口以及未被授权的密钥使用均威胁了受到AMD 安全虚拟化技术保护的虚拟机的数据机密性和安全性。在这样的背景下,AMD于2017年及2020年推出了安全加密虚拟化的第二代和第三代扩展,分别叫做SEV Encrypted States (SEV-ES) 和SEV Secure Nested Paging (SEV-SNP)。其中SEV-ES 解决了未被加密的虚拟机控制单元和密文篡改的潜在威胁,SEV-SNP更是进一步增强了虚拟机管理器和虚拟机之间的数据隔离,从而一举解决了以上提及所有的现有弱点和攻击。

基于虚拟机上下文切换的CIPHERLEAKs攻击

在Usenix Security 2022的论文[1]中,我们通过提出一种之前没有被探究过的基于密文的侧信道攻击 (ciphertext side channel)来实现对于时下OpenSSL 软件库包的恒定时间加密算法的攻击,并将其命名为CIPHERLEAKs (logo 如图)。在本文中,我们以RSA为例,阐述攻击者如何可以利用CIPHERLEAKs攻击来100%的窃取加密过程中使用的私钥。事实上,CIPHERLEAKs 攻击也被认为是第一个能在SEV-SNP上实施的攻击。

我们首先介绍一下基于虚拟机存储区域的密文侧信道攻击的原理和通过其能获取的信息。在虚拟机的运行过程中,经常需要和虚拟机管理器的交互。比如说在出现嵌套页表的缺页异常(Nested Page Fault),CPUID指令或者I/O的一些操作中,都会触发虚拟机退出(VMEXIT)事件,并交由虚拟机管理器来处理。其中,为了保证在接下来的虚拟机执行(VMRUN)之后,虚拟机能从上一个断点继续连续执行,虚拟机的虚拟CPU中使用的寄存器的值需要加密并存储在一个特殊的区域(虚拟机存储区域,VM Save Area)。该过程由硬件自动执行,AMD安全处理器也针对该区域提供特殊的保护以防止虚拟机管理器篡改存储的寄存器的密文。但是本文的作者发现,通过持续性的监视虚拟机存储区域的密文变化,攻击者将有能力窃取到虚拟机内部的运行状态。而该侧信道攻击之所以能够起效的基础原因有两点:

  • AMD 内存加密引擎使用了一种XEX的加密模式。在同一物理地址下的明文在同一个虚拟机的生命周期中,将始终表现为同一的密文。
  • AMD限制了虚拟机管理器对于不属于其的内存页的写操作,却允许虚拟机管理器对于不属于其的内存页的任意读操作。

更为具体的来说,通过持续性的监视虚拟机存储区域的密文变化,攻击者将有能力实现(1)推测虚拟机中程序的执行情况 ;(2)建立起针对寄存器的密文-明文字典。

(1)推测虚拟机中程序的执行情况。虚拟机内部的运行状态将直接反应在寄存器的变化以及存储的寄存器密文变化之上。举例来说,如果存储CR3寄存器的密文发生改变,那么极大可能性是因为虚拟机内部发生了上下文切换;而如果RIP寄存器发生了改变,那么将代表程序运行到下一条指令。在这样的基础下,尤其如果在可执行文件本身是常见或者是攻击者已知文件的情况下,攻击者将能通过寄存器的密文变化直接推断出当下程序运行的具体位置,这将帮助攻击者有效的定位攻击窗口以进行进一步的攻击。

(2)建立起针对寄存器的密文-明文字典。建立起针对寄存器的密文明文字典将使得攻击者的攻击变得更为强大。当攻击者观察到已知明文的密文的时候,就可以通过查阅字典来还原出当下的寄存器的具体数值,从而窃取到虚拟机运行的内部状态。其中, 本文作者提出可以通过监视AMD安全加密虚拟化技术处理虚拟机非自动退出事件(Non-Automatic VM EXIT)时采取的虚拟机-虚拟机管理器的交互单元(Guest-Host Communication Block, GHCB)的方式,来有效的建立起密文和明文的字典。根据实验显示,仅仅是监视虚拟机启动阶段的非自动退出事件,攻击者就可以有效地针对RAX寄存器建立起所有明文在[0,127]范围内的所有字典目录。换言之,在虚拟机的运行过程中,只要RAX寄存器的值处在[0,127]的范围内, 那么攻击者就可以直接推测出寄存器存储的明文内容。

我们接下来进一步介绍了如何利用密文侧信道攻击来实现具体的攻击案例。以RSA加密,攻击者可以利用CIPHERLEAKs攻击来100%的窃取加密过程中使用的私钥以及签名中使用的随机数。

攻击RSA加密。本文中提及的攻击针对RSA加密过程中的BN_mod_exp_mont_consttime()函数,该函数以固定长度的窗口来实现计算。如下图中所示的代码片段,在函数实现过程中,bn_get_bits()函数被调用并且每次提取RSA密钥的5个bits来进行相应的计算。

攻击者可以通过以下的步骤来达到100%还原RSA密钥的攻击:

(1)    攻击者首先通过上文介绍的推测虚拟机中程序运行情况的方式来推断出两个目标函数的物理地址。在本例中,我们以gPAt0和gPAt1分别来 表示bn_power5和bn_get_bits5的物理地址。

(2)    攻击者接着监视嵌套页表的缺页异常。攻击者首先消除嵌套页表上的所有P bit (Present bit) 来持续性的监视缺页异常。同时当攻击者看到gPAt0的缺页异常的时候,攻击者消除gPAt1的P bit。而当同时当攻击者看到gPAt1的缺页异常的时候,攻击者消除gPAt2的P bit。通过这样的方式,攻击者可以准确的定位到while循环的运行状态。

(3)    攻击者接着在观测到gPAt0的缺页异常时同时截取存储在虚拟机存储区域RAX寄存器的密文。当攻击者观察到gPAt0的缺页异常时,代表在这个while循环的过程中,bn_get_bits5运行结束,并且准备返回。在这个时间节点,RAX寄存器里存储着5 bits的密钥。对于一个2048-bit的密钥来说,攻击者将可以观测到410个循环,每次观察到的RAX的密文代表着密钥中的5 bits(0-31中的一个数值)。攻击者可以通过比对在虚拟机启动阶段记录的密文-明文字典轻易的还原出当下存储的5位密钥的明文,并最终百分百还原出2048-bit的密钥的内容。

AMD的维护方案。CIPHERLEAKs攻击对于AMD安全加密虚拟化技术的潜在威胁引起了AMD公司的重视和关注。AMD向CIPHERLEAKs的作者要求了禁止发表的请求,本文介绍的CIPHERLEAKs攻击被USENIX Security 2021接收并直到2021年8月才得以正式公开。AMD也针对CIPHERLEAKs分发了CVE-2020-12966的编号并发表了相应的公告(https://www.amd.com/en/corporate/product-security/bulletin/amd-sb-1013)。 在公告中, AMD指出CIPHERLEAKs将潜在威胁现有所有的霄龙处理器,其中AMD将针对第三代霄龙处理器和其支持的SEV-SNP推出了相应的硬件补丁(MilanPI-SP3_1.0.0.5),对于SEV和SEV-ES将没法做出相应修复。

针对虚拟机内存的普适的密文侧信道攻击

在AMD最新的硬件补丁保护下,针对虚拟机存储区域的密文侧信道攻击将不再存在。但是受到CIPHERLEAKs攻击的启发,我们进一步系统性的分析了针对虚拟机常规内存页面中可能存在的密文侧信道攻击,相关成果发表在IEEE S&P 2022 [2]上。在文中,我们指出了针对虚拟机常规内存页潜在存在的两种密文侧信道攻击模式,分别为字典攻击以及冲突攻击。我们在文中展示了常规的数据内存,包括内核的数据结构,用户态的堆栈结构都能够被攻击者利用以窃取受到安全加密虚拟化技术保护的虚拟机中的密钥相关的机密信息。由于采用非确定性加密可能会带来昂贵的硬件开销以及对于虚拟机性能的影响,在短期内AMD将不会在硬件层面修复密文侧信道攻击。

我们首先介绍字典攻击。字典攻击尝试对固定地址的密文数据构建一个密文-明文的字典,并通过字典推测出虚拟机内明文的变化,以此来推测虚拟机中的机密数据。我们通过一个利用操作系统内核中的数据结构来破解ECDSA签名的例子来阐述攻击者能如何利用字典攻击。

攻击ECDSA签名。攻击者的攻击目标是偷取ECDSA签名中需要生成的随机数k。在攻击者获得k的情况下,攻击者将同样能够还原出ECDSA使用的私钥。攻击者利用了虚拟机中存在的上下文切换,在上下文切换发生的时候,进程的寄存器内容将会被存储在特殊的内核结构中。比如说当由用户态进程切换至内核态的过程中,用户态进程的寄存器的数值将被存储在一个叫做pt_regs的内核数据结构中。攻击者通过在特殊的运行节点暂停虚拟机的运行,直到相应的上下文切换被观测到,此时此前进程的寄存器的数值将被存储在pt_regs中。受到影响的ECDSA的部分代码实现如下图所示,BN_is_bit_set() 每次将获取随机数k的第i位比特值,并将数值存储在RAX寄存器中,然后尝试返回原调用函数(ec_scalar_mul_ladder())。攻击者在每次BN_is_bit_set()返回的时候,通过暂停虚拟机的运行,触发一个上下文切换,并从pt_regs中记录RAX对应存储的密文。此时RAX存储的是随机数k第i位的内容(0或者1)。攻击者可以通过查阅字典直接还原出随机数k的值,也可以在不查阅字典的情况下推测出k(熵为1bit)。

具体的来说,攻击者利用以下的步骤来窃取随机数k。

(1)    攻击者首先需要推测出目标函数的物理地址。我们在文中提出了一种基于性能计数器(Performance Counter)的定位虚拟机运行的工具。通过一些特殊的性能计数器事件(如退休的指令数量),攻击者能够实时的定位出两个目标函数的物理地址(BN_is_bit_set() 以及ec_scalar_mul_ladder() )。在本例中,我们以gPA1和gPA2分别来 表示BN_is_bit_set()和ec_scalar_mul_ladder()的物理地址。

(2)    攻击者接着间歇性的消除两个目标函数的P bit来截断虚拟机的运行。攻击者首先消除嵌套页表上的所有P bit (Present bit) 来持续性的监视缺页异常,同时当攻击者看到gPA1的缺页异常的时候,攻击者消除gPA2的P bit。而当同时当攻击者看到gPA2的缺页异常的时候,攻击者消除gPA1的P bit。通过这样的方式,攻击者可以准确的定位到for循环的运行状态。

(3)    攻击者接着在观测到gPA2的缺页异常时不去处理这个缺页异常。一段时间后,攻击者将能观测到虚拟机内部的中断,此时包含有随机数1比特的数据将被存储在pt_regs中的RAX寄存器区域。攻击者通过观察pt_regs的RAX区域的密文来构建密文-明文的字典。因为在对应的128-bit加密区域中只有RAX会发生改变,并且潜在的明文内容只有0或者1,攻击者能够非常容易的搭建起相应的字典,并在for循环的过程中窃取随机数k的全部内容。

我们接下来介绍碰撞攻击。碰撞攻击并不尝试对于某个固定地址的密文搭建起相应的字典,而是通过观测某一地址下的密文会不会发生变化来推测虚拟机中的相应秘密。在文中,我们通过一个被constant-time 密码学实现上广泛采用的Montgomery Ladder实现来解释攻击者如何通过观测密文有没有发生改变来推测出机密信息。在现在被广泛采用的Montgomery Ladder算法中,程序会根据第三个输入来条件性的交换两个输入 (CSWAP(),如下图所示),其中第三个输入极有可能是一些潜在的机密信息(在ECDSA的例子中,第三个输入可能是随机数k的一个比特)。

这样的程序设计将能够非常有效的抵御现有的基于control-flow的攻击以及基于时间的侧信道攻击,但是密文侧信道将能够通过观测A,B这两个输入所在的内存地址有没有发生密文的变化来轻松的推测出第三个输入,从而破解绝大多数密码库中采用的固定时间的加密实现。

如何抵御密文侧信道。在文中,我们同时从软件层面和硬件层面讨论了如何抵御密文侧信道。从硬件层面的保护无疑是更为有效的,但是在针对大内存可信计算环境的内存加密中采用非决定性加密将会带来极大的性能损耗。几乎所有的现有的商业级针对大内存的可信计算环境都采用了决定性加密,从而也都面临密文侧信道攻击的潜在威胁。而从软件层面,我们提出必须要有相应的内核补丁来防护内存数据结构中关于寄存器级别的密文泄漏,同时现有的密码库也需要针对可能造成密文侧信道攻击的代码实现进行相应修改。在文中我们同时提出了一个概念阶段的内核补丁来防护寄存器级别的密文泄漏。

AMD的维护方案。普适存在的密文侧信道攻击从根本上揭示了AMD安全加密虚拟化技术中使用的加密技术存在泄漏虚拟机中机密数据的潜在威胁。AMD非常重视密文侧信道攻击可能会带来的潜在攻击,但是由于在短期内无法从根本上改变现在采用的加密技术或者提供能够消除密文侧信道攻击的软件补丁,AMD于近期提供了一份基于软件开发者的防止密文侧信道攻的编程指导指南(https://www.amd.com/system/files/documents/221404394-a_security_wp_final.pdf),期望编程人员能够自省现有的程序和代码,并从改变程序实现的角度来预防密文侧信道攻击

AMD也针对普适存在的密文侧信道攻击分发了CVE-2021-46744的编号并发表了相应的公告,在公告中, AMD指出密文侧信道攻击将潜在威胁现有所有的霄龙处理器。

相关链接:

[1] Li, M., Zhang, Y., Wang, H., Li, K. and Cheng, Y., 2021. CIPHERLEAKS: Breaking Constant-time Cryptography on AMD SEV via the Ciphertext Side Channel. In 30th USENIX Security Symposium (USENIX Security 21) (pp. 717-732).

CIPHERLEAKs 网页:www.cipherleaks.com 链接:https://www.usenix.org/system/files/sec21-li-mengyuan.pdf

[2] Li, M., Wilke, L., Wichelmann, J., Eisenbarth, T., Teodorescu, R. and Zhang, Y., 2022, April. A Systematic Look at Ciphertext Side Channels on AMD SEV-SNP. In 2022 IEEE Symposium on Security and Privacy (SP) (pp. 1541-1541). IEEE Computer Society.

本文链接:https://www.computer.org/csdl/proceedings-article/sp/2022/131600b541/1CIO7MTBnri

开源代码:https://github.com/UzL-ITS/sev-ciphertext-side-channels

上一篇文章
【12月1日讲座回顾】 杜克大学助理教授张帆InForSec&SUSTech学术讲座
下一篇文章
喜讯: Teecert labs硕士生邓森荣获2022年度国家奖学金
菜单