intel漏洞详细解析
1. CVE-2017-5754(Meltdown):恶意数据缓存加载
即采用特定指令,探测内核访问不到的内存内容。
通过本地运行特定程序的方式读取系统运行的CPU缓存,获得当前运行系统缓存的所有信息
比喻:https://baijiahao.baidu.com/s?id=1588835621748074141&wfr=spider&for=pc
简化的例子:https://baijiahao.baidu.com/s?id=1589161700913499450&wfr=spider&for=pc
1)乱序执行:
代码:
a = 1; b = 2; c = 3; d = a + b + c;
CPU:
a = 1
b = 2 -> d = a + b + c;
c = 3
乱序执行出现bug -> oops -> 恢复现场 -> cache中的数据仍存在 -> 通过cache的访问延时来推测
2)Meltdown –限制
只能访问同一地址空间的内容,因此被攻击的数据必须与攻击者位于同一地址空间。
传统的Linux进程与内核采用同一页表,成为用户程序获取内核数据的基础。
理论上,用户程序可以获取位于同一地址空间的任何数据(比如没有r权限的数据)。
另外,攻击手段依赖CPU的设计失误,也就是乱序执行时不检查访问权限,因此只对intel的CPU有效。
3)Meltdown –防御
内核与用户态页表隔离
KASLR: kernel address isolation to have side-channels efficiently removed
KPTI: Kernel Page Table Isolation
4)性能问题
由于引进了PCID技术,性能影响较小
PCID:
进程切换不需要刷新TLB(ASID in ARM)
12bits: 4096项
多核问题
2. CVE-2017-5753(Spectre1):分支目标注入
即利用了间接分支预测器,有意让间接分支目标出现错误的(攻击者指定的)预测。
3. CVE-2017-5715(Spectre2):边界检查旁路
即利用了条件分支指令之后的预测执行,有意让条件分支出现错误的(攻击者指定的)预测。
if (condition){
codea();
}
codeb();
CPU执行顺序(预测):两个分支同时执行
if (condition) > codea() > codeb() > ...
> 回退
解决:
让CPU支持IBRS、STIBP、IBPB操作,新处理器直接支持,老处理器需要更新微码。
进程切换等位置使用上述指令,控制分支预测操作。
Meltdown vs Spectre
Meltdown: 攻击者在自己的代码中访问目标数据,依赖CPU的乱序执行不检查权限Bug
Spectre: 攻击者创造条件,让攻击者之外的代码去访问目标数据
侧信道:
CPU在执行代码时,除了本身功能之外的、可以被检测到的影响,都属于侧信道。
如热量、功率、CPU压力、cache等数据,以及CPU内部的BTB和分支历史记录