作为学习项目的一部分,我在幽灵和崩溃的poc上工作了一些,使自己对这个概念更加融洽。我已经设法使用时钟计时器恢复了以前访问的数据,但是现在我想知道他们如何从那时读取物理内存。
导致我的问题:在许多Specter V1 V2示例中,您可以阅读此玩具代码示例:
if (x<y) {
z = array[x];
}
X据说与:Attacted_adress -Adress_of_array相等,这将有效地导致z在Attacted_adress处获得值。
在示例中,这很容易理解,但实际上,他们甚至知道攻击性_adress的样子?它是带有偏移或物理地址的虚拟地址,他们如何设法找到"重要的内存"位于哪里?
在示例中,这很容易理解,但实际上,他们甚至知道攻击性_adress的样子?
您是对的,幽灵和崩溃只是可能性,而不是现成的攻击。如果您知道来自其他来源攻击的地址,那么Spectre和Meltdown即使使用浏览器也可以获取数据。
是一个虚拟地址,带有偏移或物理地址,他们如何设法找到"重要的内存"首先位于位置?
当然,这是一个虚拟地址,因为它们都在用户空间程序中发生。但是,在最近的内核补丁之前,我们在每个用户空间过程中都有一个完整的内核空间。这是为加速系统调用做出的,即仅执行特权上下文开关,而不是每个syscall的过程上下文切换。
因此,由于该设计和崩溃,可以从未拨动的内核上读取无私人用户空间应用程序(例如浏览器(的内核空间。
通常,最简单的攻击方案是用旧内核的靶向机器,该机器不使用地址随机化,即内核符号位于运行特定内核版本的任何机器上。基本上,我们在测试机上运行特定的内核,写下"重要的内存地址",然后使用这些地址对受害者机器进行攻击。
请看一下我基于幽灵的熔融POC(即2英寸1(:https://github.com/berestovskyy/spectre-meltdown
比规格纸上的原始代码更简单,更容易理解。它在C中只有99行(包括评论(。
它使用上述技术,即对于Linux 3.13,它只是尝试读取位于内核空间中的linux_proc_banner
符号的预定义地址0xffffffff81800040
。它可以使用内核3.13在不同的机器上运行,并成功读取每台机器上的内核空间。
它是无害的,但只是一个很小的工作poc。