这个故事是基于CPU的真实漏洞。
事前审查
记得我吗我是阿q,CPU一车间的阿q
由于我们车间采用了乱序执行和分支预测,生产效率大大提高领导不仅在全厂职工大会上表扬了我们,还把这两项技术推广到全厂它们分布在我们的八个CPU核心车间,我们竞争对手的CPU性能相差几个街区
可是,当我们还在陶醉于自己的成绩时,却在不知不觉中种下了灾难的种子。
事情还得从最近的一个晚上说起。
知道
那天晚上,我们一号车间遇到了这样一个代码:
uint8_tarray1=1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,uint 8 _ tarray 2,uint 8 _ ttemp = 0,void bad _ guyifx 16 tempamp,= array 2* 512),
短时间内,我们多次执行这个bad_guy函数这不是,又来了
这时,负责指令解码的小胖忍不住说:你看,我们已经执行这个函数很多次了,每次参数x都小于16这次,估计也差不多为什么不启动分支预测功能,先在小于16的分支里做一些指令呢你怎么看
我和负责数据回写的老k对视一眼,点头同意。
过了一会儿,数据终于来了:
x:2阵列1:3
不出所料,指令比较的结果是真的接下来我们就去预测分支,我们已经提前把需要的数据准备到缓存里了,节省了很多时间
就这样,我们成功预测了后续路线我们真是一群机智的朋友
遭遇滑铁卢
天气变幻莫测,很快事情就变了。
啊!结果是假的,这次X大于16在我执行了结果之后,我发现它和我们预期的不一样
a听到消息说:嗯,我们提前执行不该执行的指令不会有问题吧。
老k安慰道,没事的,我们只是提前把数据读入我们的缓存,没问题,放心吧。
我想了想,这是对的大不了我们事先做的准备工作都白费了,所以没多想就继续进行gt,16分支指令
后来同样的事情时有发生,渐渐的我们也就习惯了。
不幸降临
我们不敢耽搁,赶紧开始吧。
来到领导办公室,里面有两个陌生人,其中一个还被绑着领导皱着眉头,气氛很紧张
阿q,你知道你新发明的乱序执行和分支预测技术有大麻烦了吗。
我们几个人目瞪口呆领导,这从何说起
从领导的椅子上站起来,指着旁边的陌生人说:我来给你介绍一下这是操作系统的安全官
安全员对大家点点头,指着被绑的人说:大家好,我们抓到这个线程在读取系统内核空间的数据经过我们的初步审查,他交待了这个目的是通过你CPU的乱序执行和分支预测功能达到的
我和小A都满脑子问号我们两个提高工作效率的技术怎么会泄露系统内核数据
这个案子已经完全澄清了。
显然,安全员看出了我们的疑惑,指着绑好的线说:请告诉我你之前跟我说的话。
几位爷爷,你们之前遇到过分支预测失败的情况吗那个人抬头看着我们
是的,这跟它有什么关系失败很正常既然是预测,就不能100%保证预测一定正确,我回答
你是对的,但如果我是故意策划这次失败的呢。
他说这话的时候,我的心悬了起来纳尼,是你干的吗
是的,就是我第一,我故意连续多次给你小于16的参数,误导你以为后面的参数还是小于16的然后突然来了一个特别构造的大于16的参数你真的上钩了,没能预测到,提前执行了一些不该执行的指令
那又怎么样我们只是把后面需要的数据提前准备到缓存里,并没有进一步做什么我还是不太明白
够了!
你小子被绑了,别吊你胃口,马上说清楚心急的老k没办法
好了好了,我会交代的您提前准备了缓存中的数据当我后来去访问这部分数据时,我发现这比访问其他内存要快得多
那不是真的,我们的缓存技术不是吹牛!等等,它怎么又在缓存上了。,老k继续说道:
这个人继续说,如果我想知道一个地址单元中的值,我会用它作为数组的偏移量来访问一个内存区域使用可以提前预测执行并缓存数据的机制虽然您的预测失败了,但是相应的数据已经在缓存中了然后,我会依次访问那块内存,看谁的访问时间明显比其他部分短,然后就知道哪个块被缓存了然后我会知道偏移量的值是多少按照这个思路,我可以知道每个地址单元的内容
我们听了,想了很久,终于搞清楚了这家伙的套路老k气得差点想修理那个人
嗯,你这家伙,倒是挺聪明的,不过可惜你没有走上正道!好的加速优化机制,却成了你的帮凶,心里充满了愤怒。
迟做比不做好
事情的真相终于被澄清了,我们几个人此刻都是汗流浃背。
在咨询了安全官之后,操作系统引入了一种全新的KPTI技术来解决这个问题,那就是内核页表隔离。
以前用户态和内核态的线程执行都是用同一个地址翻译手册,叫做页表通过这本手册,我们的CPU可以通过虚拟地址找到真正的内存页面
现在,让线程使用不同的手册在用户模式和内核模式下运行在用户态线程的手册中,内核地址空间是空白的
我以为我们可以回去了,没想到领导给我们出了个难题这场灾难是你造成的别人的操作系统虽然被保护了,难道不应该做点什么吗不然以后我们的CPU怎么撑得住头
你有什么好主意吗。帮帮我们!
在后台
这篇文章描述了两年前爆发的著名的CPU熔断和ghost漏洞。
无序执行和分支预测是现代处理器中常用的优化机制与传统的软件漏洞不同,硬件级漏洞影响更大,修复难度更大
通过判断存储器的访问速度,可以知道存储器是否被缓存这种技术有一个专门的术语叫旁支渠道,就是对一些场外信息进行分析得出重要结论,然后达到正常渠道达不到的目的
特别鸣谢:网友提供的技术支持。
声明:本网转发此文章,旨在为读者提供更多信息资讯,所涉内容不构成投资、消费建议。文章事实如有疑问,请与有关方核实,文章观点非本网观点,仅供读者参考。