首页 > 编程知识 正文

电缆分支箱,预分支电缆

时间:2023-05-05 04:39:20 阅读:234364 作者:1220

Jump Over ASLR:Attacking Branch Predictors to Bypass ASLR 摘要

Address space layout randomization(ASLR)是一被广泛采用防止攻击的技术。ASLR技术通过随机化关键程序段偏移,使得攻击者无法获得特定代码目标地址,从而无法重定向控制流到此代码。在本文中,我们开发了一个利用分支目标缓冲器(BTB)的侧信道攻击方法可以突破内核和用户级ASLR。我们的通过观察,攻击者可以创建与受害者的无论是用户级进程之间或内核级的分支指令BTB冲突。这些冲突会影响攻击者代码的时间,从而识别受害者的进程或内核地址空间中已知分支指令的位置。我们证明了我们的攻击可以在大约60毫秒内可靠地恢复内核ASLR进在aswell处理器运行最新版本的Linux平台。最后,我们描述了几种可能的保护机制,无论是在软件方面还是在硬件方面。

本文贡献

总之,本文做出如下贡献:
•我们描述了一种新技术,通过利用通过共享BTB创建的旁路通道来绕过现有的ASLR方案。 我们展示了攻击者如何能够以受控的方式在用户进程和内核之间以及两个用户进程之间创建一个强大的侧通道。
•我们展示了如何创建可靠的BTB侧通道所需的BTB寻址方案的细节可以进行反向设计。
•我们展示了如何使用新的BTB侧通道攻击以快速可靠的方式恢复内核和用户级别的ASLR。 我们使用Haswell CPU和最新的Linux内核在真实系统上实施攻击,并显示内核级ASLR可以在大约60毫秒内恢复。
•我们针对新的攻击提出了一些软件和硬件对策,并将我们的攻击置于相关工作的范围内。

基础知识 KASLR

目前所有的操作系统支持ASLR随机化变种包括用户和内核级的地址空间。内核ASLR(KASLR)在系统启动之时将内核代码和模块段随机化,可以阻止需要内核地址空间布局知识的攻击(包括ROP(return oriented programing)、JOP指定跳转编程(jump oriented programing),返回到libc,ret-2-user 和其他攻击)。

攻击模型 KASLR

攻击者只需拥有普通用户权力,且了解地址空间中哪些位置是随机化的,哪些是固定的,其余没有任何先验知识,且不能暴力攻击,不利用KASLR的的任何脆弱点。

用户级别的ASLR

假设用户知识可以执行正常用户级别的指令,可以探测时间,也可以与受害者交互通过合法的接口。必须强调的是,此攻击者必须可实现与受害者在同一个core上,否则无法实现攻击。

构建BTB侧信道

分支预测器对现代处理器的性能至关重要。
分支预测硬件的主要组成部分之一是分支目标缓冲区(BTB)。 BTB存储最近执行的分支指令的目标地址,以便这些地址可以直接从BTB查找中获得,以获取在下一个周期中从目标开始的指令。
由于BTB由在同一内核上执行的多个应用程序共享,因此可能通过BTB侧通道从一个应用程序泄漏到另一个应用程序。例如,以前的几篇文章展示了使用分支预测器侧通道恢复秘密加密密钥位的可行性[27],[28]。又如,最近的一项研究表明,可以在两个共享分支预测逻辑的恶意应用程序之间创建可靠的高速隐蔽通信通道。
在本文中,我们描述与共享分支预测硬件相关的新安全威胁。具体而言,我们演示了用户级间谍进程如何通过调整代码来有意地在这两个地址空间之间创建BTB冲突,从而获得有关代码块在受害进程或内核的地址空间中的位置的信息。攻击者执行一系列时间测量,每个测试都测试关于特定分支位置的假设。这些实验允许攻击过程发现分支在内核地址空间或另一个进程的地址空间中的精确位置,从而分别绕过内核级ASLR和用户级ASLR。原则上,我们的方法有可能绕过一些最近提出的细粒度ASLR解决方案[31,32,33,34]。我们在本文中攻击ASLR的BTB侧通道基于在属于两个不同执行实体的无条件分支指令之间创建BTB冲突。我们考虑两种类型的冲突:两个用户级进程之间的冲突(攻击用户级ASLR)和用户级与内核之间的冲突(攻击KASLR)。虽然攻击者不需要特定的BTB寻址细节来执行对用户级进程的攻击,但是对内核的攻击需要对BTB寻址方案进行反向工程和理解。

A 创建用户级的BTB冲突

要创建基于BTB的侧信道通道,必须满足三个条件。 首先,一个应用程序必须通过执行分支指令来填写BTB条目。 其次,在同一核心上运行的另一个应用程序的执行时间必须受到BTB状态的影响。 当两个应用程序使用相同的BTB条目时,可能会存储不同的目标,此条件得到满足。 第三,第二个应用程序必须能够通过执行时间测量来检测对其执行的影响。 我们将在同一保护域(例如两个用户级进程)中执行的两个进程之间创建的BTB冲突称为同域冲突(SDC)。 图1显示了一个可以被我们的攻击利用的SDC冲突的例子。

攻击的关键代码包括jump和nop指令,通过rdtscp来获得时间

如果BTB index(Avictim) = BTB index(Aspy) ,那就意味着Aspy与Avictim的虚拟地址相同,因为虚拟地址生成的BTB tag,而我们知道Aspy,从而获得了Avictim的虚拟地址。
设置两个用户进程代码如下,其中加入nop来弥补由于rdtscp导致的时间误差

实验分为两种,一种victim与spy执行相同跳转,另一种,执行相反跳转,结果如下图

我们测试得到跳转指令的执行时间。


图中显示了描述实验阶段的时序图,实际过程如下

强制这两个进程在单个虚拟核心上交替地执行。 首先,间谍进程向受害者进程发送信号1。 为确保间谍继续之前的传送和正确的响应,间谍进程在发送信号后立即调用sleep()功能。 受害者通过执行victim_func()2函数来处理信号。 在此阶段,BTB中的条目将被创建或更新。 短暂休眠后,间谍进程执行spy_func()4并测量执行跳转块的周期数。 在此步骤之后,再次重复测量过程。 当获得足够的测量值时,重复同样的实验,让受害者跳到不同的目标。 我们运行这个实验,在每个设置下生成100,000个测量值。
(不同地址为碰撞攻击,可推测出BTB冲突地址)

结果如下

可看出结果分为两组,两组的平局值相差9cycles,查看intel开发者手册,。在错误的BTB预测之后的前端重新分配器将8个周期的气泡引入指令取出流水线。

结论:这些结果验证了我们的假设,即一个进程执行的BTB访问会影响另一个进程的执行时间。为侧信道构建提供可能。

B:生成跨域的BTB碰撞

如果全虚拟地址用于BTB寻址,那么CDC将不存在,因为内核代码和用户代码位于不同的虚拟地址。 在这种情况下,BTB标签将会不同,并且用户进程永远不会遇到BTB中由内核放置在BTB中的数据的BTB命中。
然而,现代处理器在64位模式下运行时,它们通常使用很长的(当前实现中的48位)虚拟地址[35]。 假设每个BTB条目还需要存储目标地址的绝对值,则如果整个虚拟地址用于标记和索引,则每个BTB条目的总大小会变大。 例如,对于具有8K组的BTB,需要35位标签和48位目标地址,为每个条目增加高达83位的存储空间,这是昂贵且耗电的。 因此,当前的CPU通常只存储一部分高阶地址位作为标记,而BTB寻址会忽略一些高阶位,可能会产生更多冲突,但会显著简化设计和BTB面积和功耗要求。
关于BTB中精确寻址方案的知识对我们在本文中考虑的两种类型的攻击都有重大影响。关于BTB中索引机制的知识对攻击必不可少。
为了了解罪域Haswell系统有意义的bit位,我们做了一些实验与上文中A侧信道攻击类似,只是在跳转到与受害者相同的地址上时,更改跳转地址的部分bit位。最终大仙虚拟地址的0~30为是被BTB使用的,而31~47被忽略掉。关于BTB的索引策略的逆行工程如图4所示.图5展示了内核级别的分支指令如何与用户级别分支指令在BTB生成CDC。

恢复内核代码地址的ASLR的bit位 A linux的KALSR

当KASLR的启用,在系统启动过程中产生部分随机比特序列。这就是用于内核映像被放置在物理内存中的随机偏移量。内核地址的虚拟到物理地址转换保持不变。虚拟地址空间的偏移量与物理地址一样,都是同一个偏移量。所以,无论攻击者发现内核代码位置在物理地址还是虚拟地址,这个内核就完全暴漏地址了。
在linux 64中,只有9bit是随机的,且只有page directory entry是随机的。
图6演示了随机比特以及这些比特如何用于在运行大型2MB页面的x86 64机器上进行页面转换。 该图还显示了可能的内核代码地址范围。

B 利用BTB信道恢复KALSR 的部分bits

为了准备攻击,攻击者需要找到一个分支指令,这个指令的执行很容易被间谍进程触发。 实现此目的的一种方法是分析用户进程可用的系统调用代码,并找到执行分支指令的系统调用。 为了加快攻击速度并尽量减少噪音,首先应考虑使用少量指令的系统调用。收集所有可能的跳转指令地址,对每一个地址执行如下攻击
攻击流程如下图
1.攻击者在指定地址分配buffer
2.它用一个包含单个跳转指令的代码块加载该缓冲区。 加载时可能在BTB中在地址a中创建冲突该代码块还包含一条测量执行跳转指令时间的指令。
3.内核代码段的目标分支指令通过执行指定系统调用执行。
4.间谍程序中的代码块会执行多次,并记录执行它所用的周期数。
5.最终,分析结果。时间更长说明攻击者的跳转指令与内核分支在A地址冲突。

C 恢复KALSR 的部分bits 结果


利用打开拥有过长名字的文件会出发系统调用,结果如图7.A有512种可能,每种可能做了50此实验,结果显示在0Xa9fe8756冲突与xffffa9fe8756,导致时间更长,所以随机地址bit是a9f。

恢复在用户应用代码ALSR 的部分bits




缓解措施

软件
不能从根本上解决,但会提高难度。
如细粒度的随机化。
硬件
设计BTB结构,增大tag的位数,
每个进程单独的标记。
用户与内核使用不同的标记。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。