介绍
系统复杂性的增加、云的增长以及新技术的出现都在促成一个难以保护但又至关重要的计算环境。AMD认识到这些严峻的挑战,并开发了新的内存加密技术,旨在跨越各种系统来满足这些需求。
安全内存加密(SME )
SME是一种通用的机制,具有灵活性,集成到CPU架构中,可扩展从嵌入式到高端服务器的工作负载,并且不需要对应用软件进行修改。
主存加密可以用来保护系统免受各种攻击。数据在磁盘上存储时通常是加密的,但通常以明文形式存储在DRAM中。这会使数据容易受到未经授权的管理员或软件或硬件探测的窥探。在没有加密的情况下,任何存储的信息,如敏感数据、密码或密钥都可以很容易地被泄露。
安全加密虚拟化( SEV )
将主存加密功能与现有的AMD - V虚拟化架构相融合,支持加密虚拟机。对虚拟机进行加密不仅可以保护虚拟机免受物理威胁,还可以保护虚拟机免受其他虚拟机甚至虚拟机管理程序本身的攻击。因此,SEV代表了一种新的虚拟化安全范式,特别适用于虚拟机不需要完全信任主机系统的管理程序和管理员的云计算。与SME一样,不需要修改应用软件来支持SEV。
本文介绍了SME和SEV的技术概况,并描述了它们如何被 操作系统( OS )、虚拟机管理程序( HV )和客户虚拟机( VM ) 软件在各种不同的环境中使用,以保护DRAM中的数据。
SME技术
概述
主存加密通过片内存储器控制器中的专用硬件实现。每个控制器包括一个高性能的高级加密标准( AES )引擎,当数据写入DRAM时对其加密,读取时对其解密,如图1所示:内存加密行为。数据的加密是在一个128位密钥的模式下完成的,该模式使用额外的基于物理地址的调整来防止密文块移动攻击。
带SME的AES引擎使用的加密密钥是在系统重置时随机生成的,对于CPU核上运行的任何软件不可见。该密钥完全由AMD安全处理器( AMD-SP )管理,该处理器是一个32位微控制器( ARM ® Cortex ® - A5),作为AMD SOC内集成的专用安全子系统。密钥由符合NIST SP 800 - 90标准的硬件随机数发生器产生,存储在专用硬件寄存器中,且不会暴露在SOC之外。不同于后面描述的SEV模式,SME不需要运行在CPU核上的软件参与密钥管理。
通过软件托管页表中的OS或HV控制对内存哪些页进行加密。启用内存加密后,使用物理地址位47 ( aka为C位,如as in en Crypted)标记是否保护内存页。如下图所示,OS或HV在页表项( page table entry,PTE )中将某个物理地址的位47设置为1,表示该页需要加密,导致对该内存的访问被内存控制器中的AES引擎自动加密解密。
通过AES引擎对内存进行加密和解密确实会给DRAM内存访问带来少量的额外延迟。这种延迟对软件的影响非常依赖于系统工作负载,但估计对系统性能的总体影响非常小。如果仅对内存的一个子集进行加密,则性能影响将较小,因为未加密的访问一般不会产生额外的延迟。
SME使用模型
在第一个模型中,所有的DRAM都被加密,而在第二个模型中,只有一个选择区域(对应于客户VM)被加密。
全内存加密
在全内存加密的情况下,所有DRAM内容都使用随机密钥进行加密,该密钥对冷启动、DRAM接口窥探和类似的攻击提供了强大的保护。对于使用NVDIMM的系统,全内存加密还提供了对攻击者移除内存模块并试图提取其内容的保护。
支持SME的全内存加密是通过OS或HV在所有页表的所有DRAM物理地址中设置C位来实现的。这既包括指令页和数据页,也包括页表本身对应的页。本质上,操作系统或HV软件可能将系统视为具有以地址0x8000 _ 0000 _ 0000为起点的DRAM。在HV设置C位加密所有物理内存的情况下,HV控制的所有VM都与HV一起加密,并使用相同的加密密钥。
值得注意的是,支持通过SME加密DMA到内存的数据。
部分内存加密
页表中C位的使用为操作系统或HV提供了灵活性,可以根据需要只对内存的一个子集进行选择性加密。这样做仍然提供了加密内存的物理保护,也可以提高非敏感数据上的性能。此外,加密与非加密内存的选择可以用于为关键工作负载提供隔离层。
这种隔离的一个例子是只将访客虚拟机使用的内存标记为加密的系统。这可以在不对客户VM进行任何修改的情况下完成。通过在DRAM (如图3所示:加密虚拟机)对应的所有嵌套页表项中设置C位,虚拟机管理程序仅对VM内存进行加密。
这样的场景可以用来保护VM免受流氓机器管理员的攻击。虽然管理员可以访问硬件和主机系统,但即使使用内存扫描工具,他们也无法检查客户VM数据。
SME特殊考虑
SME为软件加密部分或全部内存页提供了一种直观的方法。然而,在使用加密内存时,有一些重要的特殊编程考虑必须考虑到。
首要考虑的是,硬件并不管理同一页面中加密和未加密副本之间的一致性。因此,软件在修改页面的C位时必须小心谨慎,如果需要修改页面的C位,则必须在修改页表之前从CPU缓存中刷新该页。
值得注意的是,允许设备向加密内存发出DMA,但与CPU访问一样,它们必须设置物理地址的47位,这在一些32位的旧设备上是不可能的,软件可以利用IOMMU将设备请求地址重新映射为有C位的地址。
SME功能的其他技术细节可以在AMD程序员手册( APM )第2卷的最新版本中找到。
透明的SME(TSME)
虽然SME为管理主存加密提供了很大的灵活性,但它确实需要OS / HV的支持。透明SME ( TSME )是希望SME的物理保护与OS / HV解耦。在TSME中,所有内存都是加密的,而不管特定页面上的C位值如何。该模式提供了一种无需软件修改即可启用加密的简单方法。
在支持的平台上,可以通过BIOS设置启用TSME。
SEV技术
随着硬件和软件的进步,今天的计算系统比以往更加复杂。软件的规模和功能急剧增加,尤其是系统中负责安全的最具权限的内核级软件。如下图所示,Linux内核已经从不足200k行的代码发展到如今的近2200万行。
然而,复杂性和整合性都会对系统的安全性产生普遍的负面影响。复杂的软件更难验证,更有可能存在黑客可以利用的漏洞。一个典型的Linux系统将近5.5 MB的内核代码加载到内存中,内存必须是无bug的,以避免破坏系统。
整合系统允许不同的软件**使用相同的硬件和共享资源(如内存)**,通过增加攻击面对安全性产生负面影响。这种组合产生了一个依赖于大量特权无bug代码的安全模型,为入侵提供了更大的可能性。
为了对抗这些力量,安全加密虚拟化( Secure Encrypted Virtualization )是在AMD架构中加入的新特性,旨在更好地应对现代系统的复杂性和隔离需求。SEV通过使用密码学、加密代码和数据来增强隔离性,并实现了一种全新的安全模型,可以对代码进行加密保护,使其免受更高特权代码(如hypervisor )的攻击。
SEV安全模型
传统的计算系统采用基于环的安全模型运行。在该模型中,高特权代码可以完全访问其所在层级和所有低特权层级的资源。
如下图所示,在SEV模型中,在不同级别(即管理者vs客户)上执行的代码是孤立的,因此不能访问对方的资源。尽管管理程序级别传统上比客户级别”更有特权”,但SEV通过密码隔离将这些级别分离。 这为低特权代码提供了额外的安全性,而不需要低特权代码启动和执行所依赖的高特权代码的信任。管理程序和客户机之间的通信仍然是可能的,但是这些通信路径是严格控制的。
因此,SEV技术建立在一个威胁模型的基础上,假设攻击者不仅可以在目标机器上执行用户级别的特权代码,而且可能在更高权限的虚拟机管理程序级别执行恶意软件。攻击者也可能拥有对机器的物理访问权限,包括对DRAM芯片本身的访问权限。在所有这些情况下,SEV提供额外的保证来帮助保护客户虚拟机代码和数据免受攻击者的攻击。注意,SEV并不能抵御针对客户的拒绝服务攻击。
SEV 用例
SEV围绕硬件虚拟机的概念构建,可以在多种用例中用于增强安全性。由于使用了主存加密,SEV提供了与前面描述的SME相同的物理攻击防护安全收益。除此之外,SEV还可以用于保护以下环境。
云
基础设施即服务( IaaS )数据中心的增长使得云计算能力变得便宜。然而,这种增长也带来安全挑战,因为云基础设施/人员可能并不总是值得信赖的。在处理敏感数据时尤其如此,例如健康记录或商业秘密。此外,在多个客户之间共享硬件引起用户的安全担忧。尽管软件设计者付出了最大的努力,但已经出现了许多这种隔离失败的案例。
SEV可以通过提供更好的安全隔离来提高这些IaaS云中的安全级别,其根源在于硬件本身。虽然现有的安全技术可以保护硬盘中的静态数据,如微软的BitLocker装置加密和LUKS,但SEV保护使用中的数据,使客户的工作负载能够在密码学上相互隔离并且免受主机软件的损害,云数据中心中具有恶意意图的管理员将无法访问托管VM中的数据。
沙盒
通过使用硬件VM构造,SEV是围绕一个安全沙箱环境的想法构建的,其中软件可以执行,并与系统上的其他软件进行隔离开。这些沙盒可以像一个完整的VM一样大,有自己的磁盘和操作系统,也可以很小,用于更细粒度的隔离。例如,SEV硬件可用于将Docker容器与主机系统进行加密隔离,以更好地保护机密数据。
SEV架构
技术概述
SEV是对AMD - V架构的扩展,支持在虚拟机管理程序的控制下运行多个虚拟机。当启用时,SEV硬件使用VM ASID标记所有代码和数据,该标记指示数据来自或打算用于哪个VM。该标签和数据一起保存至在SOC内部,并防止数据被所有者以外的任何人使用。标签保护SOC内部的VM数据,AES采用128位加密保护SOC外部的数据。当数据离开或进入SOC时,基于关联标签的密钥分别对其进行加密/解密。
每个VM以及虚拟机管理程序都与一个标签相关联,从而产生一个相关联的加密密钥。由于标签和内存加密,数据仅限于使用该标签的VM。如果数据被任何人访问,包括管理程序,他们将只能看到数据的加密形式。这提供了虚拟机之间以及虚拟机与虚拟机管理程序之间的强加密隔离。
加密内存
SEV使用与前面描述的SME特征相同的高性能内存加密引擎。它还在页表中使用相同的C位来标记加密的页面,尽管有一些额外的限制。
SEV的一个关键特性是客户虚拟机能够选择他们想要私有的数据内存页。这个选择是使用标准的CPU页表完成的,并且完全由客户控制。私有内存使用访客专用密钥加密,而共享内存可以使用管理程序密钥加密。该特性允许虚拟机标记他们想要保护机密性(私有)的内存数据的选定页,其他页用于与其他VM或管理程序的通信。出于安全考虑,SEV硬件要求某些类型的内存(包括指令页和页表)始终是私有的,以保护虚拟机。
示例通信配置如图10所示。在本例中,启用SEV的客户和管理程序通过内存进行通信,两个实体都标记为共享。其他所有访客内存均使用访客密钥( HV无法使用)进行加密。
密钥管理
SEV的安全性高度依赖于内存加密密钥的安全性。暴露于恶意实体,如恶意的或错误的虚拟机管理程序,会危及SEV保护的客户。虽然虚拟机管理程序必须管理客户及其资源,但是虚拟机管理程序本身绝不能获取内存加密密钥。运行在AMD - SP内部的SEV固件提供了一个安全的密钥管理接口来实现这一点。管理程序使用该接口为安全客户机启用SEV,并执行常见的管理程序活动,如启动、运行、快照、迁移和调试客户机。
为了保护启用了SEV的访客,固件辅助执行了三个主要的安全属性:平台的真实性、已启动客户的认证和客户数据的机密性。
对平台进行认证可以防止恶意软件或流氓设备伪装成合法平台。平台的真实性由其身份密钥来证明。该密钥由AMD签署,以证明该平台是具有SEV功能的真实AMD平台。它还由平台的所有者签署,以显示谁管理和拥有机器给客户的所有者或远程平台上的其他固件实例。
客户启动的证明向客户所有者证明安全启动。固件向客户所有者提供与SEV相关的客户状态的各种组件的签名- -包括内存的初始内容- -以验证客户处于预期状态。通过该证明,客户所有者可以确保管理程序在向客户传输机密信息之前不干扰SEV的初始化。
这个过程的一个例子如图12所示。最初,客户所有者向云系统提供客户镜像。SEV固件协助启动客户并提供证明给客户拥有者。如果客户拥有者认为证明正确, 他们提供额外的秘密(例如硬盘解密密钥)给正在运行的客户机以允许继续启动。
访客的机密性是通过使用只有SEV固件知道的内存加密密钥对内存进行加密来完成的。SEV管理接口不允许内存加密密钥- -或任何其他秘密SEV状态- -在固件外部导出,而不对接收者进行适当的认证。这使得管理程序无法访问密钥,从而无法访问客户的数据。
该接口还提供了将客户数据迁移到另一个SEV能力平台的机制。在此操作中,客人的内存内容在传输过程中保持加密。一旦远程平台被认证,SEV固件会安全地发送客户的内存加密密钥,以便远程平台可以自行运行客户。这种传输机制允许管理程序在启用SEV的情况下安全地实现迁移和快照功能。
SEV软件实现
虚拟机管理程序
与传统虚拟化一样,SEV继续依赖虚拟机管理程序实现设备仿真和调度等诸多VM功能,但降低了对虚拟机管理程序安全性的依赖。启用了SEV的客户机仍然根据需要使用虚拟机管理程序,但是当内存页不打算在VM外部共享时,可以通过将其标记为私有来保护自己。
运行时虚拟机管理程序与AMD - SP进行通信,以协调内存加密密钥的管理。这种通信是通过AMD - SP驱动程序完成的,涉及到在VM即将运行时通知AMD - SP等任务,从而允许AMD - SP将适当的加密密钥加载到AES - 128加密引擎中。虚拟机管理程序还与AMD - SP通信,建立安全机制执行客户认证、执行迁移等。
虽然管理程序可以控制用于运行VM和选择加密密钥的ASID,但这并不被认为是一个安全问题,因为加载的加密密钥是没有意义的,除非客户已经使用该密钥加密。如果加载了错误的密钥或者对访客使用了错误的ASID,那么访客的第一个指令获取将失败,内存将被错误的密钥解密,导致垃圾数据被执行(并且极有可能造成故障)。
客户机
支持SEV的客户机中的操作系统必须意识到这一新的硬件特性并适当地配置其页表。这可以用类似于SME全内存加密模式的方法来完成,其中大多数DRAM地址被配置为C位(位47 )设置为1。
对于支持SEV的客户来说,一个重要的考虑因素是SEV硬件出于安全原因不允许DMA进入客户加密内存。所有的DMA,无论是来自真实硬件还是HV仿真设备,都必须发生在共享访客内存中。因此,客户操作系统可以选择将分配给DMA的内存页作为共享的( C位清除),或者将数据复制到/从特殊的缓冲区进行DMA。
最后,值得注意的是,SEV支持多核客户,并且数据可以在这些核心之间共享,不会带来额外的性能损失。管理程序必须对特定客户的所有虚拟CPU实例使用相同的ASID。
SEV 特殊考虑
先前列出的关于SME功能的许多特殊考虑也适用于SEV。特别地,与SME一样,在使用不同的C位访问页之前,必须从缓存中刷新页面。此外,在更换硬件内存加密密钥之前,管理程序软件必须执行完整的缓存刷新,以确保使用该密钥的任何修改数据都已写回DRAM。最后,由于在64位或32位PAE模式下,C位只能由客户操作系统控制,因此在所有其他模式下,SEV硬件都将C位强制为1。这使得客户操作系统可以立即开始运行加密代码,然后安全地过渡到它的最终模式。
结论
本文提出的两个内存加密特性代表了通用计算机安全中的主要步骤,可以在各种环境中使用。
安全内存加密技术是一种灵活而强大的架构特性,它允许对操作系统或管理程序的主存进行加密。本文阐述了内存加密的几种具体使用模型,包括全内存加密、选择性加密和透明加密。所有模型都提供了针对物理硬件攻击的新保护,并且在某些情况下可以用来帮助保护系统免受流氓管理员的攻击。其他的使用模型也是可能的,可以提供额外的选择和性能/安全权衡。SME不需要对应用软件进行任何修改,只要对操作系统或管理程序进行适当的修改,系统中的所有应用都可以得到保护。
此外,可通过安全加密虚拟化增强VM安全性,支持运行管理程序无法直接访问的加密客户。这不仅为云用户提供了新的保护,也为希望限制其对客户数据可见性的云主机提供了新的保护。基于AMD - V技术,SEV可同时用于云端和Docker类型的模型,为虚拟化环境提供了一种新的安全模型。与SME技术一样,不需要对客户机进行应用软件更改,通过专用硬件引擎快速透明地执行VM加密。
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达,可以在下面评论区评论