在这个例子中很容易理解,但实际上他们怎么知道被攻击的地址是什么样的?
你是对的,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。