进程如何在Spectre攻击中共享array2(oracle数组)



在spectre论文中,PoC将受害者和攻击者代码放在同一过程中。

代码如下:

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

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

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

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

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

问题中的代码指的是Spectre变体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接口允许无特权用户这样做。此代码通常在内核内VM/沙箱中执行,该沙箱执行边界检查以防止加载的代码读取任意内存。然而,Spectre允许攻击者在BPF沙箱之外违反此沙箱并泄漏任意内存。总之,这里的攻击者是主机的无特权用户,Spectre允许他们读取主机上的任意内存!

但在现实世界中,攻击者和受害者是分开的(他们是不同的过程)

在这种情况下不是。如上所述,在Spectre变体1中,"受害者代码"将"攻击者代码"封装在同一进程中。攻击者的代码通常会被受害者使用软件沙盒隔离,但Spectre允许绕过它并读取受害者地址空间中的任何内存。

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

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

这可以在没有共享内存的情况下完成。

相关内容

  • 没有找到相关文章

最新更新