【架构论文】Composable Cachelets: Protecting Enclaves from Cache Side-Channel Attacks(2022USENIX Security)

Composable Cachelets: Protecting Enclaves from Cache Side-Channel Attacks

摘要

缓存侧信道攻击允许对手泄露隔离飞地中存储的的机密而不用直接访问飞地内存。本文提出一种可扩展的LLC动态划分策略(CC),用于完全隔离飞地。CC支持飞地隔离,可以在飞地创建或者销毁时动态调整飞地容量。我们提出一种飞地感知和缓存感知的操作语义去帮助奖励CC的安全策略,实验表明CC能够以较好的性能和复杂性抵御缓存侧信道攻击。

介绍

TEE依赖硬件强制执行飞抵边界,确保机密数据的一致性和机密性,最近研究表明共享的缓存行存在潜在攻击者,可以观察他们访存时间的不同来了解其他程序的允许模式。攻击者可以利用受破坏的OS对侧信道测量有更好的控制。

现有的缓存划分机制,可以抵御这些攻击,但存在局限性,使得不能和SGX或类似TEE兼容。划分缓存给每个安全与分配不相邻的缓存行来避免缓存行碰撞。

  • 一些划分机制依赖于系统软件去执行关键保护,不符合TEE安全模型。
  • 一些设计硬件实现划分,需要分配一个或更多缓存路给每个划分,然而飞地通常保护关键数据和指令,不能充分利用这些粗粒度划分,降低了非飞地应用的性能。
  • 飞地数量快速操超过LLC可用缓存路的数量,特别是在多租户云设置中。

这些限制表明,部署新的高效可扩展的划分机制去保护飞地是必要的。

应用程序数据保护的需求是细粒度动态发展的,安全性是跨层关注的问题,最好的解决方案是简化软件堆栈,赋予缓存应用所需的细粒度和动态性

CC提供细粒度灵活性的缓存分区 ,无需信任系统软件来强制隔离。如图1所示,为了支持不同内存需求的分区,可以把单个缓存分配给一个飞地,或缓存链接在一起形成更大的虚拟分区。CC可以把任意的、非顺序的缓存组成虚拟分区。


除了架构设计,还提出了一个研究缓存侧信道的程序行为,并用CC作为防御机制。通过新颖的缓存感知和飞地感知操作语义,解释了飞地程序在实际应用中的行为,飞地和缓存可能是动态管理的,攻击者会观察到不同的缓存事件(命中,未命中,调整大小)。这些作为CC的安全证明。

本文贡献总结如下:

  • 提出CC,新颖、细粒度、可扩展的缓存设计,针对侧信道攻击有效保护应用程序;
  • 提出缓存感知和飞地感知的操作语义,严格定义飞地程序的行为,建立CC的安全属性
  • 在不同应用上评估CC的性能影响,包括小的密码学程序、大的SPEC和PARSEC基准。还评估了设计的延时、面积、功耗影响。结果表明安全性好开销小。

威胁模型

使用SGX的威胁模型,假假设有一个强大的对手可以利用受损的OS或hypervisor的资源对飞地发起攻击。
假定已建立的SGX保护在CC中完全实现。这些保护防止攻击者直接访问enclave内存,并通过对DRAM和互连的物理攻击提取信息。
攻击者可以尝试Prime+Probe攻击与受害者共享的缓存,我们保守地假设所有飞地之间互不信任,包括属于同一进程的飞地。
虽然操作系统在enclave的生命周期中协调,例如enclave的创建和销毁、进入和退出enclave代码以及enclave页面错误,但SGX硬件确保执行这些操作时不会暴露或更改enclave的内部数据。

虽然不直接解决恶意飞地的拒绝服务攻击,但我们限制了可以分配给飞地的LLC空间。
恶意的enclave还可能试图接管整个小缓存空间,从而导致其他enclave的性能损失。为了防止这种攻击,甚至可以在enclave分区内设置额外的服务质量机制。

Composable Cachelets

图2描述了CC的高层设计和操作,为了跟踪缓存分配到不同的enclave, CC为每个物理Cachelets分配一个唯一的缓存标识符,该标识符由缓存内的set idx和way offset组成。CC将每个未分配的小缓存的标识符存储为**全局Cachelets空闲列表(CFL)**中的一个条目,CFL是一种类似于fifo的结构,类似于寄存器重命名方案中的空闲列表。

当创建一个enclave时,CC从CFL弹出一个或多个条目,并将它们添加到**硬件虚拟分区表(VPT)**中,该表为分配给正在运行的enclave的每个缓存保存一个缓存标识符条目(a)。CC拦截来自enclave的内存访问并将其重新映射到enclave的VPT定义的缓存中。重新映射逻辑掩盖了地址,以便它索引到一个小缓存集(b),并提供替换逻辑与路索引,以确保只有Cachelets的路在未命中时被驱逐( c )。

当飞地被摧毁时,CC将使飞地的Cachelets失效,并将VPT条目返回给CFL。CC还扩展了由隔离执行保护的enclave元数据,以便在上下文切换期间存储每个enclave的VPT数据。

CC允许非enclave程序自由访问cachelet 中未分配的任何缓存行。修改后的替换逻辑防止非enclave访问驱逐任何分配的cachelet 中的行(d)。CC为非enclave访问保留了几种方法,确保每个缓存集中的非enclave程序都可以使用缓存行。

cachelet 地址和分配

enclave地址重映射

图3显示了CC如何跨多个非连续的缓存透明地重新映射enclave内存访问。在常规缓存中,使用从地址中提取的set index bit将地址映射到缓存集(图3)。

为了重新映射cachelet 的内存访问,CC用cachelet set offset重写部分原始地址的 set index,如图4。原始set index可能映射到任意cache set(a),固定高阶将映射范围限制在cachelet (b)。例如,为了强制所有的地址访问1000-1011,CC将高位set index bit设置为10。

如果分配给所有enclave的cachelet set数量少于cache set总数,CC重新映射地址,让不同set index到一个飞地的相同set。为了消除引用的歧义,CC将覆盖的索引位添加到用于区分映射到同一缓存行的地址的标记位。只有指定供cachelet 使用的高速缓存路才需要这些附加位。

为了将飞地地址映射到cachelet 路,CC采用粗粒度分区建议的机制,使用轻量级硬件屏蔽缓存替换逻辑用的位向量,将驱逐限制在指定的路范围。为了生成给定cachelet 的屏蔽位,CC扩展了寻址总线以包括从VPT检索的路偏移位。如果发送缓存未命中,类似解码器的硬件会将这些位转换为用于飞地访问的路掩码。这一逻辑还可以防止cachelet 访问边界外的更新替换位,消除潜在的替换逻辑侧信道。

cachelet 分配

VPT中的条目数量决定了CC中每个enclave的虚拟分区大小。通过改变索引VPT的set bits,CC定义了虚拟分区大小范围。索引的粒度由图5所示的VPT索引掩码寄存器确定,该寄存器左移以扩大索引范围,cachelet 是从CFL以2的幂添加的。当存在一个分区时,寄存器将所有的VPT访问索引为00,强制对所有enclave地址使用单个cachelet 。当分配两个额外的cachelet ,掩码再次移动,允许索引到所有的VPT条目。

为了在cachelet 之间强制执行隔离,CC必须保证每个enclave的内容不相交,不同enclave之间没有重复的单个cachelet 标识符条目。CC使CFL相对于所服务的缓存的全局性和一致性来实现这一点。与LLC类似,CFL是所有内核共享的统一结构,来自不同内核的对CFL的POP请求会按顺序执行,任何enclave无法使用特定条目直到它从CFL中移出。这避免不同enclave同时保存相同的条目,从而消除重叠虚拟分区导致信息泄露的可能。全局CFL的使用为CFL POP操作提供了类似于LLC缓存访问的延迟。然而,CFL访问很少见,仅在enclave创建、销毁、调整大小时发生。

可选的分区大小

CC支持重新调整虚拟分区大小,以适应有不同内存需求的enclave。一种方式是添加新的CCREQ指令,允许飞地直接请求额外的缓存,CCREQ将控制权转移到OS,OS可以使用新的CCGRANT指令设置一个标志,触发CFL弹出到飞地。类似于SGX的页面错误处理,该接口允许OS管理cachelet 分配去平衡内存资源,而不会暴露enclave的内容。

新创建的enclave可以调用CCREQ来请求在其执行期间进行静态enclave分配,CC也支持动态调整大小,在内存密集型阶段请求额外缓存并在不需要时释放。动态调整大小进一步限制分区对缓存性能的影响,只要调整大小的行为不依赖于敏感数据,调整大小操作就是安全的。

安全更换策略

简单的分区方案可能成为缓存替换逻辑攻击目标,CC设计遵循DAWG,它描述了防止这些攻击的轻量级逻辑,主要思想是在一个分区内坐替换策略独立于对其他分区的缓存访问,从而提供元数据隔离。DAWG考虑了LRU、SRRIP、NRU替换策略,该逻辑与CC兼容。

CC操作示例

图6 体现了CC在不同飞地的创建、调整大小、销毁操作。一开始分配给enclave e1的只有单个cachelet 。
a:e1并不运行在核心,它的VPT状态存储为enclave元数据的一部分,当新的飞地e2创建,VPT初始化,在CFL头部有一个cachelet 标识符项。为e2在路1定义了新的4-set cachelet 。
b:CC通过从CFL pop 了3个额外的表项扩展属于e2的虚拟划分
c:e1结束执行,CC重定义它的VPT表项,从VPT pop e1使用的表项并返回到CFL。
d:e3被调度,扩展到最大的虚拟分区大小,分配给e3剩余的表项。

非飞地访问的替换

为了防止非飞地进程的访问和飞地的cachelet 冲突,CC用表示每个cachelet 位置是否被占用的小表扩展了缓存替换逻辑。使用高位set位作为索引,检查来自非飞地程序的地址,确定访问集的哪些路包含飞地。在缓存未命中时,使用额外的屏蔽逻辑来增强缓存替换硬件,防止飞地路被替换出。

在PLRU替换中,选择位定义了一个二叉树,其叶节点对应于缓存路。当缓存未命中时,PLRU沿着树内部节点处的选择位指示的路径下降树来选择逐出目标。如图7,0表示左子树下降,1表示右子树。
一个缓存行替换后,沿着选择路径的节点将反转为原理最后访问的路径,类似LRU替换算法。

除了防止树的最终分支的缓存路被逐出,CC还确保选择路径不包括没有非飞地作为子集的分支。图7中,替换路径不得不沿着根节点的左边缘,因为该方向的子树仅通向不应受影响的飞地路径。

CC必须包含将访问从根节点转移到右边缘的逻辑,在那里找到可以替换的路。

图8-a的算法在PLRU替换树遍历的每个级别强制执行此策略,对于沿选择位b的遍历路径上的每个节点,策略根据l和r哪个为真选择一个新的位b’,当且仅当cachelet 占据节点左侧或者右侧的所有路径子树。如果两个子树都包含非cachelet 的路,则使用现有的替换位b;否则选择b’以将替换策略从全是cachelet 的子树转移。算法的最后一种情况是无效状态,如果集合中至少有一路可用于非飞地访问,则从选择树的根无法到达该状态。

图8-b给出了选择算法对应的真值表,可以使用8-c的门结构实现。对于给定节点,左子树l的可行性通过对该子树通向的所有cachelet 分配位进行逻辑与来确认。

图9表示8路PLRU的替换逻辑的门级实现,这个硬件可以轻松扩展以支持不同缓存关联性。

安全cachelet 逐出

CC中的cachelet 是有限资源,如果大量enclave同时运行,这些资源可能被耗尽。为了防止cachelet 资源匮乏,CC提供安全驱逐和重新分配给上下文切换飞地的逻辑。该机制与SGX现有的页面逐出逻辑相关,允许不可信的OS通过受限的ISA接口发起逐出,并执行硬件检查以强制执行飞地隔离。

为了支持高速缓存驱逐,CC硬件维护一个表,该表将每个当前已分配的cachelet 映射到当前拥有该cachelet 的enclave的ID。为了响应空的CFL异常而强制释放cachelet ,CC引入CSD(缓存关闭)指令。CSD将cachelet ID作为其参数,从映射表中查找关联的飞地ID,并使用飞地ID来访问飞地元数据。CC使用每个VPT条目的有效位扩展元数据,并且与所提供的cachelet ID关联的位无关,CC然后将无效的cachelet 添加到CFL。每次调度enclave时,CC硬件检查是否有无效的VPT条目,如果有则在enclave恢复执行前刷新所有无效的VPT条目,并用CFL的新条目替换他们,从而防止Enclave访问重新分配的缓存的cachelet 。此外,是废帝保留的有效cachelet 内容无效。

通过立即替换重新分配的CFL条目使整个虚拟分区的内容无效,CC可以防止利用cachelet 驱逐的受控信道攻击(恶意OS故意使属于飞地的页面无效,使用由此产生的页面错误来检测哪些页面被访问)。如果对页面的访问取决于敏感数据的值,则攻击者可以使用页面错误序列来提取该数据。CC考虑这类攻击,因为cachelet 驱逐是由不受信的OS控制的。通过在重新调度飞地时强制从CFL替换无效的cachelet ,CC使cachelet 重新分配独立于飞地的内存访问,从而防止数据泄露。此外,通过清除整个虚拟分区的内容,CC可以防止攻击者基于时间延迟对最近逐出的cachelet 进行本地访问。

这种失效策略很激进,但考虑三个因素可以减轻对性能的影响。

  • 具有性能感知能力的良性OS可以优先驱逐小型或者单个cachelet 的飞地,从而重新调度时快速重新填充其虚拟分区;
  • 飞地可能用于多租户集群,负载均衡器可以有策略地分配飞地负载以限制驱逐的发生。
  • 可以引入额外的逻辑来检测对CC的受控信道攻击,并在不存在威胁时放宽缓存替换规则。这可以通过添加简单的硬件计数器来检测发动受控信道攻击所需的cachelet 驱逐的异常速率实现。仅当计数器超过有效攻击阈值,CC才会启用上述的严格的无效策略,否则将保留cachelet 的内容并推迟重新分配。

cachelet 逐出机制假设逐出发生时,受害者飞地是上下文切换的。否则,正在运行的受害者飞地可能在cachelet 失效前访问重新分配的cachelet 行。OS不受信,CC必须保证目标enclave在CSD指令更新CFL之前进行上下文切换,为了强制执行此要求,CC提供新的CTRACK指令,该指令必须在CFL更新生效前发出。CTRACK使硬件跟踪运行拥有指定cachelet 的enclave的所有处理器并组织CSD完成,直到OS发出中断以驱逐该enclave的所有线程。

CC与缓存切片的兼容性

一些现代架构将缓存划分为两个或多个可以并行访问的片,并使用哈希函数将内存映射到交替的片。CC可以在每个缓存片上强制执行共享缓存布局,在选择偏后重新映射应用地址。因为cachelet 布局在每个片上复制,所以每个飞地接受与简单寻址方案下相同数量的高速缓存行,这些行分布在多个片上以并行访问。

形式化证明

评估

从PPA、latency和设计复杂性的角度评估CC。

性能评估

基准和方法

gem5,配置三级缓存。

工作负载

  • cryptographic programs: including three traditional applications (AES, Blowfish and SHA) taken from MiBench suite and five Post-Quantum Cryptography (PQC) applications, namely BIG-QUAKE,CRYSTAL-KYBER , CFPKM , Compact LWE , and DAGS
  • the impact of isolating larger applications:evaluated programs from SPEC 2017 suite
  • the impact on securing paral- lel applications: evaluated CC with PARSEC bench- marks

加密程序的性能

加密应用小,一个enclave包括最小的分区大小就可以利用局部性提高性能。

SPEC 2017 Benchmarks

设想CC主要保护小型飞地免受缓存的信息泄露,还评估了较大应用程序的性能影响。总的分区大小从512KB到4MB,cachelet 大小32KB。即使分区大小合适,也存在性能下降,所有配置下性能下降均低于5%。实验结果表明在具有隔离缓存分区的enclave内存支持较大程序的完整执行时,对大多数程序来说性能损失有限。分配LLC对不同程序的敏感度不同,因此研究针对应用程序动态配置LLC空间的技术非常终于。

PARSEC性能

非飞地程序的影响

延迟分析

面积功耗分析

相关工作

cache划分机制防止信息泄露,但现有机制使用way粒度的方法,不能有效扩展奥大量小飞地或者需要可信OS来执行隔离,使得他们和现有隔离的安全执行模型不兼容。
DAWG和CATalyst信任OS去控制划分,如果OS受损,安全保证不再有效。DAWG对支持的保护域的数量有严格限制,这影响其灵活性。
NoMo cache的划分不需要软件,但是不可扩展,因此不适合LLC,特别是在同时运行大量飞地的基于云的系统中。此外,一些cache way在NoMo中共享,如果受害者的访问划分到共享的缓存,泄露可能发生。
其他划分方法,例如Intel CAT被设计用于提高服务质量,不保证占用不同分区的进程之间的隔离。
一些方法通过页着色提出了set-partition,在分配cache set时,数据可能需要在内存中频繁移动,因为缓存的set allocation与物理地址绑定,页着色也不能很好的和大页结合。
HybCache 为需要隔离执行的代码提供了软件缓存分区,它需要子缓存路中完全相关的搜索,这是昂贵并且很难扩展到大LLC的。此外,HybCache 不执行严格的隔离,普通程序也可以访问整个缓存。
CURE提出定制化架构去确保飞地免受侧信道攻击,然而缓存分区以way粒度进行,不像CC的细粒度划分。
在并发工作中,Saileshwar 提出Bespoke Cache Enclaves ,一种基于set的缓存划分机制,cache空间被划分为包含大量连续set的不重叠的cluster。这一提议的灵活索引机制限制特定安全域智能访问属于它的缓存分区。类似的理念用在Chunked-Cache,针对TEE的设计,允许每个程序有自己特定的缓存集,相反,CC设计使用way-based和set-bssed的划分为现有分区提供动态重新配置。这两个工作中,分区机制都和飞地操作相关。
在随机化的设计中,CEASER提议低延迟加密动态加密缓存索引。原来的CEASER提议被证明容易受到高速密钥恢复攻击[48],而在[48]中提出的用于解决这一漏洞的修订版本的CEASER最近被[7]中提出的Brutus攻击所破坏。虽然更强的地址加密可以加强CEASER,但这将对访问延迟产生影响。类似于[48]的攻击可以用来破坏[65]中提出的另一种称为SCATTER-CACHE的随机化机制。另一项最近的工作[46]也证明了基于随机的缓存的安全问题,如CEASER-S。一般来说,分区从根本上提供了更强的安全保证。
在其他最近的工作中, SHARP[71]对LLC的缓存替换策略进行了修改,RIC[33]避免了对私有缓存中的只读数据的反向失效,从而避免了对LLC的连续访问。这两种技术都通过OS支持关键操作,在RIC中,只读页面需要被标记,而SHARP则向操作系统报告可疑行为(操作系统可以选择忽略警告),并依赖于修改后的clflush指令。

为侧信道攻击设计正式框架是一个新兴但积极追求的方向。几个正式的框架已经说明了由于推测而导致的漏洞[14,16,26,41],而我们的重点是基于缓存的通道,更重要的是,对此类攻击的防御。还提出了在飞地上运行的程序的正式基础(例如,[24,25,55]),但没有关注侧信道攻击或其防御。更广泛地说,已经提出了用于解决侧信道攻击的编程语言技术,包括抽象解释[60,67],符号执行[12,27,61],程序分析和转换[22,59,66]。这类相关工作与我们的工作距离更远,因为他们提出的是软件防御,而我们的工作是以硬件为中心的。最后,硬件描述语言也被设计用来减少时序通道[72-74]

总结

保护缓存不受侧信道攻击是很重要的,特别是在隔离执行的环境中。在这些设置中,即使是高权限软件也屏蔽了应用程序秘密,使其无法直接访问,但仍然可以通过侧通道泄露。可组合缓存(Composable Cachelets, CC)是一种新的、可扩展的动态分区的最后一级缓存设计,它将安全enclave与其他应用程序以及彼此隔离开来。

CC分区可以在enclave进入和离开系统时进行动态管理,从而根据系统需求调整缓存配置。我们证明了CC通过基于缓存感知和包感知操作语义的严格安全模型提供了可证明的缓存侧通道攻击保护。我们证明了CC可以以最小的面积和功耗开销实现,并且许多应用可以以适度的性能成本从CC保护中受益。这些特性使CC成为sgx风格的隔离执行系统的一个有吸引力的设计选择。


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达,可以在下面评论区评论

×

喜欢就点赞,疼爱就打赏