使用2018年1月2日披露的“Spectre”漏洞(CVE-2017-5753和CVE-2017-5715)的示例
Spectre打破了不同应用程序之间的隔离。它允许攻击者欺骗那些遵循最佳实践的无错误程序,使其泄露秘密。事实上,这些最佳实践的安全检查反而增加了攻击面,并可能使应用程序更容易受到Spectre攻击。
C语言,使用库:
我们在内存中放入文本 “The Magic Words are Squeamish Ossifrage.”,然后尝试利用漏洞读取它。如果系统存在漏洞,你将在输出中看到相同的文本从内存中读取。
在这段代码中,如果 victim_function() 中的编译指令严格按照程序顺序执行,由于 array1 的大小为16,该函数只会读取 array1[0..15]。然而,当进行推测执行时,越界读取是可能的。readMemoryByte() 函数多次对 victim_function() 进行训练调用,使分支预测器预期 x 为有效值,然后使用越界的 x 进行调用。条件分支预测错误,后续的推测执行利用越界的 x 读取一个秘密字节。随后,推测代码读取 array2[array1[x] * 512],从而将 array1[x] 的值泄露到缓存状态中。为了完成攻击,使用简单的刷新+探测(flush+probe)来识别 array2 中哪个缓存行被加载,从而揭示内存内容。该攻击重复多次,因此即使目标字节最初未被缓存,第一次迭代也会将其带入缓存。
未优化的代码在 i7 Surface Pro 3 上读取速度约为 10KB/秒。