目录
- 摘要
- 引言
- 贡献
- 新的基于ORAM的防御控制信道攻击
- 优化技术
- 开源实现
- 背景
- Intel SGX
- ORAM
- Ring ORAM的组成
- ORAM树
- Position Map (位置图)
- Stash
- Ring ORAM的访问步骤
- 1、Position Map Lookup 位置映射查找
- 2、ReadPath
- 3、EvictPath
- 4、Early Reshuffles 早期的重新洗牌
- 相关工作和动机
- SGX的侧信道攻击
- 基于页面的攻击(页级别的粗粒度数据)
- 基于缓存的攻击(缓存级别的细粒度数据)
- 基于分支预测的攻击(指令级别的细粒度数据)
- 观察
- 已有的防御
- 观察
- 设计
- 威胁模型
- 概述
标题:Klotski: Efficient Obfuscated Execution against Controlled-Channel Attacks
作者:Pan Zhang,Chengyu Song,Heng Yin,Deqing Zou,Elaine Shi and Hai Jin
发布: ASPLOS【计算机体系结构顶会】
时间: 2020
摘要
Intel Software Guard eXtensions(SGX)为安全敏感计算提供了一个基于硬件的可信执行环境。在可信域(飞地)内运行的程序受到保护,免受其他软件的直接攻击,包括操作系统(OS)、系统管理程序和低级固件等特权软件。
然而,最近的研究表明,SGX容易受到一组侧信道攻击,这些攻击允许攻击者破坏飞地执行的机密性,例如受控信道攻击。
不幸的是,现有的防御要么提供了不完整的保护,要么带来了太多的性能开销。
在这项工作中,我们提出了Klotski,这是一种有效的模糊执行技术,通过在安全性和性能之间进行可调的权衡来击败受控通道攻击。从高层来看,Klotski模拟了一个安全的内存子系统。它利用增强的ORAM协议将代码和数据加载到两个具有可配置大小的软件缓存中,并在可配置的间隔后重新随机化。更重要的是,Klotski采用多种优化来减少由基于软件的地址转换和软件缓存替换引起的性能开销。评估结果表明,Klotski对受控信道攻击是安全的,其性能开销远低于以前的解决方案。
引言
可信执行环境(TEE)旨在保护应用程序执行的机密性和完整性,使其免受不受应用程序开发人员物理控制的潜在敌对平台(如公共云)上的各种安全威胁。此类威胁包括恶意软件、恶意或受损的操作系统(OS)、流氓云管理员等。软件[16,24,32]和硬件[4,21,33]都可以提供TEE。在这些解决方案中,Intel Software Guard eXtensions(SGX)[33]因其在商品Intel CPU中的可用性(自Skylake微体系结构以来)和强大的基于硬件的安全保证而成为最有前途的解决方案。具体来说,在SGX保护的TEE(也称为飞地)内运行的应用程序只需要信任处理器,这是一个比基于软件的解决方案小得多的受信任计算基础(TCB)。与此同时,英特尔也做出了重大努力,正式验证SGX的硬件规范及其加密操作的实现[26]。由于这些原因,各种基于SGX的应用程序开发,包括数据分析[34,40]、机器学习[36]、Tor[29]、容器[6]和库操作系统,以支持遗留应用[7,46,52]。
不幸的是,SGX也有弱点。特别是,侧通道攻击超出了其设计的威胁模型,研究人员已经证明了针对在飞地内运行的应用程序的几种类型的侧通道攻击的可行性,包括基于页面故障的攻击(也称为控制通道攻击)[45,56]、基于缓存的攻击[9,19,23,42,54]、基于分支预测的攻击[30],和瞬态攻击[10,14,31,41]。在这些攻击中,我们认为受控信道攻击是最关键的,因为大多数其他细粒度攻击[10,14,23,30,31,41,53,54](除了Meltdown[31])成本更高。因此,对手通常依靠受控信道攻击来精确定位感兴趣的功能,并且仅在执行目标功能时才发起细粒度攻击。
受控通道攻击是可能的,因为(1)攻击者可以观察内存访问模式[51],(2)应用程序的内存访问模式依赖于输入。因此,可以通过解决其中任何一个根本原因来击败受控信道攻击。
用户空间页面故障检测方法[44,45]旨在防止攻击者通过故意注入的页面故障获取页面访问模式。不幸的是,它们对不依赖于页面故障的受控信道攻击无效(例如,基于访问位的攻击[54])。
SGX Shield[43]试图通过内存布局随机化来混淆内存访问。但由于它在加载时只随机化一次,因此可以通过在线评测【应该是分支预测攻击】来击败它[30]【[30]是branch shadowing】。
Oblivious execution(疏忽执行技术)[2,3,37,39,45]对在线评测是安全的,但会带来更高的性能开销。例如,deterministic multiplexing(确定性复用)[45]的运行时性能开销超过4000倍,多程序路径执行[37]的开销为9倍,OBFSCURO[2]的开销为简单基准测试的51倍。
在这项工作中,我们的目标是通过在安全保证和性能开销之间进行可调的权衡来击败受控信道攻击。在高层次上,我们提出的系统Klotski充当内存子系统。它由两个软件缓存(一个执行vCache和一个数据vCache)、一个软件内存管理单元(sMMU)和一个虚拟主内存组成。与物理CPU类似,所有执行的指令都是从执行vCache中提取的,所有数据都是从数据vCache中读取/写入的。sMMU将我们称之为逻辑地址的编译时虚拟地址转换为运行时虚拟地址(即硬件MMU的线性地址)。该机制允许我们将内存块加载到vCache的任何插槽中。为了在执行过程中混淆内存访问模式,sMMU使用Ring ORAM协议[38]来访问主内存。此外,由于“客户端”ORAM操作,包括对元数据的访问(例如,隐藏和位置图)也容易受到侧通道攻击,Klotski使用额外的保护措施,以确保在我们的威胁模型下,所有此类行动都不会被遗忘。最后,通过随机替换策略和强制刷新对vCache进行重新随机化。
虽然上面的设计是安全的,并且类似于以前的工作[2,3,39],但简单的实现会带来非常高的性能开销。Klotski的另一个重要贡献是几种优化技术。首先,Klotski通过缓存结果来减少地址转换的次数。类似于硬件转换后备缓冲区(TLB),Klotski利用程序局部性来避免冗余的地址转换。其次,Klotskii改进了程序的局部性,以减少缓存替换的数量,包括对齐循环以避免交叉缓存块循环体,以及将常量重新定位到同一代码块。最后,Klotski通过可配置的参数提供了性能和安全性之间的可调权衡。在spectrum的一端,当开发人员选择较小的vCache大小(例如,4KB)时,Klotski可以保证不经意的执行,代价是更高的性能开销(大约10倍)。另一方面,开发人员可以选择使用更大的vCache大小(例如,足够工作集使用)来减少性能开销,代价是降低安全保证。然而,在实践中,随着vCache的重新随机化,对于大多数应用程序来说,即使是减少的安全保证也是合理的(见§6)。
我们已经基于Intel SDK for Linux、LLVM工具链和musl-libc实现了Klotski。我们的实验评估表明:
(1)Klotski对飞地程序的已知受控信道推断攻击是有效的,
(2)Klotsky与飞地程序具有良好的兼容性,
(3)在提供合理的安全保证的同时,Klotski在实际程序上施加的性能开销可以降低到1.3倍。
贡献
新的基于ORAM的防御控制信道攻击
我们设计并实现了一种新的模糊执行技术,以保护飞地程序免受受控通道攻击。我们的安全评估表明,我们的设计能够防止我们的威胁模型下的所有攻击
优化技术
我们开发了几种优化技术来减少开销。评估还表明,我们的优化技术非常有效,可以将性能提高6.7倍。对于实际应用,Klotski的性能也是可以接受的,只有2.3倍,在安全性方面有很好的平衡。
开源实现
我们实现了一个端到端的工具链,支持各种飞地程序。源代码和文档将在接受此工作后向公众开放(https://github.com/nczhang88pan/KlotskiSGX.git)。
背景
Intel SGX
SGX提供两种安全保障:机密性和完整性。
首先,它防止属于飞地的代码和数据在飞地之外被访问,包括特权软件,如操作系统和系统管理程序。
其次,它使用内存加密[22]来防止诸如窥探和冷启动之类的内存攻击。
它还维护飞地内存的完整性措施,以防止恶意篡改和重放攻击。当飞地内发生硬件异常/中断时,处理器在调用系统软件的异常处理程序之前生成异步飞地退出(AEX)。SGX首先将飞地的执行状态保存到状态保存区(SSA),并将所有寄存器重置为预定义值,以避免泄露机密。例如,当发生页面故障时,SGX将清除故障地址的最低12位。然后将控制权转移到异常处理程序。最后,在完成该过程之后,处理程序恢复飞地程序。
ORAM
Oblivious RAM (ORAM) [18] 提供了一个正式和通用的模型,以防止对手从其内存访问模式中学习有关程序输入的任何信息。也就是说,给定两个输入 i i i 和 i ′ i' i′,它们的内存访问轨迹在计算上无法区分。ORAM通过添加噪声、随机排列和重新洗牌来混淆内存访问模式来实现这一目标。构建ORAM的方法有很多。一个简单但极其低效的构造是,对于每个内存访问,访问整个内存。因此,已经提出了几种不同的ORAM方案[38,49,50,55]来提高ORAM的效率。在本小节中,我们专注于解释 Klotski 中使用的 Ring ORAM [38]。Ring ORAM是Path ORAM[50]的优化。它由三个组件组成:
Ring ORAM的组成
ORAM树
不受信任的服务器中一个完整的二叉树来存储加密的内存块。该树的深度是典型的 O ( l o g N ) O(log N ) O(logN),其中 N N N 是真实内存块的数量。该树的每个节点,也称为桶,具有固定数量的插槽来保存块( Z Z Z + S S S,最多 Z Z Z 个插槽可能包含真实块,并且至少 S S S 个插槽填充虚拟块),以及包含基本信息的小型元数据。由于所有真实块和虚拟块都是加密的,因此攻击者无法区分它们。
Position Map (位置图)
由可信客户端保留的查找表,用于记录ORAM树中的哪个路径是一个实块映射。
Stash
可信客户端中的缓冲区,存储尚未驱逐到ORAM树的块。一个块要么在ORAM树中,要么在stash中。
Ring ORAM的访问步骤
1、Position Map Lookup 位置映射查找
ORAM查找位置映射,以学习目标块 b b b当前所在的路径 l l l,并将新路径 l ′ l ' l′分配给块。
2、ReadPath
ORAM沿路径 l l l读取所有桶,并将 b b b存储到stash中。与之前的基于树的方案不同,路径上的每个桶只读取一个块。除了 b b b所在的桶外,还读取一个随机的虚拟块。
3、EvictPath
为了保持垃圾占用率较低,在每个ReadPath访问之后,EvictPath从每个桶中选择一个路径,从每个桶读取 Z Z Z块(所有剩余的真实块和潜在虚拟块),然后用反向字典顺序[38]中的块填充路径。
4、Early Reshuffles 早期的重新洗牌
为了避免桶在 EvictPath 重新洗牌桶之前读取 > S > S >S 次。对于每个 ReadPath 操作,EarlyReshuffle 在访问超过 S S S 次的桶上执行。与 EvictPath 类似,EarlyReshuffle 读取 Zblock 并写回 Z Z Z + S S S 置换块。
相关工作和动机
SGX的侧信道攻击
表1从各个方面对SGX的现有侧通道攻击进行了总结和比较。
基于页面的攻击(页级别的粗粒度数据)
Xu等人[56]首先演示了恶意操作系统可以通过观察程序在页面粒度上的内存访问来提取程序的秘密。在这种攻击中,他们使用页面错误作为无噪声控制通道。为了减少频繁页面错误引入的非凡开销,他们使用了多组页面错误序列来识别感兴趣的函数的开始和结束,并且只对这些函数执行繁重的页面故障跟踪。即使使用这种优化,他们的攻击也会导致 209.6 倍到 354.9 倍的开销。
J.Bulck等人[12]然后提出了一种基于页面表的攻击,生成更少的页面错误。他们精心挑选了一些触发页面,并使用页表条目中的 A(cessed)/D(irty) 标志收集了两个连续访问触发页面之间的访问页面集。使用这种方法,只有当访问触发页面时,受害者飞地才会中断。
TLBleed [20] 测量了 dTLB 延迟,以收集数据页面的页面粒度信号。这种攻击在单个签名操作期间收集 TLB 中的活动 2 毫秒。
【下面这两类不是本文能解决的攻击,所以没有详细讨论】
基于缓存的攻击(缓存级别的细粒度数据)
基于页面表的攻击面临时间和空间分辨率的基本限制,攻击者无法在单个 4KB 页面中观察到内存访问。因此提出了更细粒度的侧通道攻击。基于缓存的攻击[9、19、23、35、48]表明,仍然可以利用Prime+Probe来观察飞地的缓存行级内存访问。
基于分支预测的攻击(指令级别的细粒度数据)
分支阴影[30]利用了分支预测延迟,收集精确的控制流信息。
与传统的侧通道攻击类似,这些攻击的关键挑战是由探测阶段其他不感兴趣的访问引起的噪声。上述大多数攻击通过利用 x86 本地 APIC 计时器来尽可能频繁触发中断以近似单个步进 [11] 来缓解这个问题,因此恶意操作系统可以在访问感兴趣的内存以减少污染之前和之后立即分解为 SGX 应用程序。然而,这也使得这些攻击速度非常慢。即使在使用页面级侧通道来识别感兴趣的目标函数之后,Hähnel 等人。 [23] 在观察单个阵列的查找时报告了 3532× 减速。
最后,Foreshadow[10]演示了一种新的瞬态执行攻击,即使在其中没有任何合作的情况下,也可以转储受害飞地的整个内容。
观察
大多数SGX侧通道攻击依赖于频繁的AEX暂停飞地的执行以减少噪声,这也增加了程序的整体执行时间。在细粒度的侧通道攻击中,这个问题变得更加严重。为了使它们实用,攻击者在利用粗粒度侧通道查明感兴趣的函数后只发起细粒度的攻击。因此,我们可以通过防止粗粒度的侧通道来阻碍这些细粒度的攻击。
已有的防御
T-SGX[44]使用Intel事务同步扩展(TSX)来限制飞地AEX的生成,而关键代码正在执行。Chen等人[15]还利用TSX实现了一个基于执行的参考时钟来检测关键执行的中断。基于 TSX 的解决方案的问题是一些攻击 [9, 19, 20, 54] 在不触发 AEX 的情况下获取访问模式。
SGX-Shield [43] 在 enclave 程序的加载时间引入了代码块级随机化。然而,恶意操作系统仍然可以通过观察飞地[30]【分支预测】输入上的内存访问模式来推断飞地的内存布局。
Zigzagger[30]将一组分支指令混淆为单个间接分支,以防止基于分支的侧通道攻击,但它只保护代码执行,已经被一些细粒度的攻击所击败[11,53]。
ENCLANG [47] 混淆了不调用其他函数的叶子函数。
DR.SGX[8]在飞地执行期间以缓存行的粒度连续重新随机化所有飞地数据。但它只关注数据访问,不混淆代码执行。
Shinde等人[45]引入了一种不经意的执行方法,称为确定性多路复用,它将敏感代码和数据放在一个页面上,以隐藏页面访问模式。他们的方案带来了非常高的性能开销(超过4000×),
需要手动优化。OBLIVIATE[3]、ZeroTrace[39]和OBFSCURO[2]使用ORAM协议来混淆内存访问。ZeroTrace 只考虑数据遗忘。OBLIVIATE 为 enclave 提供了一个模糊文件系统,但不根除受控通道来执行。OBFSCURO混淆了代码和数据的访问。虽然它为缓存和时序侧通道提供了强大的保护,但它只能支持小代码和数据大小的程序(8KB);因此,对于实际程序来说是不切实际的。此外,其性能开销显着更高:在其定制的小基准上为 55 倍。
InvisiPage[1]提出了一种新的硬件设计,类似于Klotski,其中Enclave内的程序可以填充自己的页表,其页访问模式由ORAM协议保护。虽然硬件实现可以提供更好的性能,但Klotski可以应用于现有的硬件,所有Klotski的编译时间优化也适用于InvisiPage。
观察
现有的防御有三个局限性:(1)对粗粒度侧通道攻击的不完全保护,(2)代码和数据的不完全保护,或(3)高性能开销。Klotski旨在通过为代码和数据提供子页面级运行时随机化方案来解决这些限制。该方案打破了程序地址和内容的固定关系。此外,Klotski使用基于ORAM的混洗方法来防止运行时重新随机化期间可能的信息泄漏。因此,Klotski 可以防止攻击者通过粗粒度侧通道攻击定位感兴趣的代码/数据的访问。虽然Klotski不能直接减轻细粒度的侧通道攻击,它迫使攻击者随时监控代码/数据访问,这将使攻击非常缓慢和不切实际。
设计
威胁模型
我们假设与之前的受控通道工作相同的威胁模型[44,45,56]。
首先,除了飞地本身之外,软件堆栈中的所有其他组件都不可信,因此对对手可以看到页面访问模式。
其次,我们假设攻击者知道目标程序的代码,包括其源代码和二进制代码;因此攻击者可以对程序执行任何自动或手动分析以提取必要的信息。
此外,我们假设攻击者可以向目标程序输入攻击者控制的输入,以便执行在线训练来学习内存访问模式。
最后,由于我们的重点是防止侧通道攻击,我们认为任何利用目标程序中软件漏洞(例如缓冲区溢出)的攻击超出了范围。减轻这些漏洞的任何防御都是我们工作的补充。
虽然我们的解决方案利用ORAM来减轻侧通道攻击,但我们的威胁模型更强。
现有的ORAM解决方案假设一个客户机-服务器模型。在这个模型中,服务器是不可信的,但客户端是可信的。这意味着所有客户端操作都不受侧通道攻击的影响。相比之下,在我们的场景中,所有组件都在同一个飞地内运行,因此受到侧通道攻击的影响。
概述
在这项工作中,我们使用基于运行时重新随机化的混淆方法来减轻侧通道攻击。图 1 说明了 Klotski 的概述,其中包括两个主要组件:编译器扩展和**基于 ORAM 的runtime **。
编译器扩展执行两个转换。
首先,它检测所有内存访问指令,包括飞地程序的控制转移(代码访问)指令来遍历运行时。
其次,它将程序的代码和数据划分为可以重新定位到任何虚拟地址的小块。
Runtime充当内存子系统,它使用增强的 Ring ORM 协议 [38] 混淆内存访问。
为了加速执行,运行时还由两个可配置大小的内存缓冲区组成,这些缓冲区用作代码缓存和数据缓存。
请注意,为了避免 Klotski 的软件缓存和架构/硬件缓存之间的混淆,我们将使用 vCache 来表示 Klotski 的缓存。使用ORAM协议将代码和数据块提取到vCache中。vCache 重新随机化是通过自然替换(使用随机替换策略)或强制刷新来完成的。