简介
Osiris,一个基于fuzz的框架,用于自动挖掘处理器微架构的侧信道。基于CPU的ISA,Osiris生成指令序列三元组,随后自动测试是否为时间侧信道。在Intel和AMD的CPU上,Osiris发现了4个新的时间侧信道攻击。
Osiris概述
侧信道符号
因为侧信道攻击均可以作为隐蔽信道,Osiris首先用来挖掘隐蔽信道。隐蔽信道和侧信道均要满足以下三个条件:
- reset state (S0):攻击者将微架构组件保持已知状态。例如,Flush+Reload、Prime+Probe等攻击需要刷新或者填充一个cache line。这些指令序列称为 reset sequence (Seqreset)。
- trigger state (S1):受害者由于私密数据改变了微架构组件的状态。S0到S1状态的改变,称作trigger sequence (Seqtrigger)。
- measurement sequence (Seqmeasure):攻击者探测微架构的组件的是出于S0还是S1状态来恢复私密数据。这是通过测试特定指令的执行时间来决定的,这些指令序列被称为measurement sequence (Seqmeasure)。
如上表所示,展示了常见的侧信道攻击的的Seqreset、Seqtrigger和Seqmeasure指令序列。值得一提的是,指令序列不一定是多条指令的组合,也可以是单条指令。
上图的状态机展示了三个步骤和微架构组件状态的关系。
架构设计
- code generation stage:生成Seqreset、Seqtrigger和Seqmeasure指令序列三元组。这些指令序列来自于测试机器的有效指令。
- code execution stage:按照特定顺序,执行两次三元组指令序列,并分别记录执行时间。其中,特定顺序中包含了触发指令,被称作热路径((hot path);否则,被称作冷路径(cold path)。
- result confirmation stage:将热路径和冷路径的执行时间的差异性作为侧信道的第一个指标。
- clustering stage:将侧信道进行分类。
设计与实现
接下来,只讨论在x86 ISA上的实现。
Code Generation Stage
这一阶段的目标是生成指令的三元组 (reset sequence Seqreset,trigger sequence Seqtrigger, 和a measurement sequence
Seqmeasure)。这个阶段采用的方法是随机选择有效指令生成指令的三元组。为了引导代码生成,采用了一种基于机器可读的x86指令规范的语法,指令生成分为两个阶段,线下阶段(offline phase)和线上阶段(online phase)
线下阶段
- 生成元指令:利用uops.info,线下阶段的输出了包含当前ISA的所有指令的文件。
- 生成机器码:将所有的寄存器等价,来减少指令的数量。Osiris将一组固定的寄存器作为操作数,同时排除了能够改变控制流的指令,例如RET和JMP指令。最终,添加一段伪指令,让机器空闲一段时间。这些指令需要reset CPU节能特性的微架构组件,例如AVX2 SIMD unit。
线上阶段
在启动Osiris之前,需要在所有的x86指令中筛选出当前机器支持的指令,然后生成指令序列三元组。
- 清洗机器代码文件:由于线下阶段给出了包含X86 ISA所有指令的输出文件,但是当前机器的微架构可能不支持一些指令,在测试之前需要将数据进行一定的清洗。
- 生成指令序列三元组:利用当前机器可执行的指令生成指令序列三元组。并利用三个先验知识,减少这个工作的复杂性。(1)大多数现有的非基于驱逐的侧通道在每个序列中只需要一条指令。(2)空闲处理器通常可以用来作为 reset sequence。(3)Trigger 和measurement序列通常是可以相同。因此,指令序列的三元组只考虑单个指令序列的所有排列组合。
Code Execution Stage
主要目标是执行指令序列三元组,然后分析结果。
- 减少环境的影响:为了减少外部影响,例如中断和进程调度等,Osiris利用操作系统减少噪声。首先,将Osiris创建的进程绑定在独立的核心。另外,这个核心是独立的,不受中断和调度的影响。
- setup:为了测量执行序列三元组的执行时间,三元组放到一个特殊的序言和尾声之间的地址空间中的一个专用页上。序言负责根据x86-64系统保存所有呼叫保存的寄存器。序言进一步确保了三重在堆栈上有一页抓痕空间。如果三重指令中的任何指令修改了堆栈,例如POP指令,则不会出现损坏。序言将用作内存操作数的所有寄存器初始化为零初始化的可写数据页的地址。这可以防止破坏奥西里斯的内存,并确保已执行的指令访问相同的内存页面。.注意,零填充的页面总是相同的,并且框架为每个测试的三重页面重置这个页面。后记器负责恢复寄存器和堆栈状态,以确保恢复任何架构更改。此外,信号处理程序被注册为所有可能产生的可能从执行一个指令的信号,例如,SIGSEGV。这些处理程序中止当前三重程序的执行,并恢复奥西里斯的干净状态。最后,我们不使用并行化,因为这可能会导致共享CPU资源中的意外干扰。
- 执行时间测量:Osiris分别按照热路径和冷路径执行一次指令序列的三元组。其中,这两种路径的Seqmeasure指令的执行时间均被测量出来。热路径和冷路径的时间差异表明存在潜在的侧信道,并发送给确认阶段。
Result Confirmation Stage
这个阶段的主要目标是验证Code Execution Stage发送的潜在的侧信道是否合法。
- 重复执行:为了减少外部因素的干扰,多次执行热路径和冷路径,并测量执行时间,选择中位数代表执行时间,验证两个路径的执行时间是否存在差异。
Clustering Stage
不同的指令序列可能会导致同一侧信道的检测。例如,对于缓存侧信道,访存操作既可以充当trigger指令序列,还可以充当measurement指令序列。由于x86的CISC特性,许多指令显式(例如ADD)或隐式(例如PUSH)访问存储器。
这个阶段的目标是将上个阶段的侧信道进行聚类。为了实现这个目标,Osiris将侧信道涉及的指令的各种属性进行聚类。指令属性包括指令扩展、内存行为和一般的指令类别(例如,算术和逻辑)。除此之外,Osiris发现时间差异是一个很重要的聚类属性。
- 静态属性:指令序列三元组基于其中指令的属性进行分类,例如,指令种类(算术还是逻辑)、指令扩展(AVX2还是x87-FPU)。基于Seqtrigger和Seqmeasure的指令扩展,Osiris对三元组进行了聚类。这是因为指令集扩展是衡量底层微体系结构根本原因的有力指标。
- 动态属性:显著的时间差异是一个有效的动态属性。如果多个三元组导致相同的时间差异,则根本原因可能是相同的,即访问缓存和未缓存内存时的访问时间差异。
发现新的侧信道攻击
- RDRAND-Based Side Channel:Seqtrigger 和Seqmeasure指令均为RDRAND,Seqreset为休眠指令。执行200 000次,发现中位数存在f 228 cycles的差异。
- XSAVE-Based Side Channel:Seqtrigger为XSAVE,Seqmeasure为XSAVE6。Seqreset可以包含各种指令,分为两个种类: (1)在Seqreset中包含LSL、RDRAND、LAR、FLD、FXRSTOR64或FXSAVE64指令的非瞬态变体;(2)除了大多数x87-FPU指令外,还包含XSAVEOPT指令的瞬态变体。
- MMX Combined with x87-FPU:Seqtrigger 和Seqmeasure均为MMX指令,Seqrese为x87-FPU
- AVX2 Combined with x87-FPU:Seqtrigger 和Seqmeasure分别包含AVX、AVX2、AVX512、FMA或F16C指令,以及Seqreset中的x87-FPU。