​Retbleed:利用返回指令实行任意代码的推测执行

渗透技巧 2年前 (2022) admin
534 0 0


​Retbleed:利用返回指令实行任意代码的推测执行

这篇工作发表在USENIX Security 22上,是关于参照spectre的思想利用推测执行的漏洞实现新型攻击的文章。

攻击步骤

整体的攻击步骤可以简要地分为offline分析和online攻击,在offline分析中

  • 检测kernel中推测性执行的指令指针

  • 筛选可利用的返回指令地址,找到可额外控制寄存器或内存数值的样例

  • 继续筛选可以利用FLUSH+RELOAD获得结果的样例

  • 在目标地址返回前获得分支历史,并进行分析

在online攻击中,

  • 通过反kernel地址随机化获得目标的绝对地址

  • 设置BHB(Branch History Buffer)到可触发返回攻击的状态

  • 利用system call,在返回时触发设置好的BTB,以执行任意代码泄露内核内存

困难与挑战

1. 分支目标的注入与返回

  • BPU(Branch Prediction Unit)是在分支指令预测执行中的一个非常重要的微架构组件,想要实施攻击需要逆向工程来了解该组件的行为。与BPU相关联的是BTB(Branch Target Buffer),BTB是一个以PC作为索引构建而成的、用以预测间接跳转的目标的缓冲区。作者通过在BTB中制造碰撞,如果BTB内的条目超出了容量,它就会驱逐旧的条目,来训练恶意的BTB以达到目的。

    ​Retbleed:利用返回指令实行任意代码的推测执行


  • 此外,作者还需要在返回的时候制造预测错误,这里需要了解另一个微结构组件RSB(Return Stack Buffer)。作者通过控制函数嵌套调用的层数来驱逐RSB中的条目,随着函数嵌套调用的层数增加,当超过RSB的容量之后,预测错误的数量也在线性增长。这里值得注意的是分支预测错误的数量也随着返回预测错误的数量一同增长,作者据此做了更多的实验,表明返回预测也算作其中一种分支预测。这里蕴藏着一个重要的攻击点,如果函数的调用栈过深的话,操纵RSB可以控制相关的攻击。

    ​Retbleed:利用返回指令实行任意代码的推测执行


2. 内核可利用漏洞的探测

  • 在了解了微架构的特性之后,下一步需要寻找的是kernel中可被利用的一些返回指令,并且这些返回指令需要能够被攻击者利用来暂时访问寄存器或者内存。作者设计了如下的框架去检测可能存在的漏洞。首先生成测试样例,通过更改输入来尽可能地加深syscall的调用深度。在此之后生成并分析kernel函数的调用图,这里可以获得系统调用的深度信息和RSB underflow的信息。最后是检测寄存器和内存的相关控制信息,这里作者利用了eBPF来构建了相关的框架。

    ​Retbleed:利用返回指令实行任意代码的推测执行

    ​Retbleed:利用返回指令实行任意代码的推测执行



3. 攻击实现

  • 在有了前面的探索之后,作者在文章这部分讲述了RETBLEED攻击的实现细节,包括使用FLUSH+RELOAD、PRIME+PROBE类型的工具,还有获得分支历史的信息,以及最后如何应对内核的KASLR。

性能评估

  • 在不同的Intel和AMD的架构里,作者对攻击中两个重要的步骤分别进行了测试。一个是RET-BTI,这个是对返回执行BTI(Branch Target Injection);另一个是U → K BTI,这个是从用户模式在内核分支上注入分支目标。可以看到,对于许多架构,即便内核中有相关的defense机制,该攻击也依旧可以实施。

    ​Retbleed:利用返回指令实行任意代码的推测执行



相关名词及缩写

  • Branch Target Buffer (BTB)

  • Branch Prediction Unit (BPU)

  • Spectre Branch Target Injection (BTI)

  • Return Stack Buffer (RSB)

  • Branch History Buffer (BHB)


原文始发于微信公众号(COMPASS Lab):​Retbleed:利用返回指令实行任意代码的推测执行

版权声明:admin 发表于 2022年10月26日 下午10:17。
转载请注明:​Retbleed:利用返回指令实行任意代码的推测执行 | CTF导航

相关文章

暂无评论

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