Translation Leak-aside Buffer

IoT 4个月前 admin
17 0 0

今天分享的是2018年USENIX Security上关于TLB攻击的一篇论文,作者是来自Vrije Universiteit Amsterdam的Ben Gras,Herbert Bos等人。在这篇论文中,作者首次详细分析了现代处理器中TLB的体系结构,包括将虚拟地址映射到TLB Set等复杂功能;基于此,作者设计并实现了一种依赖TLB泄漏信息的新型侧信道攻击——TLBleed,它能够在部署现有防御机制的情况下破坏EdDSA与RSA密钥。同时,作者也考虑了TLBleed对现有攻击和防御的影响,并分析了针对TLBleed的缓解措施。

Introduction

微架构侧信道攻击允许攻击者以可靠和细粒度的方式泄露机密信息,并破坏基本的安全防御(如ASLR),其中最突出的一类侧信道攻击是缓存测信道攻击,攻击者旨在通过共享CPU数据或指令缓存泄露信息。由于受害程序的执行会改变共享CPU缓存的状态,因此攻击者通过观察状态的变化推断出敏感信息(例如,加密密钥)。为了防御此类攻击,提出了各种防御措施来保护共享缓存,包括对它们进行分区以在不受信任的程序之间实现安全共享,或者在执行期间清理缓存中留下的痕迹。虽然还存在其他共享硬件资源,但与缓存侧信道不同,这些资源提供的任何通道往往被认为不可靠,而且过于粗粒度,无法泄露通用信息。在这篇论文中,作者重新审视并推翻了这一假设,发现即使CPU缓存活动受到最先进的缓存侧通道保护(如CAT和TSX)的保护,攻击者仍然可以利用其它共享硬件资源TLB以泄露有关受害者活动的细粒度信息。然而,TLB内部的寻址功能未知,而且攻击者的监控能力有限,只能以页粒度泄漏内存访问,并且不能依赖于指令的执行来泄漏机密信息,这使得利用TLB通道十分困难。为了解决前者,作者对Intel处理器中以前未知的寻址功能进行了逆向工程。为了解决后者,作者设计了一种机器学习策略,利用受害者内存访问的时间模式来泄漏信息。

Background & Motivation

Attack:由于缓存set由多个进程共享,因此攻击者可以通过共享缓存set中的变化实现细粒度、安全敏感的缓存侧信道攻击。例如,如果攻击者首先占用缓存set中的所有n条路径,并且在一段时间后观察到其中一些已不在缓存中(因为访问数据现在需要更长的时间),这表明另一个程序访问了映射到该缓存set中的地址上的数据。当前主要的缓存侧信道包括:① PRIME+PROBE 攻击:利用了缓存行共享的特性。攻击者首先通过读取某个内存区域,将该区域的数据加载到缓存中(PRIME)。然后,攻击者等待一段时间,使得该缓存行被驱逐出缓存。最后,攻击者访问同一内存区域,观察访问时间,通过访问时间的差异可以推断出该内存区域的数据是否在缓存中(PROBE);② FLUSH+RELOAD 攻击: 通过使共享缓存行无效(FLUSH),然后观察访问该缓存行的时间(RELOAD)来推断内存访问。攻击者首先使某个内存区域的缓存行失效,然后等待一段时间,最后访问相同的内存区域。如果该缓存行在这段时间内被其他进程加载,那么访问时间将较短,否则将较长。③ EVICT+TIME 攻击:利用了缓存替换的机制。攻击者首先通过某种方式将特定的缓存行从缓存中驱逐(EVICT),然后测量访问某个内存区域的时间(TIME)。通过观察访问时间的差异,攻击者可以推断出特定的内存区域是否被访问。

Defense:① Isolation by partitioning sets:不共享缓存的两个进程不能窥探彼此的缓存活动。为敏感操作分配自己的缓存set,而不让任何其他程序共享该部分。② Isolation by partitioning ways:与按set对缓存进行分区类似,也可以按ways对缓存进行分区。程序可以完全访问缓存set,但是每个缓存set有更少的way,并且与其他程序不重叠。这种方法需要硬件支持,如英特尔的缓存分配技术(CAT)。由于现代架构严格限制了方法和安全域的数量,CATalyst的设计仅使用两个域,并禁止访问安全域以防止安全内存页面被删除。③ Enforcing data cache quiescence:防止缓存攻击的另一种策略是在允许共享且不会导致缓存分区性能下降的同时,确保在执行敏感函数时数据缓存处于静止状态。这可以防止并发侧通道攻击,包括prime +PROBE和FLUSH+RELOAD,因为这些攻击依赖于数据缓存的清除来分析缓存活动。这种方法可以通过英特尔事务同步扩展(TSX)功能来辅助,因为TSX事务在并发数据缓存清除发生时终止。

现有的缓存侧信道攻击和防御都侧重于利用和强化共享CPU缓存,但忽略了内存管理单元(MMU)使用的缓存机制。在虚拟内存系统中,MMU起着至关重要的作用。CPU内核主要发出指令,使用它们的虚拟地址(VAs)访问数据。MMU通过页表将这些VAs转换为物理地址(PAs)。出于性能方面的考虑,这些转换结果被缓存在TLB中。与数据缓存体系结构类似,TLB具有多个层次结构,每一层的TLB通常被划分为set和way。由于现有防御未考虑TLB,因此一旦互不信任的程序之间共享TLB,攻击者就可以发起侧信道攻击。

Threat Model

① 攻击者能够在受害系统上执行非特权代码。

②攻击者能够监控与受害程序共享的TLB状态。

Attack Overview

如图1所示,即使部署了缓存侧信道防御将缓存进行分区以实现隔离,攻击者仍然可以发起TLBleed,通过共享TLB泄露信息。但是实际场景中发起TLBleed面临一些挑战:

Translation Leak-aside Buffer

图1.TLBleed通过TLB进行侧信道攻击

① 当前对TLB架构的了解十分有限,而发起TLBleed需要对TLB架构有详细的了解。具体而言,需要知道:如何监控TLB set?虚拟地址如何映射到现代处理器中的多级tlb ?超线程之间如何共享TLB set来实现代码和数据地址的转换?

② 即使攻击者知道如何访问与受害者相同的TLB set,如何通过非特权进程可靠地监视TLB活动?

③即使攻击者能够可靠地测量受害者的TLB活动,它是否可以利用这个新通道发起有意义的攻击? ASLR之类的防御机制是否会使攻击更加复杂?

针对第一个问题,作者对VA到TLB中不同set的映射进行逆向工程以了解TLB的实现细节。具体而言,作者使用Intel性能计数器(PMC)来收集关于每个TLB级别/类型的TLB失误的细粒度信息,即依靠Linux perf事件框架来监视与TLB操作相关的性能事件,即dtlb_load_misses.stlb_hitdtlb_load_misses.miss_causes_a_walk。根据体系结构属性创建不同的访问模式,并使用PMC来了解如何在给定的微体系结构上实现这些属性。为了对哈希函数和线性映射tlb的大小进行逆向工程,作者首先将一大组测试页面映射到内存中,接着执行测试迭代来探索两个参数的所有合理组合:set的数量s和way的数量w。每次迭代中,在一个循环中访问测试页面,并计算由PMC计数器证明的驱逐次数。至少需要w + 1个页面才能清除之前页面,类似地,对应的最小s是正确的set数量。

TLB缓存的核心属性之一是Inclusive。如果TLB缓存是Inclusive,则较低级别是较高级别的子集。如果是Non-inclusive,则缓存项最多在其中一层中。为了了解这一性质,作者首先创建针对特定的 L1 TLB(如iTLB或dTLB)工作集 S1,该工作集一开始占用 L1 TLB 的一部分,然后扩展到 L2 TLB,直到填满 L2 TLB 。接着针对另一个 L1 TLB创建一个大小固定的工作集 S2,以观察对于这个工作集的 TLB 访问。接着访问工作集 S1+S2。逐渐增加 S1 的大小,但不增加 S2。观察是否看到 L1 的任一类型TLB与L2 TLB缺失。如果缓存是Inclusive,L2 驱逐中的会导致相反类型的 L1 驱逐。

为了验证逆向的TLB分区并确定超线程如何暴露给彼此的活动,作者对每个TLB级别/类型进行实验:收集一个完全填满TLB集的驱逐集;对于每一对驱逐集,在一个超线程上访问一个set,在同一核心上运行的另一个超线程上访问另一个set;测量观察到的驱,以确定一个给定的set是否干扰另一个set。结果表明L1 iTLB与L2TLB是“竞争性共享资源”。

针对第二个问题,虽然PMC可以方便地用于对TLB的属性进行反向工程,但无特权攻击者无法访问它们。为此作者通过timing memory accesses来区分TLB缺失和TLB命中从而监视受害者的TLB活动。具体而言,作者针对不同层次的 TLB创建了三个不同大小的工作集。第一个工作集完全留在 L1 数据 TLB 内,第二个工作集部分未命中 L1 数据 TLB 但仍在 L2 内,第三个工作集大于 L2,因此会强制进行页表遍历;为了避免来自 CPU 数据缓存的干扰,驱逐集中的虚拟地址都被映射到相同的物理页面,确保它们共享相同的内存位置。访问这些驱逐集,如果 TLB 或缓存的性能对于不同类型的访问有明显的差异,那么通过观察延迟(访问时间)就能看到这种分离。图2展示了TLB命中或未命中的内存访问延迟,结果表明可以使用非特权指令来分析TLB活动(由于映射的物理页总是相同的,总是在缓存中,所以内存访问的延迟完全取决于TLB延迟)。

Translation Leak-aside Buffer

图2.TLB命中或未命中的内存访问延迟

针对第三个问题,需要区分在不同时间访问目标TLB set的不同函数的执行。为此,作者训练了一个分类器,它可以区分受害者正在执行哪个函数,作为观察到的TLB延迟的函数。同时发现由于通道的高分辨率,简单的分类和特征提取策略足以以高精度泄漏目标函数的时间轨迹。对于libgcryp目标,只需要使用一个TLB set进行训练和测试。为了训练分类器,假设这些信息是已知的。然而,在实际攻击中,由于ASLR,攻击者无法事先知道目标TLB设置。本文假设在目标程序执行期间,每个TLB set的行为是不同的。因此,可以使用SVM分类器来解决s类分类问题,其中每个类代表特定TLB set的信号。基于此,作者进一步实验分析了使用简单的分类和特征提取策略发起攻击以及在ASLR中识别受害者TLB set的可行性。

Conclusion

当前侧信道攻击仅限于 CPU 数据和指令缓存,忽略了其他共享资源。在这篇论文中,作者提出了一种基于TLB的新型侧信道攻击——TLBleed,它能够绕过当前所有的缓存侧信道防御,这表明全面的侧信道保护机制应该考虑所有共享资源

原文始发于微信公众号(COMPASS Lab):Translation Leak-aside Buffer

版权声明:admin 发表于 2024年1月2日 下午2:37。
转载请注明:Translation Leak-aside Buffer | CTF导航

相关文章

暂无评论

您必须登录才能参与评论!
立即登录
暂无评论...