在幽灵paper中,PoC将受害者和攻击者代码放在同一个进程中。
代码是这样的:
if (x < array1_size)
y = array2[ array1[x] * 256 ];
因此攻击者和受害者可以使用相同的
array2
(因为它们位于相同的代码、进程中)。
但在现实世界中,攻击者和受害者是分开的(他们是不同的进程),因此他们无法共享
array2
。
所以这是我的问题,在这种情况下,攻击者如何测量对
array2
的访问时间?array2
的地址?
我不知道攻击者如何访问
array2
。这里有什么误解吗?
问题中的代码指的是 Spectre Variant 1,也称为“边界检查绕过”。
这里有什么误解吗?不要将变体 1 视为受害者进程和攻击者进程,而是将其视为沙箱中的攻击者代码,其目标是读取沙箱之外的内存。
换句话说,攻击者控制了一些在软件沙箱中运行的代码,而这个软件沙箱通常会强制每个代码域只能访问自己的数据。 然而,Spectre 允许攻击者的代码绕过此类沙箱的强制执行。
例如,攻击者为恶意网站提供Javascript代码,该网站在执行时将被Javascript解释器沙箱化。 Javascript 解释器会检查诸如
y = array2[ array1[x] * 256 ]
之类的代码只能在
x < array1_size
时执行。
这称为边界检查,用于确保不允许网站读取运行它的浏览器进程的地址空间。
执行后,攻击者(控制x
)可以通过让自己的代码训练分支预测器采用分支if (x < array1_size)
来执行条件分支错误预测。
最后,攻击者将 x
设置为所需的越界值,由于 Spectre,这将允许他们绕过沙箱的边界检查并从浏览器进程的地址空间读取内存。
总之,这里的攻击者控制了(沙盒)网站的代码,而 Spectre 允许他们读取打开网站的浏览器的内存(这通常会被沙盒阻止)。第二个示例使用 eBPF,攻击者从 Linux 内核注入并执行一些代码。 eBPF 接口允许非特权用户执行此操作。 该代码通常在内核虚拟机/沙箱中执行,该沙箱执行边界检查以防止加载的代码读取任意内存。 然而,Spectre 允许攻击者在 BPF 沙箱之外违反此沙箱并泄漏任意内存。 综上所述,这里的攻击者是主机的非特权用户,Spectre允许他们读取主机上的任意内存!
但在现实世界中,攻击者和受害者是分开的(他们是不同的进程)
在这种情况下不是。 如上所述,在 Spectre 变体 1 中,“受害者的代码”将“攻击者的代码”封装在同一进程中。 攻击者的代码通常会被受害者使用软件沙箱隔离,但 Spectre 允许绕过它并读取受害者地址空间中的任何内存。
也许你的幽灵小工具会导致数组中的一行被
驱逐,所以你必须对8个条目的组进行计时(所有条目都在缓存中索引相同的集合)而不是一次1个,因为驱逐可能是一组中的任何一行。