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