在段错误期间是否访问了物理内存的其他部分?
Are other parts of physical memory accessed during a segfault?
作为学习项目的一部分,我在 Spectre 和 Meltdown PoC 上做了一些工作,以使自己对这个概念更加熟悉。我已经设法使用时钟计时器恢复了以前访问过的数据,但现在我想知道它们实际上是如何从那时起读取物理内存的。
这引出了我的问题:在很多 Spectre v1\v2 示例中,您可以阅读这段玩具代码示例:
if (x<y) {
z = array[x];
}
假设 x 等于:attacked_adress - adress_of_array,这将有效地导致 z 获得 attacked_adress 处的值。
在例子中很容易理解,但实际上他们怎么知道attacked_adress长什么样子呢?
它是带偏移量的虚拟地址还是物理地址,他们如何找到 "important memory" 首先位于何处?
In the example it's quite easy to understand, but in reality how do they even know what attacked_adress looks like ?
你是对的,Spectre 和 Meltdown 只是可能性,而不是 ready-to-use 攻击。如果您知道从其他来源攻击的地址,Spectre 和 Meltdown 是即使使用浏览器也能获取数据的方法。
Is it a virtual address with an offset, or a physical address, and how do they manage to find where is the "important memory" located in the first place ?
当然,它是一个虚拟地址,因为这一切都发生在用户 space 程序中。但是在最近的内核补丁之前,我们有一个完整的内核 space 映射到每个用户 space 进程。这是为了加速系统调用,即只对每个系统调用进行特权上下文切换,而不是进程上下文切换。
因此,由于该设计和 Meltdown,可以在未打补丁的内核上从非特权用户 space 应用程序(例如浏览器)读取内核 space。
一般来说,最简单的攻击场景是针对具有旧内核的机器,它不使用地址随机化,即内核符号在特定内核版本的任何机器上都位于同一位置 运行。基本上,我们 运行 测试机器上的特定内核,记下 "important memory addresses" 然后 运行 使用这些地址对受害者机器进行攻击。
看看我的 Specter-Based Meltdown PoC(即二合一):https://github.com/berestovskyy/spectre-meltdown
它比Specre论文中的原始代码更简单易懂。它在 C 中只有 99 行(包括注释)。
它使用上述技术,即对于 Linux 3.13,它只是尝试读取预定义地址 0xffffffff81800040
,这是位于内核 space 中的 linux_proc_banner
符号。它 运行 在具有内核 3.13 的不同机器上没有任何特权,并在每台机器上成功读取内核 space。
它是无害的,但只是一个微小的工作 PoC。
作为学习项目的一部分,我在 Spectre 和 Meltdown PoC 上做了一些工作,以使自己对这个概念更加熟悉。我已经设法使用时钟计时器恢复了以前访问过的数据,但现在我想知道它们实际上是如何从那时起读取物理内存的。
这引出了我的问题:在很多 Spectre v1\v2 示例中,您可以阅读这段玩具代码示例:
if (x<y) {
z = array[x];
}
假设 x 等于:attacked_adress - adress_of_array,这将有效地导致 z 获得 attacked_adress 处的值。
在例子中很容易理解,但实际上他们怎么知道attacked_adress长什么样子呢? 它是带偏移量的虚拟地址还是物理地址,他们如何找到 "important memory" 首先位于何处?
In the example it's quite easy to understand, but in reality how do they even know what attacked_adress looks like ?
你是对的,Spectre 和 Meltdown 只是可能性,而不是 ready-to-use 攻击。如果您知道从其他来源攻击的地址,Spectre 和 Meltdown 是即使使用浏览器也能获取数据的方法。
Is it a virtual address with an offset, or a physical address, and how do they manage to find where is the "important memory" located in the first place ?
当然,它是一个虚拟地址,因为这一切都发生在用户 space 程序中。但是在最近的内核补丁之前,我们有一个完整的内核 space 映射到每个用户 space 进程。这是为了加速系统调用,即只对每个系统调用进行特权上下文切换,而不是进程上下文切换。
因此,由于该设计和 Meltdown,可以在未打补丁的内核上从非特权用户 space 应用程序(例如浏览器)读取内核 space。
一般来说,最简单的攻击场景是针对具有旧内核的机器,它不使用地址随机化,即内核符号在特定内核版本的任何机器上都位于同一位置 运行。基本上,我们 运行 测试机器上的特定内核,记下 "important memory addresses" 然后 运行 使用这些地址对受害者机器进行攻击。
看看我的 Specter-Based Meltdown PoC(即二合一):https://github.com/berestovskyy/spectre-meltdown
它比Specre论文中的原始代码更简单易懂。它在 C 中只有 99 行(包括注释)。
它使用上述技术,即对于 Linux 3.13,它只是尝试读取预定义地址 0xffffffff81800040
,这是位于内核 space 中的 linux_proc_banner
符号。它 运行 在具有内核 3.13 的不同机器上没有任何特权,并在每台机器上成功读取内核 space。
它是无害的,但只是一个微小的工作 PoC。