链接:
https://pan.baidu.com/s/1FzFuPxxBPvYECvSRYqEsQg 密码: g2yi
下载后运行YuSi.exe
如果成功出现以下场景,说明你的CPU很好哦~哈哈哈哈
相信懂行的小伙伴已经猜出了这篇文章要讲啥了~
之前爆出的Intel CPU的两个漏洞,一个是spectre(幽灵),一个是meltdown(熔断),今天我们就来讲讲spectre漏洞是怎么回事~
spectre主要是针对CPU中的分支预测引起的漏洞。
现代CPU为了追求速度,采用了分支预测的策略,什么是分支预测呢?
举个栗子:
if(a>0) { password ="Yu Si"; }
这个语句就是一条分支,当a>0时执行该条指令,CPU为了快,会先根据之前的if分支情况预测这个if分支是否满足,然后提前执行该分支的代码。
一个你一看就懂的spectre攻击过程
1.进程A有一个私有变量password ="Yu Si"。
2.进程B想要获取进程A中的passWord的值,passWord的第一个字母是‘Y‘。
3.进程B构建数组array1,array2。其中,array1的大小为16,array2的大小为256,对应ASCII的数字。
4.令malicious_x = addr(‘Y‘)-addr(array1),那么array1[malicious_x] = ‘Y’就是passWord的第一个字母,但事实上没法合法访问到array1的下标malicious_x,因为数组越界了。
5.进程B中的代码:
6.步骤5中的if分支代码是为了欺骗CPU的分支预测器,进程B可以让前5次传的x都为满足if的,最后一次的x传入malicious_x,但此时CPU分支预测这个if还是满足的(因为前5次都满足),于是读array2[array1[malicious_x]]并把下标array1[malicious_x]的值传入cache中(事实上此处应该数组越界的,但CPU预执行是不检测的)。
7.CPU真的执行到这句了,但是if是false,不执行,于是程序不报错,但在步骤5中,array1[malicious_x]的值已经传到cache中了。
8.遍历array2,读取速度最快的元素,即是放到cache中的值,是array1[malicious_x],也就是passWord的第一个字母‘Y’,剩下的字母读取类似。该步骤是借助了CPU的缓存读数据速度比内存读数据快的原理,那么只要这个数据读取时间快的话就证明了这个数据在cache中,也就是我们要找的数据了,而越好的CPU中的cache读数据越快(和内存比),所以有这个漏洞的胖友们大概是CPU太好了吧(比如我
Q1:步骤5中虽然array1[malicious_x]已经放在cache中了,但我们还有测试的为了迷惑CPU分支的那些值不也进入cache了吗?
A1:因为那些值的大小都在0-15之间(array1size为16),可以用_mm_clflush函数可以将cache中的这些值(0-15)刷新掉,那么cache中只存在array1[malicious_x]。那么为啥array1[malicious_x]一定不在array1size之间呢?因为ascii的编码保证了,大家可以去看看ascii的编码,0-15位一般都不存在在字符串中。
Q2:步骤8中,具体怎么测试哪个数据更快呢?
A2:
用到了高精度的rdtscp来计时,time2是读取数据的时间,如果time2小于cache命中时间的阈值,那么认为这个数据是在cache中的。这里还硬编码了167和13进去,其实就是两个质数,目的就是让cache预读摸不着头脑,不会因为线性预读取干扰了测时。
这个是spectre的论文~论文最后有本文最开始的exe以及这篇文里出现的源代码(本文的代码是抽象出来的结果)
https://spectreattack.com/spectre.pdf
一些黑客可以利用spectre攻击来获取你的chrome存的很多密码↓
喜欢这篇文章的可以点赞加关注哦~也许下一期我们就会讲为啥spectre可以让你的chrome存的密码泄露?
下一期想要看中间人攻击还是spectre chrome可以留言告诉我哦~(挖坑无数的一个人
领取专属 10元无门槛券
私享最新 技术干货