目录
- 摘要
- 引言
- 性能
- 贡献
- 背景
- 英特尔SGX
- SGX的异常
- SGX侧通道
- WebAssembly(Wasm)
- Wasm中的内存安全
- PRIDWEN和Wasm
- 概述
- 场景
- 威胁模型
- 目标
- 适应性
- 证明性
- 可扩展性
- 架构
标题:Pridwen: Universally Hardening SGX Programs via Load-Time Synthesis
作者:an Sang, Georgia Institute of Technology; Ming-Wei Shih, Microsoft; Sangho Lee, Microsoft Research; Xiaokuan Zhang, Georgia Institute of Technology; Michael Steiner, Intel; Mona Vij, Intel Labs; Taesoo Kim, Georgia Institute of Technology
发布:USENIX ATC
时间:2022
摘要
Intel Software Guard Extensions (SGX) 的越来越多的威胁是侧通道攻击 (SCA)。作为回应,已经提出了许多对策。
然而,很难将它们结合起来,同时保护SGX程序免受多个SCA的影响。
不同对策的naïve组合在实践中不起作用,因为其中一些是
1)在缺乏依赖硬件特征的目标环境中无法部署;
2)如果存在具有相似功能的防御,则冗余;
3)通过设计或实现相互不兼容。
在部署之前识别所有这些条件并准备潜在的解决方法具有挑战性,主要是在SGX程序针对抽象或操纵其配置的多个平台时。
PRIDEN是一个基于目标执行平台配置加载SGX程序时有选择地应用基本的SCA对策的框架。PRDWEN允许开发人员以WebAssembly (Wasm)的形式部署程序。在接收到Wasm二进制后,PRIDWEN探测当前的硬件配置,合成具有最优对策集的程序(即原生二进制),并验证最终的二进制。PRIDEN既支持软件辅助对策,又支持硬件辅助对策,我们的评估有效地展示了PRIDWEN,忠实地合成了多个基准程序和实际应用,同时针对多个SCA确保它们。
引言
在共享计算环境(例如公共云)中进行机密或私有计算具有挑战性 [1, 2]。因此,领先的云服务提供商提出并采用英特尔软件保护扩展 (SGX) [3, 4] 来帮助确保系统软件和硬件甚至不会影响在 SGX 飞地中运行的应用程序的真实性、机密性和完整性 [5-7]。然而,Intel SGX容易受到侧通道攻击(SCAs)[8]的影响,这些攻击对旨在部署的共享云环境的威胁。研究人员表明SGX容易受到各种SCA的影响,利用缓存[9 - 13]、页表[14 -18]和瞬态执行[19,20],可以推断敏感的控制流或窃取秘密数据。为了防御单个SCA,已经提出了基于软件和/或硬件的对策,如缓存刷新[21,22]或驱逐检测[23]、页面故障检测[24]和超线程技术(HT)禁用[21,22]或协同定位检测[25,26] (表1)。
然而,在一个易受攻击的程序中,多个副通道可以共存;保护SGX程序不受多个已知SCA的影响是困难的,更不用说未知SCA的存在了。一种方法是对单个SCA集体应用现有对策,但由于不知道不同的目标执行平台或共存的缓解技术,这样做失败了,这可能会使此类对策1)由于不同的硬件设置而无法部署,2)由于过度保护而冗余,以及3)与不同缓解措施之间的冲突不兼容。另一种方法是采取综合对策,即遗忘执行[18,31],这对除推测执行外的许多SCA都有效。然而,即使是最先进的遗忘执行也会导致平均51×[31]的速度减慢,这在很大程度上降低了云计算的成本效益。一种实用的替代方案,数据定位(重新)随机化[32],导致相对较小的放缓(8×),但它仍然很重,并且不包括控制流泄漏。
解决此类问题的一种传统方法是创建一个臃肿的应用程序,该应用程序包含用于每个架构和运行时检测代码的独立编译的对象文件,并根据不同的硬件配置选择性地激活它们[33]。然而,这种方法不适合英特尔SGX:首先,检查硬件配置是否可用由可信计算库(TCB)外部的系统软件移植;恶意系统软件可以向SGX应用程序提供有关硬件配置的错误信息。其次,包围共享的安全内存,处理器保留内存(PRM)是有限的[4];膨胀的SGX应用程序很容易占据其中的很大一部分。
为了切实保护SGX程序免受各种SCA的影响,我们认为,应将要应用的SCA缓解措施的决定推迟到尽可能接近最终执行的时候,以最适合目标SGX平台以及共同存在的缓解技术。因此,在本文中,我们没有采用静态编译方法,而是提出了PRIDWEN,这是一个使用加载时间合成的框架,通过根据目标执行平台上的配置选择性地应用不同的缓解技术来动态强化SGX程序。在确保安全性的同时,PRIDWEN通过最大限度地减少租户端准备所需的额外工作量和云端程序合成的运行时开销,保持了云计算的成本效益。
PRIDWEN有一个通用加载程序,它基于四个组件在飞地内安全地加载和硬化给定的SGX程序:
1)使用SGX异常处理逻辑和远程证明识别目标平台硬件和系统配置的Prober;
2) PassManager,其基于所识别的配置来管理和确定一组最佳的可行仪器通道;
3) 合成器,在将给定SGX程序加载到目标飞地之前,使用所选的仪器通道硬化该程序;和
4)验证器,用于验证最终可执行文件是否如预期那样硬化,并为开发人员提供在执行前远程验证合成过程和硬化二进制文件的功能。
为了使PRIDWEN 1)平台独立,2)仪器友好,3)轻量级,我们使用WebAssembly(Wasm)[34,35]作为中间表示(IR)开发了一个新的仪器框架。PRIDWEN在二进制中的大小只有1.26 MiB,这只会为飞地TCB增加一个较小的占地面积。SGX[36-39]的现有Wasm运行时仅解释Wasm二进制文件,而不支持任何检测。此外,与用于非SGX程序的现有Wasm插入框架[40,41]不同,PRIDWEN可以在Wasm IR和本机代码级别全面转换Wasm二进制文件。PRIDWEN还支持多种高级语言;用户只需要使用Wasm编译器后端(例如Emscripten[42])编译他们的SGX程序一次。
为了展示PRIDWEN的功能和实用性,我们在PRIDWEN中集成了四个缓解过程:1)TSGX[24],以防止硬件支持的页面故障SCA;2) Varis[26]以仅通过软件的方式减轻缓存定时、页面故障和基于HT的攻击;3) QSspectre[30]以减轻Spectre攻击;以及4)细粒度地址空间布局随机化(ASLR)[43]作为通用缓解措施。我们首先详细介绍了将四个过程集成到PRIDWEN中的步骤,然后演示了PRIDWEN如何以最小的手动工作量基于运行时配置生成最佳的过程集。
性能
PRIDWEN在原始缓解技术的基础上提出了适度的性能开销,并保留了执行语义的忠实性(§6)。对于过时的微码(即没有硬件级别的缓解),使用硬件辅助的非冗余缓解技术,硬化的真实世界应用程序(Lighttpd、libjpeg和SQLite)的平均速度减慢2.1倍,使用仅限软件的缓解技术(即无硬件级别的缓减),这与最初报告的所选对策的性能开销非常一致。此外,PRIDWEN忠实地编译并运行了官方Wasm规范测试套件中的所有73个程序[44]。程序合成在0.5秒内完成,在测试中临时使用的飞地内存小于25 MiB。
PRIDWEN被设计成一个易于扩展的通用框架,它尊重计算平台的多样性。PRIDWEN作为一个开源项目公开提供,允许社区进行测试、使用和贡献。我们设想,不断增长的PRIDWEN框架应该成为抵制SCA的SGX生态系统的枢纽,以及潜在的其他缓解措施。
贡献
SGX程序的第一个平台感知加载时间综合框架。据我们所知,PRIDWEN是第一个通过根据目标平台应用最佳的基于硬件和/或软件的缓解措施来动态合成和强化SGX程序的框架。
可在飞地Wasm检测和编译工具链中验证。在SGX飞地内实现了一个基于Wasm的综合工具和编译工具链,以实现带有证明的动态程序合成。PRIDWEN可以在IR和本机级别上对Wasm进行测试。
广泛评估。我们使用基准测试和实际应用程序广泛研究PRIDWEN的性能。结果表明,PRIDWEN只引入了适度的运行时开销,同时保留了执行语义。
背景
英特尔SGX
Intel SGX是一种基于硬件的受信任执行环境(TEE),可在不受信任的远程环境(如公共云)中安全地运行用户空间应用程序。通过远程认证[45],Intel SGX允许用户将他/她的签名程序加载到远程环境中,同时帮助确保程序二进制文件从未被更改。为了帮助保护SGX程序的代码和数据,Intel SGX为每个程序提供了一个飞地,这是主存储器的专用安全区域。该飞地与包括操作系统在内的任何其他软件隔离。存储在飞地中的代码和数据始终由内存加密引擎(MEE)加密,只有当它们加载到CPU包(即缓存)中时才解密,以帮助防止物理攻击,如冷启动攻击[46]。
SGX的异常
按照惯例,异常被传递到诸如OS之类的系统软件以供进一步调查。但是,Intel SGX不能采用传统的异常处理,因为系统软件不受信任。相反,Intel SGX定义了两种机制,异步Enclave Exit(AEX)和自定义异常处理程序(CEH)[47,48]。每当在飞地执行期间生成异常时,CPU就会异步退出飞地。在AEX期间,原始异常编号和寄存器上下文存储在飞地内的状态保存区(SSA)中,然后由合成数据覆盖。此外,SGX允许开发人员定义CEH来处理飞地内的异常;这些CEH可以检索SSA以检查存储的异常编号(GPRSGX.EXITINFO.VECTOR)和寄存器(GPRSGTX.),并更新它们(例如,GPRSGT.RIP)以恢复执行。
SGX侧通道
针对SGX的SCAs已被积极研究。传统的缓存SCAs可针对不同配置的Intel SGX工作[9-13,49]。最近的研究表明,页面访问模式[14-18]、中断执行时间[50,51]、分支预测行为[28,52]、推测执行[19,20]和英特尔的内部缓冲区[53-55]都可以用来推断飞地内的敏感信息。作为回应,已经提出了应对SCAs基本特征的对策。T-SGX[24]和Cloak[23]分别使用事务同步扩展(TSX)来准确识别包围区内的页面错误和缓存驱逐。Varis[26]和DéjaÉVu[27]旨在检测频繁中断或AEX。此外,由于HT能够在没有中断的情况下实现并发SCA,Varis[26]和HyperRace[25]试图防止SGX超线程与其他超线程位于同一位置。禁用HT和/或刷新一级缓存对于缓解最近的推测性或瞬态SCA[21,22]也是必要的。此外,SGXLAPD[56]利用巨大的页面来降低页面级SCA的准确性。最后,针对Intel SGX[18,31,57–60]的遗忘代码执行和数据访问技术已被提议作为针对SCA的一般对策,但它们会带来过高的性能开销。最先进的基于ORAM的系统Klotski[61]显著提高了性能。然而,它只会击败受控通道攻击[14,18]。相比之下,PRIDWEN专注于通过自动和选择性地同时应用针对不同SCA的多种防御来普遍强化SGX应用程序。
WebAssembly(Wasm)
万维网联盟(W3C)提出Wasm[34]作为各种高级语言(例如C/C++和Rust)的独立于平台的编译目标。Wasm二进制文件具有类似语言的语法和结构,适合编译和插入。Wasm中的基本可执行代码单元是一个由多个部分组成的模块,其中每个部分都包含模块的特定定义,如全局变量、函数和每个函数的指令序列。Wasm指令在堆栈机器上执行,Wasm只支持结构化控制流,如if-else和带有outgoto语句的循环,从而实现单次快速编译。
Wasm中的内存安全
Wasm维护一个线性存储器,其大小可配置,专用于除局部和全局变量之外的所有存储器访问。线性存储器与诸如代码段和调用堆栈之类的其他存储器区域是不相交的。因此,给定有缺陷的Wasm程序(例如,源于具有内存损坏缺陷的C程序),攻击者只能干扰线性内存中的数据,但不能篡改其控制流。
PRIDWEN和Wasm
由于Wasm二进制文件结构良好,便于进行高效的JIT编译,PRIDWEN采用Wasm作为IR来支持加载时间合成。PRIDWEN还受益于Wasm的内存安全功能,减轻了针对SGX的代码重用攻击[62,63]。此外,Wasm的最小占地面积符合PRIDWEN对飞地内紧凑而灵活的仪器和编译工具链的需求。尽管现有的编译器(例如LLVM)可以适应新的可扩展CPU中扩展大小的包围区[64],但TCB大小将大大增加,迁移工作也将非常重要。
概述
场景
在本文中,我们考虑了云上广泛使用的机密计算场景,其中用户希望在云上使用Intel SGX来保护他/她的数据和应用程序。在这个场景中,有两个实体:云和用户。用户在飞地内运行其应用程序,并希望使用PRIDWEN保护其数据免受侧通道攻击。
威胁模型
我们的威胁模型与其他SGX相关研究中的威胁模型相似[14,24,26]。我们的TCB由Intel CPU提供的SGX飞地和飞地内的所有内容组成,包括PRIDWEN、用户准备的目标Wasm二进制文件和PRIDWEN通过选择策略。我们假设用户使用远程证明来验证CPU和PRIDWEN的有效性,并与PRIDWEN建立一个安全通道来安全地传输他/她的二进制文件。我们假设对手已经破坏了底层特权系统软件(如操作系统)来攻击PRIDWEN和目标二进制文件。任何由于CPU的潜在漏洞和在飞地内运行的代码造成的威胁超出了范围。
目标
适应性
PRIDWEN根据需要选择符合目标执行平台能力的缓解技术。PRIDWEN需要在不引起冲突或故障的情况下,将多种缓解技术最佳地结合起来。
证明性
PRIDWEN的第二个目标是支持SGX内部动态生成的二进制文件的远程证明;本机SGX仅支持验证静态二进制文件。PRIDWEN应允许用户验证在飞地内运行的最终可执行文件的完整性,并获得有关可执行文件是否由PRIDWEN忠实生成的真实信息(例如,缓解方案的选择和应用)。
可扩展性
PRIDWEN的另一个目标是可扩展性,这样它就可以支持除现有技术外即将推出的针对SCA的缓解技术。此外,由于实用计算平台的多样性,它应该支持多个平台。PRIDWEN的可扩展性还应允许对遗留缓解技术进行平滑集成。
架构
【图1:PRIDWEN概述。1用户将程序编译成Wasm二进制文件,并通过安全通道将其传输到PRIDWEN。2 PRIDWEN探测硬件配置。在本例中,CPU启用TSX和IBRS,同时禁用HT。3 PRIDWEN选择缓解通道。这里,它选择T-SGX和ASLR是因为CPU启用TSX(用于减轻页面错误攻击)和IBRS(用于减轻Spectre变体)。4 PRIDWEN根据选择的通道合成并硬化原生二进制。5 PRIDWEN验证最终合成的本地二进制。将向用户发送一个报告,以验证最终的二进制文件。】
图1显示了PRIDWEN的概述。PRIDWEN的核心是一个飞地内加载程序,它通过相应的组件实现关键思想:用户模式硬件探测(Prober)、最佳通道选择(PassManager)、加载时程序合成(合成器)以及合成后验证和最终二进制证明(Validator)。考虑到每种对策可能取决于特定的硬件功能,Prober与平台交互并动态确定这些功能的可用性。PassManager根据探测结果确定一组最佳对策(即检测通过),并根据用户策略最终确定应用它们的顺序。接下来,PassManager通知Synthesizer有关最终选择的信息。合成器将Wasm二进制文件(由用户通过安全网络通道提供)作为输入,并将其编译为本地二进制文件。在编译期间,Synthesizer通过PassManager提供的最佳通道集来硬化二进制文件。验证器将合成的二进制作为输入,并验证1)每个对策是否正确执行,以及2)执行的对策之间是否存在冲突。Validator还提供了对最终二进制文件进行证明的功能。