Spectre&Meltdown
这是一种利用现代处理器特性来“窃取”内存中重要信息的漏洞。
Meltdown
- 诱使CPU在乱序执行的基础上将高权限的data信息放置于cache中
- 首先有一个数组,直接访问它的第data*4096个index处的元素
- 这样这个index处的元素会被放进cache中
- 循环遍历这个数组,当遍历到第data*4096个index处元素时,载入速度明显变快,这就说明这里是当时载入cache的元素
- 取到data*4096这个index就取到了data
假设data是一个内核内存空间内的数据,我们就get到了机密的内核数据,这都依赖于cpu的乱序执行:
exception(dont have priority to access))
access(array[data*4096])
乱序执行使得在指令生效前,access运行在了exception之前,虽然指令未生效(寄存器状态等未变),但cache内却有了array[data*4096]这个元素
Spectre
Spectre基本原理与Meltdown类似,但他更强
Meltdown一旦被从根本上避免就无法使用,比如内核和用户使用不同的页目录寄存器等
Spectre并非依赖于乱序执行,而是依赖于分支预测。
分支预测也会使cpu提前跑一下cpu认为正确的分支,尽管他不一定真的是接下来要执行的,同样会在cache里留下痕迹。
但他要求代码有如下形式:
if(index1<array_a_size) {
index2=array_a[index1];
if(index2 < array_b_size);
value = array_b[index2];
}
通过控制index1的长度,让array_b的特定下标的数据Cacheline被点亮,如果有办法访问一次array_b的全部内容,我们就可以窃取到index1这个值。