代码之家  ›  专栏  ›  技术社区  ›  mevets

分支预测和推测获取缓解

  •  1
  • mevets  · 技术社区  · 6 年前

    为什么虚拟地址(VA)分离不足以缓解各种幽灵和熔化缺陷?我指的是通用的,不包括攻击Intel P-cache==V-cache的黑客;这显然是个坏主意,我找不到任何同情心。

    作为基线:

    1. 我的内核地址空间(as)只与用户as共享一个文本和数据页。这些页面只包含足够的代码和数据来保存和存储寄存器;加载新的内存上下文,并跳转到适当的位置。因此,这里没有有趣的地址。

    2. 高管的流程助理没有任何共同的VAS。也就是说,每个VA分配都是从一个公共池中获取的,因此即使是像libc这样的共享对象,在每个进程中也处于不同的地址。大多数从Unix派生的人都会觉得这很奇怪,但这肯定是可行的;我曾经错误地做过一次^h*10/用于测试。

    3. fork()_d进程如果图像位于单独的访问控制域中,则会对其进行沙盒处理,以防止交叉泄漏。沙盒可能涉及上下文切换缓存收回、排除超线程的CPU集,一直到 不干涉 内核。

    我理解[1]是解决与熔解有关的问题的基本方法;[2]是[1]的扩展,因此它适用于幽灵。[3]会导致性能问题,但同样,仅限于这些情况。

    1 回复  |  直到 6 年前
        1
  •  3
  •   Peter Cordes    6 年前

    崩溃攻击依赖于(推测性地)直接访问目标虚拟地址(从攻击过程中) .

    但幽灵不是。 你是最好的 支路预测器 因此,受攻击的代码会推测性地访问自己的虚拟地址空间,而这是它有权做的。 分支预测器别名意味着您通常/有时可以在无法/未映射的虚拟地址为分支预先进行预测。(例如,在内核中。)

    通常的侧通道是缓存读取攻击,它基于在您自己的地址空间中逐出阵列的缓存。但是,其他的通道可以将幽灵数据从目标返回给攻击者,比如启动缓存,然后寻找哪个条目被冲突丢失的地址所驱逐 别名 一些内存在被攻击的进程中。(更难,因为现代x86 CPU中的L3缓存使用复杂的索引函数,而不像简单的缓存使用简单的位范围作为索引。但可能您可以使用L2或L1D未命中。 二级未命中/三级命中应仍然比二级命中长。

    或者使用SMT(例如,超线程),一种ALU定时攻击,在这种攻击中,Spectre小工具创建与数据相关的ALU端口压力。在这种情况下,唯一相关的内存访问是受攻击的数据(这是硬件允许的,只有对分支的错误推测才会导致回滚,而不是加载错误)。


    当攻击内核时,它将把攻击进程的物理内存页映射到某个地方。 . (大多数内核将所有物理内存映射到一个连续的虚拟地址范围,允许轻松访问任何物理地址。) 缓存基于物理地址,而不是虚拟地址。

    通过同一页面的不同映射使缓存线变热的幽灵小工具仍然有效。

    在系统调用的上下文中,内核通常将用户空间内存映射到进程内使用的相同虚拟地址。 ,所以系统调用如下 read write 可以在用户空间和页面缓存之间复制。许多系统调用将用户空间指针传递给文件名。因此,当攻击内核时,幽灵小工具可以在攻击过程中直接使用用户空间地址。

    Spectre小工具本身甚至可能在用户空间内存中,尽管使用单独的页表可以解决崩溃问题,但是通过将内核页表设置为在没有exec权限的情况下映射用户空间vas,可以减轻这种情况。


    脚注1:meltdown是对页表中的u/s位的绕过,允许用户空间潜在地读取内核所映射的任何内存。是的,[1]是一个足够的解决方法。见 http://blog.stuffedcow.net/2018/05/meltdown-microarchitecture/ .