【原创】深度剖析“芯片漏洞” ---决不是一家公司问题,需要产业协作来解决

CDM 提交于 周五, 01/12/2018
【原创】深度剖析“芯片漏洞” ---决不是一家公司问题,需要产业协作来解决

2018年1月初,科技媒体The Register发表文章《Kernel-memory-leaking Intel processor design flaw forces Linux, Windows redesign》报道了一个芯片级漏洞问题--称为“熔断”(Meltdown)和“幽灵”(Spectre),由此一场CPU安全恐慌席卷全球,英特尔X86处理器、AMD CPU、ARM处理器、苹果处理器、高通处理器都等不能幸免,今天,英伟达称其GeForce、Tesla、Grid、NVS和Quadro系列GPU产品也受“幽灵”漏洞的影响,英伟达通过博客表示,该公司正在提供初步的安全升级补丁,以提升受影响芯片的安全,至此,几乎全球所有处理器都被漏洞影响,其实这个漏洞不是现在才有,它早已存在,而且它不是一家处理器的问题,是整个产业面临的挑战,需要产业协作来解决,“行业都在悬崖边跳舞,赌的就是安全边界。”一位业内资深处理器顶级专家这样评论CPU漏洞,“现在还难以评价其影响。”

一、为什么会有这个芯片漏洞?

可能很多人会问全球有那么多的顶级处理器专家,为什么会有这个漏洞?要回答这个问题,我们可以追根溯源,了解下处理器的最基本架构。

总体而言,目前几乎全球所有CPU处理器基本上采用以下两个架构冯诺依曼和哈佛架构:

1.冯·诺依曼结构,又称为普林斯顿体系结构,是一种将程序指令存储器数据存储器合并在一起的存储器结构。取指令和取操作数都在同一总线上,通过分时复用的方式进行;缺点是在高速运行时,不能达到同时取指令和取操作数,从而形成了传输过程的瓶颈。由于程序指令存储地址和数据存储地址指向同一个存储器的不同物理位置,因此程序指令和数据的宽度相同,如英特尔公司的8086中央处理器的程序指令和数据都是16位宽。

1

使用冯·诺依曼结构的CPU和微控制器有很多。其中包括英特尔公司的CPU和TI的MSP430处理器,ARM公司的ARM7,MIPS公司的MIPS处理器等。

2. 哈佛结构

哈佛结构是一种将程序指令存储和数据存储分开的存储器结构,它的主要特点是将程序和数据存储在不同的存储空间中,即程序存储器和数据存储器是两个独立的存储器,每个存储器独立编址、独立访问,目的是为了减轻程序运行时的访存瓶颈。它的执行效率比较高,其程序指令和数据指令分开组织和存储的,执行时可以预先读取下一条指令。

 

23

 

哈佛结构和冯诺依曼结构主要区别在是否区分指令与数据。实际上在内存里,指令和数据是在一起的。而在CPU内的缓存中,还是会区分指令缓存和数据缓存,最终执行的时候,指令和数据是从两个不同的地方出来的。你可以理解为在CPU外部,采用的是冯诺依曼模型,而在CPU内部用的是哈佛结构。大部分的DSP都没有缓存,因而直接就是哈佛结构。哈佛结构设计复杂,但效率高。冯诺依曼结构则比较简单,但也比较慢。

但冯·诺依曼结构有个致命的缺陷,就是CPU和内存之间的数据读取差异问题,实际上,自从CPU诞生诞生那天起,就存在CPU读取数据速度和内存带宽之间不匹配矛盾,即使CPU速度再快,也要等内存,因为CPU在执行命令时必须先从存储单元中读取数据。每一项任务,如果有十个步骤,那么CPU会依次进行十次读取,执行,再读取,再执行... 这就造成了延时,以及大量功耗(80%)花费在了数据读取上,当然多核、多CPU或一些常用数据的就地存储会一定程度上缓解这些问题,但这种中心处理的架构会限制处理能力的进一步发展,好比诺大个北京城,如果所有的政治、经济、文化活动都集中在市中心,为了生活,人们必须穿城而过,任你路修到二十环,还是一个词,堵死。

上段文字摘自知乎,作者:硅谷密探,链接:https://www.zhihu.com/question/25979825/answer/151415508)

可以说自CPU诞生起就在解决CPU和内存之间的速度矛盾,虽然内存读取速度不断提升但是CPU的主频在提升,两者之间还是有矛盾,怎么解决,以前靠增加一级缓存,二级缓存,甚至三级缓存来解决,后来,有个人想到一个好主意。

“熔断”和“幽灵”的原理

4

Image removed.

上面说到CPU和内存的矛盾,忽然有一天,一个天才想到一个解决办法----我们可以让CPU不一条条来执行程序啊,不用排队了,这样效率不是更高了吗? 这就是乱序执行(out-of-order execution)的来由,它是指CPU采用了允许将多条指令不按程序规定的顺序分开发送给各相应电路单元处理的技术。CPU会根据各单元电路的空闲状态和各指令能否提前执行的具体情况分析后,将能提前执行的指令立即发送给相应电路执行。

Image removed.

5

这好比请A、B、C三个名人为晚会题写横幅“春节联欢晚会”六个大字,每人各写两个字。如果这时在一张大纸上按顺序由A写好"春节"后再交给B写"联欢",然后再由C写"晚会",那么这样在A写的时候,B和C必须等待,而在B写的时候C仍然要等待而A已经没事了。

但如果采用三个人分别用三张纸同时写的做法, 那么B和C都不必须等待就可以同时各写各的了,甚至C和B还可以比A先写好也没关系(就象乱序执行),但当他们都写完后就必须重新在横幅上(自然可以由别人做,就象CPU中乱序执行后的重新排列单元)按"春节联欢晚会"的顺序排好才能挂出去。

乱序执行确实大大提升了CPU的效率,除了乱序执行,开发人员还开发了预测执行(SpeculativePrediction)机制来提升CPU效率。预测执行依托于分枝预测基础,在分枝预测程序是否分枝后所进行的处理也就是推测执行。

由于程序中的条件分枝是根据程序指令在流水线处理后结果再执行的,所以当CPU等待指令结果时,流水线的前级电路也处于空闲状态等待分枝指令,这样必然出现时钟周期的浪费。如果CPU能在前条指令结果出来之前就能预测到分枝是否转移,那么就可以提前执行相应的指令,这样就避免了流水线的空闲等待,相应也就提高了CPU的运算速度。

这就好象在外科手术中,一个熟练的护士可以根据手术进展情况来判断医生的需要(象分枝预测)提前将手术器械拿在手上(象推测执行)然后按医生要求递给他,这样可以避免等医生说出要什么,再由护士拿起递给他(医生)的等待时间。当然如果护士判断错误,也必须要放下预先拿的器械再重新拿医生需要的递过去。尽管如此,只要护士经验丰富,判断准确率高,那么当然就可以提高手术进行速度。

这两个技术大大提升了CPU的执行效率(我们看到的就是CPU运算速度提升了),从奔腾处理器就开始采用这个技术,其他ARM架构高级处理器也采用了乱序执行等机制,所以同样中招,这两个技术导致了今天的这两个漏洞。

因为乱序执行和预测执行在遇到异常或发现分支预测错误时,CPU会丢弃之前执行的结果,将 CPU的状态恢复到乱序执行或预测执行前的正确状态,然后选择对应正确的指令继续执行。这种异常处理机制保证了程序能够正确的执行,但是问题在于,CPU恢复状态时并不会恢复CPU缓存的内容,而这两组漏洞正是利用了这一设计上的缺陷进行测信道攻击。

所以这样的提升是有代价的,代价就是安全!可能大家都知道这个隐患,但是期盼黑客发现不了。

漏洞原理解析

1、Meltdown漏洞原理

乱序执行可以简单的分为三个阶段,如下图所示:

Image removed.

6

每个阶段执行的操作如下:

1)获取指令,解码后存放到执行缓冲区Reservations Stations

2)乱序执行指令,结果保存在一个结果序列中

3)退休期Retired Circle,重新排列结果序列及安全检查(如地址访问的权限检查),提交结果到寄存器

结合Meltdown利用的代码片段来看:

; rcx = kernel address

; rbx = probe array

1 mov al, byte [rcx]

2 shl rax, 0xc

3 mov rbx, qword [rbx + rax]

Meltdown漏洞的利用过程有4个步骤:

1)指令获取解码

2)乱序执行3条指令,指令2和指令3要等指令1中的读取内存地址的内容完成后才开始执行,指令3会将要访问的rbx数组元素所在的页加载到CPU Cache中。

3)对2)的结果进行重新排列,对1-3条指令进行安全检测,发现访问违例,会丢弃当前执行的所有结果,恢复CPU状态到乱序执行之前的状态,但是并不会恢复CPU Cache的状态

4)通过缓存测信道攻击,可以知道哪一个数组元素被访问过,也即对应的内存页存放在CPU Cache中,从而推测出内核地址的内容

2、Spectre漏洞原理

与Meltdown类似,Spectre的原理是,当CPU发现分支预测错误时会丢弃分支执行的结果,恢复CPU的状态,但是不会恢复CPU Cache的状态,利用这一点可以突破进程间的访问限制(如浏览器沙箱)获取其他进程的数据。Spectre的利用代码片段:

if (x < array1_size) {

y = array2[array1[x] * 256];

// do something using Y that is

// observable when speculatively executed

}

具体攻击过程可以分为三个阶段:

1)训练CPU的分支预测单元使其在运行利用代码时会进行特定的预测执行

2)预测执行使得CPU将要访问的地址的内容读取到CPU Cache中

3) 通过缓存测信道攻击,可以知道哪一个数组元素被访问过,也即对应的内存页存放在CPU Cache中,从而推测出地址的内容。

这就是漏洞的原理(部分内容来自腾讯安全联合实验室),但是这个漏洞去年年初就发现了

当时Google旗下的Project Zero团队发现了一些由CPU Speculative Execution引发的芯片级漏洞,“Spectre”(变体1和变体2:CVE-2017-5753和CVE-2017-5715)和“Meltdown”(变体3:CVE-2017-5754),可以说这三个漏洞都是先天性质的架构设计缺陷导致的,可以让非特权用户访问到系统内存从而读取敏感信息。

为什么GPU也中招?

有人说CPU这样的架构导致了漏洞,为啥NV的GPU也中招了? 让我们先看看GPU的架构。

7

从架构图我们就能很明显的看出,GPU的构成相对简单,有数量众多的计算单元和超长的流水线,特别适合处理大量的类型统一的数据。但GPU无法单独工作,必须由CPU进行控制调用才能工作。CPU可单独作用,处理复杂的逻辑运算和不同的数据类型,但当需要大量的处理类型统一的数据时,则可调用GPU进行并行计算。

注:GPU中有很多的运算器ALU和很少的缓存cache,缓存的目的不是保存后面需要访问的数据的,这点和CPU不同,而是为线程thread提高服务的。如果有很多线程需要访问同一个相同的数据,缓存会合并这些访问,然后再去访问DRAM。

8

对于NV的GPU ,SM(Streaming Multiprocessors)是GPU架构中非常重要的部分,GPU硬件的并行性就是由SM决定的GPU中每个SM都设计成支持数以百计的线程并行执行,并且每个GPU都包含了很多的SM,所以GPU支持成百上千的线程并行执行,当一个kernel启动后,thread会被分配到这些SM中执行。大量的thread可能会被分配到不同的SM,但是同一个block中的thread必然在同一个SM中并行执行。

CUDA采用Single Instruction Multiple Thread(SIMT)的架构来管理和执行thread,这些thread以32个为单位组成一个单元,称作warps。warp中所有线程并行的执行相同的指令。每个thread拥有它自己的instruction address counter和状态寄存器,并且用该线程自己的数据执行指令。并行thread之间的共享数据回导致竞态:多个线程请求同一个数据会导致未定义行为。CUDA提供了API来同步同一个block的thread以保证在进行下一步处理之前,所有thread都到达某个时间点。同一个warp中的thread可以以任意顺序执行,active warps被SM资源限制。当一个warp空闲时,SM就可以调度驻留在该SM中另一个可用warp。在并发的warp之间切换是没什么消耗的,因为硬件资源早就被分配到所有thread和block,所以该新调度的warp的状态已经存储在SM中了。

可见GPU也有类似CPU的调度机制,这样的机制也存在安全风险,因此GPU也同样中招。

CPU漏洞需要全行业协同解决

2017年6月,谷歌Project Zero安全团队的一名成员向英特尔和其他芯片生产商告知了这些漏洞的情况。之后,以英特尔为首的芯片生产商及其客户、合作伙伴,包括苹果、Alphabet Inc.旗下谷歌、亚马逊公司和微软等,都已在加紧解决这一问题,一个由大型科技公司组成的联盟正展开合作,保护其服务器,并向客户的电脑和智能手机发送补丁,这个问题搞了半年多,直到科技媒体The Register发表文披露了两个漏洞!

所以,这不是一家公司的问题,这是所有处理器厂商面临的难题,需要产业协同来解决。在刚刚开幕的CES上,英特尔公司CEO科再奇再次表示:“我们今天齐聚这里,共同庆祝这个行业的年度盛会——确切地说,那就是创新。但在我们开始之前,我想借此机会感谢整个行业,为了另外一个目标走到一起,共同应对近期被报道称为‘熔断’(Meltdown)和‘幽灵’(Spectre)的安全研究发现。”“如此多的公司携起手来共同应对这个涉及整个行业、跨越多个不同处理器架构的安全问题,这确实很了不起。安全是英特尔和整个行业的第一要务。因此,我们的决策和讨论的主要焦点,一直是如何保护我们的用户的数据安全。”

 

9

“关于我们的处理器,在一周内,英特尔发布的更新预计将覆盖过去5年内推出的90%以上的产品,而针对其它产品的更新将在今年一月底前发布。我们相信,这些安全更新对性能的影响在很大程度上取决于具体的工作负载。我们预计某些工作负载相对其它来说受到的影响会更大一些,我们将继续与整个产业界一起协作,逐渐把对这些工作负载所带来的影响减少到最低。”

10

这一次,面对处理器这个安全大挑战,全球半导体业者都走在一起了! 相信一定可以解决这个难题!

该发布文章为独家原创文章,转载请注明来源。对于未经许可的复制和不符合要求的转载我们将保留依法追究法律责任的权利。