Process 如何在 Spectre Attack 中共享 array2(oracle 数组)?

How Process can Share array2(the oracle array) in Spectre Attack?

在幽灵 paper 中,PoC 将受害者和攻击者代码放在同一个进程中。

代码是这样的:

if (x < array1_size)
  y = array2[ array1[x] * 256 ];

所以攻击者和受害者可以使用相同的array2(因为他们在相同的代码、进程中)。

但在现实世界中,攻击者和受害者是分开的(他们是不同的进程),所以他们不能共享 array2

所以这是我的问题,在这种情况下,攻击者如何测量对 array2 的访问时间?
攻击者如何知道 array2 的地址?

我不知道攻击者如何访问 array2。这里有什么误解?

要在没有共享内存的情况下跨地址空间进行攻击,您需要一个不同的 side-channel。

也许您的 spectre 小工具会导致数组中某一行的 驱逐 ,因此您必须对 8 个条目的组进行计时(所有索引都相同设置在缓存中)而不是一次 1 个,因为驱逐可能是集合中的任何一行。

问题中的代码指的是 Spectre Variant 1,也称为 边界检查绕过

What is misunderstood here?

与其从受害者进程和攻击者进程的角度考虑变体 1,不如将其视为沙盒攻击者代码,其目标是读取其沙盒之外的内存。

换句话说,攻击者控制了一些在软件沙箱中运行的代码,而这个软件沙箱通常会强制每个代码域只能访问自己的数据。 但是,Spectre 允许攻击者的代码绕过此类沙箱的实施。

例如,攻击者为恶意网站提供 Javascript 代码,该代码将在执行时被 Javascript 解释器沙盒化。 Javascript 解释器会检查 y = array2[ array1[x] * 256 ] 等代码是否只能在 x < array1_size 时执行。 这称为边界检查,用于确保不允许网站从浏览器进程 运行 的地址 space 读取它。 执行后,攻击者(控制 x)可以通过让他们自己的代码训练分支预测器采用分支 if (x < array1_size) 来执行条件分支预测错误。 最后,攻击者将 x 设置为所需的 out-of-bounds 值,由于 Spectre,这将允许他们绕过沙箱的边界检查并从地址 space 读取内存浏览器进程。 总之,这里的攻击者控制了一个(沙盒)网站的代码,而 Spectre 允许他们读取打开该网站的浏览器的内存(通常会被沙盒阻止)。

第二个示例使用 eBPF,其中攻击者从 Linux 内核注入并执行一些代码。 eBPF 接口允许非特权用户这样做。 此代码通常会在 in-kernel VM/sandbox 中执行,它执行边界检查以防止加载的代码读取任意内存。 但是,Spectre 允许攻击者在 BPF 沙箱之外违反此沙箱并泄漏任意内存。 综上所述,这里的攻击者是主机的非特权用户,Spectre允许他们读取主机上的任意内存!

But in real world, Attacker and Victim is separated(they are different process)

在这种情况下不是。 如上所述,在 Spectre 变体 1 中,"victim's code" 将 "attacker's code" 封装在同一进程中。 攻击者的代码通常会被受害者使用软件沙箱隔离,但 Spectre 允许绕过它并读取受害者地址 space.

中的任何内存。

can无需共享内存即可完成。