A Systematic Evaluation of Transient Execution Attacks and Defenses (对暂态执行的攻击和防御的系统评估)(前四节)

A Systematic Evaluation of Transient Execution Attacks and Defenses (对暂态执行的攻击和防御的系统评估)(前四节)

  1. 摘要:

    • 异常或者分支错误预测事件可能会在CPU的微体系状态中留下依赖于私有数据的足迹。通过这种观察,导致了新幽灵和熔断攻击变种的扩散。
    • 业界和学术界的问题在于:虽然在寻找有效的防御上,但是这些防御主要是针对于一种特定的变体/开发方法
    • 论文提出了一种可靠的,可扩展的针对暂态执行的攻击系统。同时论文系统化的给出了7种新的攻击手段,包括两种新的熔断变种和五个新的幽灵的错误引导策略。
    • 论文在三个主流处理器类型上概念验证实现了7种攻击。论文提供的系统化不仅提供了攻击表面的全貌,而且可以对防御系统进行评估
  2. 介绍:

    • 暂态执行(transient execution):指令开始时会执行,但是之后就会被取消,所有体系结构状态都不会受影响,这样的执行称为暂态执行
    • 暂态执行虽然不会影响体系结构状态,但是微架构影响却被保存了下来。Spectre, Meltdown, Foreshadow利用暂态执行,并在微体系结构的副作用(例如,缓存状态)中编码秘密,以便将其(传递到体系结构级别)传递给攻击者
    • 许多防御措施只关注了如何阻断特定的隐蔽信道攻击,而忽略了解决泄露的微架构根源
    • 论文提出了一个可靠的,可扩展的利用暂态执行进行攻击的系统结构,包括了之前的幽灵,熔断和foreshadow,以及一些其它的攻击方式
    • 论文提供了一个通用的决策树,能够将已知的暂态执行攻击准确的分类,并且给出明确的名称
    • 论文还提供了防御系统,并且通过实际实验和理论论证系统的评估了该系统
      A Systematic Evaluation of Transient Execution Attacks and Defenses (对暂态执行的攻击和防御的系统评估)(前四节)_第1张图片

    ​ 红色加重的是已经证明的攻击,绿色虚线的是效果不好的攻击,带星号的是论文第一次提出和实验的

  3. 暂态执行(transient Execution)

    • 暂态指令:指令虽然绝对不会提交,并且更改体系结构状态,但是CPU仍然会去执行

    • 暂态执行攻击:暂态指令虽然不会更改体系结构状态,但是更改微体系结构状态,通过将微体系结构状态转换为体系结构状态来提取敏感信息

    • Cache的隐蔽信道:Flush+Reload。通过观察数据访问时间的差异,得到cache内的信息。

      • 隐蔽信道是侧信道攻击的一种特殊用力,攻击者可以控制发送方和接收方。从而允许攻击者绕过架构级别的限制来泄露信息
      • cache攻击发送器的示例代码:tmp = array[secret_byte*4096]
    • Spertre和Meltdown的差异

      • 两者从根本上利用了CPU的不同特性。CPU很容易被Spertre攻击,而不是Meltdown
      • 两者唯一共同的特征:利用了暂态执行所带来的副作用
      • Spectre幽灵:暂态指令只处理应用程序可以在体系结构层面可以访问的数据,如果分支条件不同,也可以在程序的正常控制流中执行暂态指令
      • Meltdown熔断:暂态指令处理的是应用程序在体系结构层面无法访问的数据,在正常的控制流中,应用程序永远无法访问该数据(异常之后的指令永远是不会执行的)。熔断利用的是异常之后的暂态指令能够访问故障指令数据的特性
      • 体系结构层面可访问和不可访问并不是指代的用户空间访问内核空间的概念。此时的不可访问是说正常执行过程中,该数据不会存在于体系结构状态中,例如发生异常的指令产生的数据在体系结构层面是不可见,不可访问的。
      • 熔断虽然利用了乱序执行的能力,但是在按序流水线中也可能会出现这个问题
        A Systematic Evaluation of Transient Execution Attacks and Defenses (对暂态执行的攻击和防御的系统评估)(前四节)_第2张图片

      左图是幽灵的实际过程。通过分支预测,在错误路径上的指令为暂态指令,进行暂态执行,访问体系结构可访问的数据。右图为熔断的实际过程。当异常发生之后,异常的处理被推后到了提交阶段,在这个期间,之后的指令为暂态执行,可以访问到异常指令产生的数据,但是这些数据是体系结构不可访问的

  4. Spectre幽灵

    • 利用分支预测或者数据相关推测之后的暂态执行进行攻击。主要基于两个部分:利用的分支预测器机制;错误训练机制。

    • Intel支持的分支预测机制:BHB,BTB,PHT,RAS。这些结构在物理核上一般不共享,但是在逻辑核上会共享使用。相应的攻击包括

      • spectre-PHT
      • spectre-BTB
      • spectre-STL:利用CPU的存储相关性预测,(store到load的前递)
      • spectre-RSB
    • 引导错误训练分支的四种方式:

      • same address space+in place:在同一个地址空间,使用同一条分支训练分支预测器中的同一个表项

      • same address space+out of place:在同一个地址空间,使用不同的分支训练分支预测器的同一个表项(该分支和目标分支会映射到同一个预测器表项)

      • cross address space+in place:在另一个地址空间,使用具有相同地址的分支训练分支预测器

      • cross address space +out of place:在另一个地址空间,使用会映射到同一个预测器表项的分支训练分支预测器
        A Systematic Evaluation of Transient Execution Attacks and Defenses (对暂态执行的攻击和防御的系统评估)(前四节)_第3张图片

    • Spectre-PHT(绕过边界检查)

      • bypass on loads。重复训练PHT中的某个分支对应的表项,然后在分支错误的路径上访问越界数据,然后使用隐蔽信道将数据传递出来

        //先保证分支一直成立,然后更改x的值,虽然分支不再成立
        //但是之后的语句可能会继续执行,从而访问越界数据
        if (x < len(array1))
        	y = array2[array1[x] * 4096];
        
      • bypass on stores。使用类似同样的方式,但是将数据注入的越界的地址上,从而创建了一个临时的缓冲区溢出,允许攻击者从受害者域中已经存在的代码执行任意的指令序列(类似于return to libc和ROB攻击)

        if (x < len(array))
          array[x] = value;
        
      • NetSpectre(远程的幽灵攻击/网络场景下的幽灵攻击):不需要攻击者控制目标设备的代码,但是要求目标代码中存在幽灵的小部件(leak gadget 和transmit gadget代码),同时通过测量网络请求的延迟来反映内存访问延迟。幽灵小部件通常出现在现代网络驱动程序,网络堆栈和网络服务中

    • Spectre-BTB (分支目标注入),包括BTB和BHB

      • 间接分支预测器仅使用分支指令地址的低12位和BHB来确定跳转目标。BTB中包含的是最近所有跳转的目标位置信息。由于这些结构并不够大,会出现多个分支对应同一个表项的冲突问题,攻击者可以利用错误预测之后的暂态执行从另一个上下文(进程)中读取任意的内存数据
      • 和基于PHT的幽灵攻击不同,基于BTB的攻击使用恶意的目的地址更改分支预测器,从而允许攻击者可以在任意的代码位置进行暂态执行,从而泄露隐私。这些任意的代码称为幽灵小工具,负责将数据传输到攻击者控制的隐蔽信道中
      • 攻击的前提条件:攻击者必须直到受害者地址空间中幽灵小工具的虚拟地址;攻击者和受害者进程需要共同在一个物理内核上,从而能够共享BTB
      • 和ROP攻击的不同:BTB的幽灵攻击的基本思想是执行攻击者选择的小工具,不同之处在于它不依赖于受害者代码中的漏洞,而是利用BTB的错误预测,产生暂态执行
    • Spectre-STL(推测式的store前递)

      • 为了提高性能,使用store buffer保存store将要写的值,而不是直接将更新后的值写入内存
      • 为了避免load会读取内存中的旧值,此时会为每个load检查store buffer。如果处理器允许非对齐访问,则这种检查会非常复杂并且耗时。这个检查过程称为存储统一性检查
      • 为了进一步优化,处理器提出采用推测的store buffer旁路的优化方式,当load被预测和store buffer中的数据没有内存相关问题时,store buffer将会通过bypass传递数据给load
      • Spectre-STL利用推测式的store buffer的旁路优化和cache的flush+reload,泄露内存位置上更早一些的值
      • 限制:攻击者只能从泄露同一个特权级中的存储信息
    • Spectre-RSB(返回栈)

      • RSB通常是硬件实现的栈结构,16个表项,记录call指令的返回地址。在超线程系统中,RSB专用于逻辑核心;如果RSB为空,则使用BTB作为补充。
      • RSB由于填充过度或者不足而导致错误推测。因为太多的新地址会覆盖旧表项,此时被覆盖的表项对应的ret指令返回时,将会到达不可用的地址,此时就会出现填充不足的问题。不同的CPU处理这个问题的方式不同,intel skylake和新一代的处理器,使用BTB作为feedback,从而允许利用BTB攻击
      • RSB中的值由于和软件堆栈上的值不匹配,则会出现错误推测。攻击者通过覆盖软件堆栈上的返回地址或者删除表项来直接污染RSB
      • RSB中的值在推测执行过程中被更改但不回退。在推测执行过程中,使用call指令将返回地址放入RSB,当发现错误推测时,并不会删除这些值,从而允许攻击者将不可访问的地方放入RSB中
      • 共享RSB的错误推测。一个线程在RSB中的值由于上下文切换,被另一个线程使用,从而出现错误推测
  5. Meltdown攻击类型

    • 熔断攻击依赖于CPU异常之后的暂态乱序执行指令,即熔断利用的只会引发异常的情况下。在异常指令提交之前,某些微架构中,允许流水线中的暂态指令可以使用即将发生错误的指令的未授权的结果进行计算

    • 熔断的变体:论文提出一种两维的可扩展的分类方法

      • 第一维:根据导致暂态执行的异常进行分类
      • 第二维:基于异常中的页错误,进一步根据页表项中的保护位进行分类
      • 除此之外,论文还根据攻击可以访问到的存储位置(memory,cache,register)和是否跨越了特权级别进行分类
    • Meltdown-US(Supervisor-only bypass)user/supervisor

      • 利用熔断攻击访问内核空间的数据:load指令访问内核数据,在处理异常之前,使用该数据索引某一个cache line,之后使用Flush+Reload得到实际的内核数据
      • 对于触发的异常,攻击者可以选择处理或者抑制未经授权访问而导致的页面错误
      • 如果OS在内核中有一个直接的物理内存的映射,则整个物理内存都可以被读取,甚至包括未在cache中的数据
    • Meltdown-P(Virtual Translation Bypass)

      • Foreshadow:一种针对intel SGX技术的熔断攻击。SGX中未授权的访问指令将不会产生异常,而是返回一个(abort page dummy value,-1)值代替需要load的值,此时meltdown将无法继续。Foreshadow攻击者将会清除映射到enclave的隐私数据的页表项中的present位,从而保证在之后的访问过程中会出现page fault,此时就可以利用之前的方式获取隐私数据。

      • Foreshadow的根本原因:现代微架构中L1 cache和地址转换连接非常紧密,尽管会发生terminal fault(present为0/reserved为1),物理地址仍会传递到L1 cache,因此到达L1 cache的物理地址会将数据传递给之后的暂态执行

      • L1TF(L1 Terminal Fault):当清除present位或者设置reserved位时,会产生页错误,中断虚拟地址到物理地址的转换过程,因此称为terminal fault。但是这个时候处理器仍然从出错的PTE中产生一个物理地址,从而在L1 data cache中进行查找,找到的数据会被立即转发给之后的暂态执行。

      • Foreshadow-NG(next generation):完全绕过虚拟内存抽象,允许在当前未映射到攻击者的虚拟地址空间视图中的未授权物理内存位置上进行暂态执行,完全逃脱了虚拟内存沙箱的暂态攻击。某些攻击者能够直接或者间接的控制页表项中的物理页号,例如当页被交换到disk时,present位清零,此时kernel可以使用任意其它的位存储metadata,如果此时指令了一个有效的物理地址,则任何cache中的数据都可以被暴露出来

      • Foreshadow-VMM:在客户虚拟机中,如果出现TF,则此时虚拟机中的物理地址并没有进一步转换为实际的物理地址,但是仍旧会访问L1 cache,意味着该VMM可以将整个L1的数据都暴露出来
        A Systematic Evaluation of Transient Execution Attacks and Defenses (对暂态执行的攻击和防御的系统评估)(前四节)_第4张图片

    • Meltdown-GP(访问系统寄存器,system register bypass):读取系统权限的寄存器

      • 非法的访问系统权限的寄存器(例如rdmsr)将会引发一般性保护错误(#GP)。类似于其它meltdown攻击,在错误处理之前,传递数据
    • Meltdown-NM(访问FPU寄存器)

      • 上下文切换时,OS需要保存所有寄存器,包括FPU和SIMD寄存器,但是非常耗时,因此出现了延迟状态切换,即指示将FPU标记为不可用。当之后的第一条FPU指令发出后,将会引发设备不可用异常(#NM,Numeric Error),允许OS在此时保存FPU状态,再标记为可用
      • 利用FPU引发的NM异常,使用正常的meltdown攻击方式,获取之前受害者在FPU中的数据
    • Meltdown-RW(read-only bypass),#PF,page fault

      • 在当前特权级别中绕过基于页表的访问权限检查的meltdown攻击。暂态执行不遵守读/写的页表属性。在当前特权级别内,暂态执行的写只读数据的能力能够绕过基于硬件实现的只读内存管理的软件沙箱
      • 最初这种攻击认为是幽灵的变种,但是论文认为是基于#PF的熔断攻击
    • Meltdown-PK(Protection Key Bypass)一种新的熔断攻击方式

      • Intel Skylake-SP服务器CPU支持在用户空间内使用内存保护键值(memory-protection keys),从而允许进程能够直接从用户空间更改页面的访问权限,并且不需要使用syscall/hypercall。通过这种方式,用户空间的程序可以实现有效受信任部件的硬件强制隔离
      • 论文提出了新的meltdown-PK攻击,可以绕过通过内存保护键值强制执行的读和写的隔离保护。目前没有软件解决方案
      • 实验结果:在Amazon EC2 C5实例上运行ubuntu18.04测试。首先创建一个存储映射,然后利用PK删除读和写权限,之后访问该存储区域会触发#PF,之后就可以利用meltdown获取隐私数据
    • Meltdown-BR(Bounds Check Bypass):边界检查

      • 现代Intel处理器附带了MPX(内存保护扩展),用于高效的数组边界检查)
      • 之前将利用触发#BR异常的攻击方式错误的分类为幽灵的变种。Meltdown-BR是spectre-PHT的一个使用异常驱动的替代方案
    • 其它的一些熔断攻击(结果不好)

      • 目前所有已知的熔断变体都是利用了fault,而没有使用trap或者aborts。此时假设meltdown只有在fault发生的情况下才可能发生
      • US(user/supervisor), P(PF, page fault), GP(general protection fault), NM(数学协处理器不存在或者不可用), RW(read/write, #PF), PK(protection keys, #PF), BR(数组越界, bound range exceeded exception), DE(除零), AC(对齐检查), UD(无效指令), SS(栈段错误), XD(非可执行内存), SM(supervisor mode access prevention )
        A Systematic Evaluation of Transient Execution Attacks and Defenses (对暂态执行的攻击和防御的系统评估)(前四节)_第5张图片

你可能感兴趣的:(computer,architecture)