欢迎来到 嗅灵易学

零基础也能上手的脚本技术课,一对一答疑带你入门

[原创]谈谈幽灵和熔断两兄弟

[原创]谈谈幽灵和熔断两兄弟

最近爆出的CPU漏洞引起业内外人士一片哗然,其影响之广,危害之大相信各位都已了解。我就谈一谈自己对这两个漏洞的理解吧。

先来补补基础知识,其实全部是维基上抄的。

概念:

0x00 乱序执行

在计算机工程领域,乱序执行(错序执行,英语:out-of-order execution,简称OoOE或OOE)是一种应用在高性能微处理器中来利用指令周期以避免特定类型的延迟消耗的范式。在这种范式中,处理器在一个由输入数据可用性所决定的顺序中执行指令,而不是由程序的原始数据所决定。在这种方式下,可以避免因为获取下一条程序指令所引起的处理器等待,取而代之的处理下一条可以立即执行的指令。    


0x01 分支预测

分支预测器(英语:Branch predictor)是一种数字电路,在分支指令执行结束之前猜测哪一路分支将会被运行,以提高处理器的指令流水线的性能。使用分支预测器的目的,在于改善指令管线化的流程。现代使用指令管线化处理器的性能能够提高,分支预测器对于现今的指令流水线微处理器获得高性能是非常关键的技术。


0x02 数据缓存

CPU高速缓存(英语:CPU Cache,在本文中简称缓存)是用于减少处理器访问内存所需平均时间的部件。在金字塔式存储体系中它位于自顶向下的第二层,仅次于CPU寄存器。其容量远小于内存,但速度却可以接近处理器的频率。当处理器发出内存访问请求时,会先查看缓存内是否有请求数据。如果存在(命中),则不经访问内存直接返回该数据;如果不存在(失效),则要先把内存中的相应数据载入缓存,再将其返回处理器。


幽灵(spectre)

上边提到cpu在执行指令的时候会进行分支预测,简单来说,就是cpu在执行一个逻辑判断的时候会进行提前预测改走哪个逻辑,然后选择其中它正确的逻辑,并将其所需要的数据加入缓存中。

这样,我们看一个例子。


一般来说,如果data[untrusted_opffset_from_caller]越界,程序就会失败。但是cpu有一个预测执行的特性,如果arr1->length不在缓存之中,并且之前这个逻辑多次进入的情况下,cpu就判断if语句是真的,然后先将下一步指令所需要的内存存储到缓存之中(此时不对访问数据是否允许进行判断)。假如发现预测错误,然后回滚指令就可以了。但是这时,cpu缓存并没有清空,而spectre正是利用了这一点来获取非法内存的内容的。

1)spectre构造一个训练集,使cpu不断地进入以下的逻辑。此时这是一个很正常的逻辑,x为一个小于array1_size的值。多次训练之后,cpu自作聪明的认为,哦,这就是一个正常的逻辑,那我为了加快执行速度就在判断的时候我将下条指令的所需的内存填入缓存吧。但是,此时CPU不对这个内存的地址是否合法进行判断!只有在执行到它的时候才判断对错,并且,上层预测执行如果预测失败,cpu会回滚指令,但是不去清除这里的缓存。

if (x < array1_size)

{

    temp &= array2[array1[x] * 512];

}

注意:上传附件及图片大小不得大于30M。

⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。

0 0 0 举报
复制成功