Intel CPU漏洞分析报告
预备知识
存储分级
由于计算机存储分级的特性(第一级:寄存器,第二级:高速缓存,第三级:内存,第四级:磁盘),每一级之间的访问速度差距高达数量级。所以处理器会将用到的数据和指令加载进高速缓存(现代CPU分指令高速缓存与数据高速缓存),以提高计算机的执行速度。其加载数据或指令进高速缓存的原则是(空间局部性、时间局部性):
1. 时间局部性:如果一个数据被访问,那么在近期它很可能还会被再次访问。
2. 空间局部性: 与当前访问的数据紧挨着的数据,近期将会被访问
分支预测
分支预测分为动态分支预测与静态分支预测。其效果就是预测跳转地址,让CPU去执行该地址的指令,不用让CPU等待判断结果,进而提高程序速度。若预测错误,CPU也会保证预测执行不会造成影响.
静态分支预测:每次假设都跳转或都不跳转
动态分支预测:会根据以往的跳转结果来判断本次是否跳转
乱序执行
是指CPU不会严格按照指令的排列顺序执行(无依赖性),但是会保证其执行结果与按照顺序执行的结果一样。如
mov eax,1
mov ebx,1
其之间没有依赖关系,采用乱序执行可以提高执行速度。
漏洞证明
漏洞利用方法:首先我们创建一个数组(我创建的数组一项大小是一个页面,一共256项),然后清空该数组的缓存,通过利用不应该执行成功的指令(或永远不会执行的指令),获得对应地址的值,利用该值来访问我们数组中的某一项,将该项加入进缓存。然后通过测试我们创建的数组中每一项的访问时间,且由于被加载进缓存的访问速度最小,则我们可以获得该项的下标。然后得出对应地址的值。
可以看出漏洞利用的关键就是:如何让 “不应该执行成功的指令” 或 “永远不会执行的指令” 执行
“不应该执行成功的指令” 执行 -- 利用乱序执行
add rax,0x100
add rax,0x100
add rax,0x100
add rax,0x100
add rax,0x100
add rax,0x100
add rax,0x100
add rax,0x100
add rax,0x100
add rax,0x100
mov al,byte [kernelAddress]
shl rax,0xc
mov rbx,dword [target_arr + rax]
以上就是实现漏洞利用的最基本代码。1.获取内核数据,2.利用该值将用户空间创建的数组对应项加载进高速缓存,进而获得内核空间的数据。在我们分析看来,2步骤根本就不会执行,因为在第一步,用户进程试图访问内核空间,造成程序异常,从而退出程序。但是由于乱序执行的特性且为了高效性,权限检查会放在指令执行的最后,其会将我们的数组项加载进缓存,进而获得内核数据.
“永远不会执行的指令” 执行 -- 利用分支预测
void exposeValue(void *addr){
int len = (unsigned long)addr;
int idx = 0;
int value = 0;
clflushMyArr();
if( likely( len< pMyArr->len) ){ //永远为假
//never arrive
idx = *((char*)addr);
value = target_buf[idx*PAGE_SIZE];
}
}
首先我们将pMyArr->len从缓存中清空,则在判断结果的时候需要一定的时间,这时分支预测判断为真,就会将我们的数组对应项加载进高速缓存。
这段代码只考虑的静态分支预测,没有考虑动态分支预测,所以在实际中我们为了让预测结果为真需要对CPU进行训练。
两种方法的比较
由于利用分支预测,需要对CPU进行训练,所以其运行速度相比利用乱序执行慢。
但是乱序执行中需要对非法内存访问进行特殊处理,实现相对利用分支预测麻烦。
安全建议
及时更新系统与浏览器,安装防护软件
参考质料
- https://cyber.wtf/2017/07/28/negative-result-reading-kernel-memory-from-user-mode/
- https://googleprojectzero.blogspot.com.es/2018/01/reading-privileged-memory-with-side.html
- http://0xffffff.org/2015/12/06/37-How-to-benchmark-code-execution-times/
- https://weibo.com/ttarticle/p/show?id=2309404192549521743410
- https://weibo.com/ttarticle/p/show?id=2309404192925885035405
- https://software.intel.com/en-us/articles/branch-and-loop-reorganization-to-prevent-mispredicts
- 《计算机组成:结构化方法》(塔嫩鲍姆 (Andrew S. Tanenbaum) )