在段错误期间是否访问了物理内存的其他部分?

时间:2018-04-02 09:54:37

标签: c security segmentation-fault kernel spectre

作为学习项目的一部分,我在Spectre和Meltdown PoC上做了一些工作,让自己更加舒适。我已经设法使用时钟定时器恢复以前访问过的数据,但现在我想知道他们是如何实际读取物理内存的。

这引出了我的问题:在许多Spectre v1 \ v2示例中,您可以阅读这段玩具代码示例:

if (x<y) {
  z = array[x];
}

x应该等于:attacked_adress - adress_of_array,这将有效地导致z获得attacked_adress的值。

在示例中,它很容易理解,但实际上他们怎么知道attacked_adress是什么样的? 它是一个带有偏移量或物理地址的虚拟地址,它们如何设法找到首先位于“重要内存”的位置?

1 个答案:

答案 0 :(得分:1)

  

在示例中,它很容易理解,但实际上他们怎么知道attacked_adress是什么样的?

你是对的,幽灵和熔毁只是可能性,而不是随时可用的攻击。如果您知道要从其他来源攻击的地址,即使使用浏览器也可以使用Spectre和Meltdown来获取数据。

  

它是一个带有偏移量或物理地址的虚拟地址,他们如何设法找到首先位于“重要记忆”的位置?

当然,它是一个虚拟地址,因为它发生在用户空间程序中。但是在最近的内核补丁之前,我们有一个完整的内核空间映射到每个用户空间进程。这是为了加速系统调用,即只为特权上下文切换而不是每个系统调用的进程上下文切换。

因此,由于该设计和Meltdown,可以在未修补的内核上从非特权用户空间应用程序(例如,浏览器)读取内核空间。

通常,最简单的攻击方案是针对具有旧内核的计算机,该内核不使用地址随机化,即内核符号位于运行特定内核版本的任何计算机上的相同位置。基本上,我们在测试机器上运行特定内核,记下“重要内存地址”,然后使用这些地址在受害者计算机上运行攻击。

看看我的基于幽灵的熔毁PoC(即二合一):https://github.com/berestovskyy/spectre-meltdown

比Specre论文的原始代码更简单易懂。它只有99行(包括注释)。

它使用上述技术,即对于Linux 3.13,它只是尝试读取位于内核空间中的0xffffffff81800040符号的预定义地址linux_proc_banner。它在内核3.13的不同机器上没有任何权限运行,并成功读取每台机器上的内核空间。

它是无害的,但只是一个微小的工作PoC。