1.Meltdown漏洞:
Meltdown漏洞是一种侧信道攻击,允许恶意程序读取位于内核内存的敏感信息。这一漏洞利用了现代处理器在执行乱序指令时的一种设计特性。攻击者可以通过让目标进程访问未授权的内核内存,从而获取敏感数据。乱序执行是指CPU并不是严格按照指令的顺序串行执行,而是根据相关性对指令进行并行执行,最后顺序提交。
(1)乱序执行:
为了进一步提高CPU的性能,现代CPU广泛采用基于超标量流水技术的微架构。这种微架构具有乱序执行的特性,可以根据指令之间的相关性,选择性地改变其执行顺序。与传统的顺序执行相比,乱序执行使得不依赖于前一指令结果的指令能够更早地进入执行阶段,从而减少了指令相关性导致的流水线阻塞,最大限度地保持运算单元的高效利用。这有效地提高了处理器的整体性能。最终,在乱序执行的基础上,指令在提交阶段会按照它们在软件层面的执行顺序进行顺序提交,以确保最终结果符合程序的语义要求。这种设计方式在兼顾性能的同时,保证了指令执行的正确性。
熔断利用的是乱序执行机制。
2.Spectre漏洞:
Spectre漏洞也是一种侧信道攻击,允许攻击者利用程序执行时的分支预测错误,从而读取其他内存中的数据。攻击者可以通过诱导受害程序执行特定的分支指令,然后通过测量执行时间等手段来推断目标内存的内容。。预测执行是CPU根据当前掌握的信息预测某个条件判断的结果,然后选择对应的分支提前执行。
(2)分支预测:
条件分支指令通常涉及两个可能的执行路径,即不采取(not taken)跳转和采取(taken)跳转到另一块程序内存。在流水线执行过程中,是否执行条件跳转的确定,通常需要等到该分支指令进入执行阶段才能最终确定。
在没有分支预测器的情况下,处理器会等待分支指令确定是否采取跳转以及目标地址,然后再将下一条指令送入流水线。这种情况会导致流水线停顿或分支延迟,因为处理器需要等待分支指令的执行结果。为了避免由于流水线停顿而引起的时间浪费,引入了分支预测器。分支预测器会在分支指令还未执行完成时预测是否采取跳转以及跳转的目标地址,并直接将后续指令送入流水线。
如果后来发现分支预测错误,即实际执行结果与预测不符,流水线需要作废之前的推测执行的指令,并重新执行正确的路径。这个过程被称为流水线刷新。分支预测器的引入有效地减少了由于等待分支指令执行结果而产生的流水线停顿,提高了处理器的执行效率。
幽灵利用的是分支预测机制。
不管是乱序执行和预测执行,总之会使一些指令提前执行,当乱序执行和预测执行发生错误时,会将先前执行的指令作废,flush流水线,保证程序的正确性。但是,CPU进行flush时会作废掉load/store指令,但并不会恢复CPU缓存原始状态,而这两组漏洞正是利用了这一设计上的缺陷进行测信道攻击。