Intel CPU漏洞简述

作者:腾讯湛泸实验室

0x00 简述:

最近Intel CPU爆出两个重大安全漏洞Spectre ,meltdown,漏洞广泛影响1995年之后的处理器。intel cpu存在设计上的缺陷,导致攻击者可以读取系统(windows或linux)kernel的内存,不受系统权限的限制。Spectre ,meltdown漏洞由Google研究团队ProjectZero发现,已经在2017-06-01把两个漏洞报告给相关cpu厂商。ProjectZero团队给出了有效的攻击方法。漏洞编号CVE-2017-5753,CVE-2017-5715,CVE-2017-5754。

0x01 漏洞简述:

该CPU漏洞可以让攻击者从用户态任意读取kernel的内存,彻底打破了由硬件保证的内存隔离,根据intel 白皮书描述,属于可预测的边信道攻击方式(Speculative Execution Side Channel Methods)Speculative execution本身是现代处理器为了提高性能引入的机制,通过对程序控制流的预测,判断哪些指令高频度执行,CPU中会有一个指令分析池,专门分析程序控制流,这种预测可以提高处理器的并行性能,这种Speculative execution操作本身并不影响处理器的状态,但是可以影响微处理器的状态,例如:存储在TLBs(Translate Look side Buffers) 和caches(缓存)中的内容。边信道攻击(Side Channel Cache Methods):边信道攻击和其他的安全漏洞不一样,边信道攻击可以用来获取系统的内存信息,但是这种攻击不会修改也不会删除内存数据。

0x02 漏洞原理:

Meltdown攻击:

了解这个漏洞原理之前,需要了解一些基础的计算机系统知识,包括系统乱序执行,地址翻译,以及系统cache, Meltdown的攻击目标是获取内核的内存内容。笔者介绍一下这个攻击主要利用的机制,为了把漏洞原理解释清楚,笔者采用汇编伪代码方式,假设:要读取的内核地址为0xFFFF0000 该地址的内容为0x00000001首先构造如下代码,代码执行在ring3

{
1 ; rcx = kernel address  0xFFFF0000
2 ; rbx = probe array
retry:
3 mov al, byte [rcx]
4 shl rax, 0xc
jz retry
5 mov rbx, qword [rbx + rax]
}

由于代码运行在用户态,在指令3中,一个仅有普通用户级权限的攻击者访问目标内核内存地址(存储在寄存器rcx中),正常代码逻辑会发生一个异常,原因是在用户态访问了内核地址,这一条指令将会触发访问异常,使得该指令和它之后的指令对寄存器的修改将被全部丢弃。但是在等待CPU完成执行该指令的同时,后两条指令因为预测执行实际上已经被执行过了,并且此时的计算是根据指令3所读取到的数据所进行,并不受CPU权限限制。指令4将会把这个数据乘以4096,并在指令5中将其作为offset来对数组probe array进行访问。由于一个内存页的大小是4KB,不同的数据将会导致不同的内存页被访问并存放到CPU缓存中。此后,另一个攻击者进程就可以通过缓存侧信道攻击,来探测哪个内存页被访问过了,从而推断出被访问的内核内存数据。

原理如图

之后利用缓存侧信道攻击

此时访问页面probe array page 1,和一个没有被加入到cache的页面,如果访问页面1的速度比较快,那就说明内核地址0xffff0000内容最低的bit为1,然后依次对每个位进行测试,得出任意的内核内存内容,完成信息泄漏。

Spectre攻击:

Spectre攻击利用了CPU的预测执行对系统进行攻击。预测执行是另外一种CPU优化特性。但是攻击方式相似,攻击者通过控制目标程序的某个变量或者寄存器,使其读取攻击者指定的内存地址。这里攻击者指定的内存地址的内容就是攻击者试图获取的机密数据(比如用户密码)。如果目标程序中含有将这个机密数据作为内存访问的指针或者数组offset,那么攻击者就可以利用缓存侧信道来提取被访问的内存地址,进而提取目标机密数据。

0x03 攻击与危害:

该漏洞不但影响Intel CPU系列产品,同时影响AMD系列CPU,本质上说,Meltdown和Spectra都是基于侧信道的攻击,主要用于信息泄漏,并不能对目标的内存进行修改。但是Meltdown攻击打破了原有的权限限制,可以读取操作系统中的任意内存,这就对云服务器以及个人电脑构成了很大的威胁。漏洞可以用于内存中某些重要内容的读取,例如系统密码hash,token等等。

0x04 漏洞的防御:

Meltdown和Spectre攻击利用的是CPU微码架构上的设计缺陷,短时间内很难通过处理器厂商升级修复漏洞。

针对此漏洞微软做出修复方案,微软分离了用户态和内核态的CR3,在2017年11月的Win10 RS4测试版本上引入了Dual-CR3机制,来缓解这个漏洞。由于媒体的广泛报道,微软一月份的漏洞公告中提前推送了这个漏洞的补丁。

0xFF 参考文章:

https://spectreattack.com/spectre.pdf//spectreattack.com/spectre.pdf>

https://meltdownattack.com/meltdown.pdf//meltdownattack.com/meltdown.pdf>

https://googleprojectzero.blogspot.com/2018/01/reading-privileged-memory-with-side.html//googleprojectzero.blogspot.com/2018/01/reading-privileged-memory-with-side.html>

https://newsroom.intel.com/wp-content/uploads/sites/11/2018/01/Intel-Analysis-of-Speculative-Execution-Side-Channels.pdf//newsroom.intel.com/wp-content/uploads/sites/11/2018/01/Intel-Analysis-of-Speculative-Execution-Side-Channels.pdf>

https://zhuanlan.zhihu.com/p/32654221//zhuanlan.zhihu.com/p/32654221>