1

作为学习项目的一部分,我在 Spectre 和 Meltdown PoC 上做了一些工作,以使自己对这个概念更加熟悉。我已经设法使用时钟计时器恢复以前访问的数据,但现在我想知道他们是如何从那时起实际读取物理内存的。

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

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

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

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

4

1 回答 1

1

在这个例子中很容易理解,但实际上他们怎么知道被攻击的地址是什么样的?

你是对的,Spectre 和 Meltdown 只是可能性,而不是即用型攻击。如果您知道要从其他来源进行攻击的地址,那么即使使用浏览器,Spectre 和 Meltdown 也是获取数据的方法。

它是带有偏移量的虚拟地址,还是物理地址,它们如何设法找到“重要内存”首先位于哪里?

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

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

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

看看我的基于 Spectre 的 Meltdown PoC(即 2 合 1):https ://github.com/berestovskyy/spectre-meltdown

它比 Specre 论文中的原始代码更简单、更容易理解。它在 C 语言中只有 99 行(包括注释)。

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

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

于 2018-04-10T21:30:38.603 回答