在纸中,PoC将受害者和攻击者代码放置在同一个进程中。
代码如下:
if (x < array1_size)
y = array2[ array1[x] * 256 ];因此,攻击者和受害者可以使用相同的array2(因为它们在相同的代码、进程中)。
但是在现实世界中,攻击者和受害者是分开的(他们是不同的进程),所以他们不能共享array2。
下面是我的问题,在本例中,攻击者如何度量对array2的访问时间?
攻击者如何知道array2的地址?
我不知道如何攻击者访问array2。这里被误解了什么?
发布于 2019-06-21 22:34:13
问题中的代码引用了谱变体1,也称为边界检查绕行。
这里被误解了什么?
与其从受害者进程和攻击者进程的角度考虑变体1,不如将其视为沙箱攻击者代码,其目标是读取沙箱外的内存。
换句话说,攻击者控制在软件沙箱中运行的一些代码,这个软件沙箱通常会强制每个代码域只访问自己的数据。然而,幽灵允许攻击者的代码绕过这种沙箱的执行。
例如,攻击者为恶意网站提供Javascript代码,该网站在执行时将由Javascript解释器进行沙箱化。Javascript解释器将检查诸如y = array2[ array1[x] * 256 ]这样的代码只有在x < array1_size时才能执行。这称为边界检查,用于确保网站不允许从运行它的浏览器进程的地址空间读取。执行时,攻击者(控制x)可以通过自己的代码训练分支预测器以获取分支if (x < array1_size),从而执行有条件的分支错误预测。最后,攻击者将x设置为期望的、超出范围的值,这将允许他们绕过沙箱的边界检查,并从浏览器进程的地址空间读取内存。总之,这里的攻击者控制一个(沙箱)网站的代码,幽灵允许他们读取打开网站的浏览器的内存(沙箱通常会阻止这一点)。
第二个例子使用eBPF,其中攻击者从Linux内核注入并执行一些代码。eBPF接口允许非特权用户这样做。这段代码通常在内核中的VM/沙箱中执行,它执行边界检查以防止加载的代码读取任意内存。但是,幽灵允许攻击者在BPF沙箱之外违反此沙箱并泄漏任意内存。总之,这里的攻击者是主机的非特权用户,幽灵允许他们读取主机上的任意内存!
但在现实世界中,攻击者和受害者是分开的(他们是不同的过程)。
在这种情况下不行。如上所述,在谱变体1中,“受害者的代码”将“攻击者的代码”封装在同一个过程中。攻击者的代码通常由受害者使用软件沙箱进行隔离,但是幽灵允许绕过它,读取受害者地址空间中的任何内存。
发布于 2019-05-17 17:06:29
要想在没有共享内存的情况下跨地址空间进行攻击,您需要一个不同的侧通道。
也许你会有幽灵小工具导致你的数组中的一条线被逐出,所以你必须有8条条目的时间组(在缓存中所有索引都是相同的),而不是一次1条,因为驱逐可能是集合中的任何一行。
发布于 2019-06-28 02:25:52
它是在没有共享内存的情况下能完成的。
https://stackoverflow.com/questions/54004254
复制相似问题