使用 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/秒。
gcc -std=c99 Source.c -o spectre.out
或
make
创建新的空项目,添加 Source.c,然后点击生成。
.\spectre.out 无参数。
.\spectre.out {address} {length} 参数: