NVM的内存保护
摘要
安全边界限制需要保护内存免受数据残留攻击,这种攻击对于NVM的数据持久性功能更有效。
安全内存需要解密和完整性验证,会带来不小的性能开销,缩短NVM的寿命。
以前的工作包括:计数器打包到缓存行、增加元数据的缓存能力、减少完整性树的大小、使用ECC芯片存储MAC。用这些方法减少开销。但是根更新过程需要顺序更新完所有完整树的MAC值,还没有完全被研究。
本文提出ProMT,一种新颖的内存控制器设计,减少NVM的安全内存性能开销到11.7%,延长使用寿命3.59倍,系统恢复时间一秒内。
1 INTRODUCTION
计数器模式的加密通过一致性树进行解密和验证,每次内存写入都需要更新整个完整性树分支,这些安全措施和NVM不兼容。
NVM优点包括数据持久性、3TB/s的插槽容量、低空闲功耗;但是写入耐久性有限、写入速度较慢。因此实时加密和完整性验证存在几个问题:
- NVM断电过程也保留数据,加密计数器和完整性节点需要和数据一起原子地持久化,以确保系统恢复能力。
- 保留安全元数据会导致每次写数据实际上需要十次写入。
- 持久化更新前,需要通过散列所有更新的分支级别来更新完整性树根,3TB内存的完整性树有11层和一个根,大概需要10次哈希才能完成。由于11次完整性树和加密计数器的更新,MAC值、数据缓存行需要在写缓冲里等待,直到根成功更新为止,因此会填充处理器的缓冲并且阻塞执行。
解决方案和缺点
先前的工作解决了前两个问题,但没有解决第三个问题。
Osiris和SuperMem提出恢复或持久加密计数器的解决方案来解决崩溃一致性问题,忽略了重建完整性树所需要的时间。
Anubis、Phoenix、Triad-NVM和ShieldNVM提出奔溃后重建完整性树的方案。
最近Freij根据强制持久排序讨论了奔溃一致性要求的开销,并提出Persist Level Parallelism优化来减少开销。PLP优化讨论了完整性树更新的排序、可能的重叠、假设管道足够大来执行WPQ条目的更新,比如32-64个条目,但是这个数量的哈希引擎不显示,因为这些引擎必须位于芯片内部的安全区域。此外,所提出的方案不保了完整性树的中间节点,但对于实际的NVM而言,恢复重建完整性树可能需要数小时。
我们的方案
不是所有内存页面更新频率相同,为了确保系统及时更新,不需要更新整个树,使用单独的小型完整性树来缩短根的更新路径,用于保护热页。
为此,ProMT以多队列(MQ)结构排序,用内存控制器的描述符块来跟踪内存页面的热度并缓存。热点页被动态检测并分配给热点树,有效减少了两个完整性树层数差异导致更新根所需的时间差异。这样奔溃恢复快,减少恢复所需写入次数。此外,还避免了将页面映射到热区域所需的重新加密开销。
使用Gem5模拟器允许SPEC2006基准套件中的10个内存密集型应用和内部开发的7个持久多线程应用程序。ProMT与延迟更新方案相比,性能提高了63.6%,写入次数减少了3.59倍,系统可以在3ms内恢复。
2 BACKGROUND AND MOTIVATION
2.1 Background
威胁模型
攻击者的能力:扫描内存、窥探总线;丢弃数据包、篡改内存、恢复旧的内容。
信任边界:处理器芯片内部
不考虑:内存访问模式泄露、定时侧信道、功耗侧信道
NVM
NVM作为主存或者混合主存的一部分,可以持久性保护数据,但容易遭受数据残留攻击,需要采取安全措施确保数据机密性和完整性。
计数器模式加密
下图展示split counter mode。major计数器64位,minor计数器7位。
为了确保计数器模式加密的安全性,禁止加密计数器重复使用,确保时间和空间的唯一性。将加密的缓存行地址和计数器集成到IV中,每次缓存行写回时更新minor计数器。minor计数器溢出,则major计数器递增,同一缓存行的所有minor计数器重置,使用新的计数器加密该页面。
一致性树
General Merkle Tree:每当加密计数器从内存中读出时,整个MT分支重新哈希得到新的根值并与处理器存储的根进行比较,也可以在第一个MT节点缓存命中时停止验证过程,因为缓存的节点的一致性是验证过的。GeneralMT通常用于验证加密计数器的一致性,数据一致性通过Keyed Message Authentication Codes (HMAC) values验证,如图2-c所示。
$$ MAC = H_k (encrypted data, encryption counter,, address)$$
GeneralMT和TOC有三个不同:GeneralMT不将任何MAC值与加密计数器块关联,允许更高的元数;更高级别的节点是其直接子节点的哈希值,MT更新过程是串行的;加密计数器被保留则可以重建MT,实际NVM中的重建可能要花费数小时。
Tree of Counters:TOC的计数器节点加密有8个56位的加密计数器、一个56位的MAC值、8个未使用的位。MAC值通过节点的加密计数器和父节点的VN计算得出,最底层的计数器用于加密数据,中间节点的计数器成为VN,与数据无关。数据缓存行写回内存时,加密计数器会递增,导致加密计数器父代的VN递增,并更新加密计数器的MAC,更新传播到根更新位置,节点更新不需要等待子节点更新完成,更新过程可以并行化。
写原子化
写原子性来启用安全NVM的持久安全性,发生崩溃并且安全元数据不是最新的,则无法验证内存的完整性,可能导致丢失数据或者数据被篡改。使用内存控制器的持久缓冲区Write Pending Queue (WPQ)来避免不一致。异步DRAM刷新为WPQ提供足够的电量,以便在崩溃时将其内容刷新到NVM。
2.2 Motivation
实际的NVM的MT分支深度超过10层,由于原子性要求,更新需要保存在写缓冲区中,直到更新根为止。下图体现与使用回写策略且不提供崩溃一致性的加密内存相比,根更新导致的性能开销达1.8倍,性能开销与程序发送到内存的写入次数和MT层数相关,可以通过减少MT层数减少开销,使用较小的MT保护最新更新的页面来减少开销。
下图显示了内存访问的空间分布。y轴表示偏移量,4页为一组;x轴表示帧编号,包含64组;z轴表示每个组的访问次数。可以用较小的MT保护热点数据,但是保护所有的这些数据需要适当大小的MT,不会产生太大改进;该图显示了访问的空间分布,将空间分布和每个页面的时间热度结合起来可以拥有一个小MT,从而显著提高性能。(不太懂呢)
3 DESIGN
并非所有的内存页面以同样的频率更新,使用额外的小MT保护热点从而减少每次需要更新的级别数量。
3.1 Design overview
三个主要挑战:
- 完整性树是用于保护连续内存的结构,应用程序的数据分配在整个内存区域,动态生长的完整性树非常复杂
- 用热点MT保护热点数据,需要在一组不同的加密计数器上构建新的完整性树,这需要在页面映射热区域或者从热区域逐出时重新加密页面
- 需要以高准确率低开销动态检测热点数据。识别热点数据需要跟踪对所有内存页面的访问,会导致很高的性能开销,需要不切实际的片上存储。
下面讨论可能的设计选择。
3.2 Design options
1.分配一个专用的热内存区域,将热页复制到其中,热区域有一组单独的加密计数器和单独的完整性树。但是仍需要声明为热页后复制出入开销以及逐出后重新加密开销,大多数情况下,会带来更多的写入、MAC计算和更高的性能开销。
2.使用单独的加密计数器和完整性树,但是不分配专用内存页面,检测到热点页面,就用热点MT重新加密。不需要复制开销,需要插入逐出的重新加密开销。
3.和2类似,只是,全局MT的加密计数器值被替换为热加密计数器的值,并更新完整性树,而不是在逐出时重新加密页面。消除了一半的重新加密写入,但是只有热加密计数器的值大于全局MT的情况下才有可能,将增加热加密计数器的递增速率,因为热区域加密计数器将恢复使用用于前一页的热计数器值,导致更快溢出。
3.3 ProMT design
如果全局MT和热MT中页面关联的加密计数器在逐出和插入时相等,则无需重新加密页面,只需要更新上部的MT级以确保完整性验证。因此ProMT不为热MT使用不同的加密计数器级,而是将热点页的加密计数器从全局MT重新映射到热MT,热点页的加密计数器更新不再传播到全局MT,只更新到热MT,在驱逐时将更新传播到全局MT一次就够了。
本文的设计不另外设置热区域,不需要复制开销;使用相同的加密计数器,不需要重新加密开销;允许分配物理地址空间的任何页达到热MT,不需要动态扩展热MT。然而,为了实现页面的动态重新映射,跟踪热MT的加密计数器成为崩溃一致性需求。
3.3.1 Hot pages detection
跟踪每个页面的写入次数来识别热点页,需要为每个访问的页面建立一个描述符块,将这些块组织在多队列MQ结构中,每个描述符块包括:页号、用于计算访问次数的访问计数器、用于标识该块所属队列的队列号、用于从热区域逐出的过期时间、指向队列下一块的帧指针、热MT中的加密计数器编号。
3.3.2 Page tracking
第一次访问该页面时,创建一个描述符块并插入Q0中,访问次数2时放到Q1,达到4次放到Q2。每当页面被访问描述符的过期时间会变成当前时间+生命周期,到达过期时间将被降级并重置过期时间,插入到下级队列的尾部,连续两次降级会被插入到Q3尾部,用于选择要驱逐的受害者。每为了减少MQ检查开销,降级只检查每个队列的头部,因为头部代表最近很少被访问的块。
优化
MQ存储在NVM中,使用内存控制器的小型缓存来缓存MQ描述符。为了确保在单个内存访问中检索描述符块,并增加描述符的可缓存性,我们将单个缓存行中的每四个描述符块分组并存储在表中。直接将页面映射到表条目中,以防止冲突,并执行一次访问检索。描述符块和描述符缓存如图5所示。
3.3.3 ProMT’s read operation.
如图6所示,当接收到读请求时,①内存控制器开始将请求转发给NVM,从Security metadata cache获取相关的加密计数器,②如果不在这里则发送请求。③通过检查描述符缓存,检查请求的缓存行是否受到全局或热点MT的保护,然后从安全元数据缓存中请求所需的全局/热点MT节点。④内存控制器接收到数据缓存行及其关联的安全元数据后,使用全局/热MT验证加密计数器的完整性,然后⑤使用在数据及其加密计数器上计算的HMAC验证缓存行数据的完整性。
3.3.4 ProMT’s write operation
在收到写请求后,①内存控制器开始检查页面热度,②并在其描述符块中增加访问计数器。如果页面达到热度阈值,则在③加密数据的同时选择一个受害页面进行驱逐。然后,回写数据,④更新HMAC,并将完整性更新反映到热点MT上,将被驱逐页面的完整性更新反映到全局MT上。如果页面没有达到热度阈值,将完整性更新反映到全局MT中。值得注意的是,当一个页插入到热MT时,更新两个完整性树的总写次数为LH - MT + LG - MT。
3.4 ProMT’s without persistence
由于ProMT使用一个通用的MT来保护热页面,只要热MT的根是最新的,那么对热MT的更新对于崩溃一致性来说是不必要的。由于热MT的尺寸较小,因此可以对Pro MT进行优化,减少对NVM的写入次数。ProMT No Persist ( ProMT-NP )以额外的恢复时间为代价来减少写次数,这需要在恢复阶段重新生成热MT。
3.4.1 ProMT’s impact on recoverability
由于全局MT和热点MT都在急切地更新,因此保证了安全元数据与数据的一致性。然而,由于加密计数器可以被其中任何一个完整性树所保护,因此我们需要能够识别出在崩溃前被热MT所保护的加密计数器。为了识别这些加密计数器,我们保留热MT加密计数器的地址。
ProMT - NP放松了对热点MT更新的坚持,依靠在恢复阶段重新构建MT来保证崩溃一致性。因此,每当一个页面被映射到热MT时,该页面的加密计数器的地址就需要持久化到跟踪区域。在恢复阶段,记忆控制器对跟踪区域进行迭代,重新建立热MT,然后恢复系统。
3.6 Security discussion
3.6.1 Impact on encryption
不影响
3.6.2 Impact on Integrity
ProMT维护两个独立的完整性树,但ProMT不改变完整性保护,也不改变被保护数据的验证过程。完整性验证过程可以分为两个阶段,数据完整性和加密计数器完整性。
使用HMAC对数据完整性进行验证,HMAC通过数据、加密计数器和数据缓存行地址进行计算。由于ProMT不影响HMAC的任何一个组件,因此ProMT不影响数据完整性验证。
加密计数器的完整性可以使用完整性树进行验证,完整性树将加密计数器缓存行与其他缓存行一起生成父节点。这两种完整性树的完整性验证都很简单,但是在热MT中交换页面和使用不同的加密计数器看起来好像为已知明文攻击打开了空间。
由于热MT保护的加密计数器是动态变化的,一个较小值的加密计数器可能会替代另一个较大值的加密计数器。然而,这种替换仍然是安全的,因为两种情况下的加密计数器属于不同地址的不同数据页,这将总是产生不同的HMAC值。
7 Conclusion
在这项工作中,我们提出了一种新的机制,通过减少更新完整性树根所需的MAC计算次数来提高完整性保护系统的性能。保持一个最新的根对于系统的可恢复性是至关重要的。我们注意到内存页是以不同的速率更新的,应用程序的内存占用并不消耗整个内存。因此,我们提出了ProMT,通过使用保护应用程序热页的小型完整性树来减少MAC计算的数量。然后,我们进一步优化了ProMT,提出了ProMT - NP,它放松了对热点MT节点的持久化,以在恢复时间中花费几分之一秒的代价获得更好的性能。
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达,可以在下面评论区评论