为什么英特尔微处理器允许Meltdown发生?

时间:2019-05-14 20:10:20

标签: x86 intel

The Meltdown Paper中,使用以下汇编代码描述了攻击:

 ; rcx = kernel address, rbx = probe array
 xor rax, rax
 retry:
 mov al, byte [rcx]
 shl rax, 0xc
 jz retry
 mov rbx, qword [rbx + rax]

然后将缓存内存地址rbx + rax,然后根据该缓存的地址推导出值*rcx

但是,如果权限不签出,我什至不理解为什么al甚至会被*rcx加载。在执行页表遍历以确定*rcx的值时,在页表项中应该明显缺少权限。无论我们执行指令的顺序如何,都必须在加载值之前进行遍历。因此,

为什么甚至不允许加载到al中?

2 个答案:

答案 0 :(得分:2)

要获得可能的最高性能,CPU必须并行执行许多操作。

例如,当访问内存中的某些内容时,CPU可能希望获取数据并并行执行权限检查(然后,如果权限检查失败,则将所有内容恢复为以前的状态);因为这比先进行权限检查然后在权限检查通过之后获取数据要快(对于“可能通过”权限检查的情况)。

当然,如果这意味着获取会导致在进行权限检查之前将某些内容带入CPU的缓存;那就很好了,因为无论如何缓存实际上都不应该是体系结构可见状态的一部分。换句话说,如果权限检查确实失败了,那么您将不需要将缓存恢复到以前的状态(这将是困难的/昂贵的),因为软件“不能”依赖于缓存的确切内容。

这一切看起来完全合理,不是吗?

但是...

如果软件使用推测性执行来欺骗CPU来获取某些数据,其中所获取的数据的地址取决于内核空间中的值,则这可能在权限检查完成之前发生,然后一切都发生(缓存除外) )将被还原;如果该软件使用计时来确定将哪个地址提取到缓存中,则该软件可以使用该信息来确定该地址所依赖的内核空间中的值。

本质上;英特尔做出了一些设计决策,以提高当时看来完全合理的性能。我们只有看到事后的见识,才能看到安全漏洞。

答案 1 :(得分:1)

摘自论文

  

Meltdown利用了现代CPU的乱序执行,   仍然在   非法内存访问和引发异常

Out-of-order执行用于性能优化。