课程:《密码与安全新技术专题》编程
班级: 92
姓名: 冯乾
学号: 20182918
上课教师:谢四江
上课日期:2019年5月25日
必修/选修: 选修缓存
论文题目:Spectre Attacks: Exploiting Speculative Execution
论文来源:39th IEEE Symposium on Security and Privacy(Oakland)
做者信息:安全
- Paul Kocher
- Independent
- Daniel Genkin
- University of Pennsylvania and University of Maryland
- Daniel Gruss
- Graz University of Technology
- Werner Haas
- Cyberus Technology
- Mike Hamburg
- Rambus, Cryptography Research Division
- Moritz Lipp
- Graz University of Technology
- Stefan Mangard
- Graz University of Technology
- Thomas Prescher
- Cyberus Technology
- Michael Schwarz
- Graz University of Technology
- Yuval Yarom
- University of Adelaide and Data
本文发表时间不到一年半,引用次数已经达到了416次。ide
现代处理器使用分支预测和推测执行来最大化性能。 例如,若是分支的目标取决于正在读取的内存值,则CPU将尝试获取目标并尝试提早执行。 当内存值最终到达时,CPU丢弃或提交推测计算。 推测逻辑在执行方式上是不忠实的,能够访问受害者的内存和寄存器,而且能够执行具备可测量反作用的操做。
幽灵攻击涉及诱使受害者以规范的方式执行在正确的程序执行期间不会发生的操做以及泄漏受害者的操做,能够经过侧信道向外界提供的机密信息。幽灵攻击结合了来自侧信道攻击,故障攻击和回归导向编程的方法,能够从受害者的内存中读取任意任意位置的内容。 更普遍地说,推测性执行实施违反了支持数字软件安全机制的安全假设,包括操做系统进程分离,静态分析,容器化,即时(JIT)编译以及对缓存的定时/侧通道攻击的对策。 这些攻击对实际系统构成严重威胁,由于在用于数百万台设备的英特尔,AMD和ARM的微处理器中发现了漏洞预测执行的功能。
幽灵攻击就像字面所说的意思同样,来无影去无踪,当攻击发生时受害者在毫无察觉的状况下就被CPU的预测执行功能“出卖”了。性能
预测执行简单来讲是一些具备预测执行能力的新型处理器,能够估计即将执行的指令,采用预先计算的方法来加快整个处理过程。学习
预测执行的设计理念是:加速大几率事件。测试
预测执行是高速处理器使用的一种技术,经过考虑可能的将来执行路径并提早地执行其中的指令来提升性能。例如,当程序的控制流程取决于物理内存中未缓存的值时,可能须要几百个时钟周期才能知道该值。除了经过空闲浪费这些周期以外,过程还会控制控制流的方向,保存其寄存器状态的检查点而且继续在推测的路径上推测性地执行该程序。当值从存储器中偶然到达时,处理器检查最初猜想的正确性。若是猜想错误,则处理器将寄存器状态恢复为存储的检查点并丢弃(不正确的)预测执行,若是猜想是正确的,则该部分代码已被执行过,不须要再次执行,所以带来了显著的性能增益。操作系统
能够发现,若是预测错误,即使程序真正执行到这里时错误结果被丢弃,但错误的结果仍是短暂的出如今寄存器中,在被丢弃以前,这部分数据就很容易被泄露。设计
下面是一段可能被分支预测器错误预估的代码:
3d
对于这段代码,攻击者首先使用有效的x调用相关代码,训练分支预测器判断该if为真。 而后,攻击者设置x值在array1_size以外。 CPU猜想边界检查将是真的,推测性地使用这个恶意x读取array2 [array1 [x] * 256]。 读取array2使用恶意x将数据加载到依赖于array1 [x]的地址的高速缓存中。当处理器意识到这个if为假时,重现选择执行路径,但缓存状态的变化不会被恢复,而且能够被攻击者检测到以找到受害者的存储器的一个字节。 经过使用不一样的x值重复,能够利用该构造来读取受害者的存储器。
该段代码的一般执行过程以下:
进入if判断语句后,首先从高速缓存查询有无array1_size的值,若是没有则从低速存储器查询,按照咱们的设计,高速缓存一直被擦除因此没有array1_size的值,总要去低速缓存查询。
查询到后,该判断为真,因而前后从高速缓存查询array1[x]和array2[array1[x]*256]的值,通常状况下是不会有的,因而从低速缓存加载到高速缓存。
在执行过几回以后,if判断连续为真,在下一次须要从低速缓存加载array1_size时,为了避免形成时钟周期的浪费,CPU的预测执行开始工做,此时它有理由判断if条件为真,由于以前均为真(加速大几率事件),因而直接执行下面的代码,也就是说此时即使x的值越界了,咱们依然颇有可能在高速缓存中查询到内存中array1[x]和array2[array1[x]*256]的值,当CPU发现预测错误时咱们已经获得了须要的信息。
攻击流程图以下:
获取目标内存地址的技术本论文没有介绍,我的觉得能够堆内存地址进行监控,选择频繁被修改的地址。
攻击示例程序中的受害代码采用上面的例子,交替输入有效和恶意的参数:
Meltdown是一种相似的微体系结构攻击,它利用无序执行来泄漏目标的物理内存。 Meltdown在两个主要方面与Spectre Attacks大相径庭。 首先,与Spectre不一样,Meltdown不使用分支预测来实现推测执行。 相反,它依赖于观察,当一条指令致使一个软中断时,正在无序执行的指令停止。第二,Meltdown利用特定于英特尔处理器的特权升级漏洞,由此 推测执行的指令能够绕过内存保护。 结合这些问题,Meltdown从用户空间访问内核内存。 此访问会致使软中断,但在发出软中断以前,访问后面的代码会经过缓存通道泄漏所访问内存的内容。与Meltdown不一样,Spectre攻击适用于非Intel处理器,包括AMD和ARM处理器。 此外,KAISER补丁已被普遍应用于对Meltdown攻击的缓解,但不能防止幽灵攻击。
代码修改:原论文附录中提供的代码存在些许瑕疵,对于观察指望输出存在必定阻碍,如图:
正如没有绝对安全的系统,某种方案被开发出来后一定伴随着一些隐藏的反作用。预测执行这种技术听起来确实是有无限可能,尤为是在处理器性能大大受到IO限制的今天。但推测执行带来的问题也不得不防,利用推测执行的漏洞进行攻击的幽灵,无声无息的盗取数据后甚至不会留下一点痕迹。