翻开最近的新闻,总少不了CPU内核高危漏洞的报道,其影响之大,修复之难,从电脑被发明以来还是首次。这个漏洞为什么这么厉害?
一、漏洞有多可怕?
近日,国外相关安全研究机构公布了CPU内核高危漏洞Meltdown(熔断)和Spectre(幽灵)。利用这两组漏洞,攻击者可绕过内存访问的安全隔离机制,获取操作系统和其他程序保护的核心数据,造成敏感信息泄露
这两组漏洞,相当于在一座大厦的地基上出现了严重的安全隐患,允许任何人随意进出大夏的每个房间、每个角落,而且还可以拿到房间里值钱的东西。要修复起来,不仅地基要重新设计,上面的每个楼层,都要加上防护措施。这座大厦有多大?大到包括全球几乎所有的手机、电脑甚至物联网设备。特别在云场景下,不同的用户可能共享同一个物理主机,云厂商对用户做了资源隔离,防止用户访问不属于自己的资源和信息,而这两组漏洞正好允许攻击者突破这种隔离。
漏洞引起的危害如此严重,影响范围如此广大,一经公布,立即引起了全世界的瞩目,被媒体称为史上最大的安全漏洞。
二、漏洞怎么产生的?
这两组漏洞,都利用了CPU乱序执行和预测执行的机制。采用预测执行和乱序执行,目的是提升CPU的运算速度。而漏洞的产生则都拜预测执行所赐。
乱序执行,顾名思义,就是指令的执行是没有顺序的。每条指令执行时间差异是很大的,就跟吃饭一样,有人5分钟搞定,有人1小时还没吃完。假设吃饭要按顺序来,那如果吃饭时间长的人一直没结束,后面的人就得饿着肚子等待。这显然不可能,所以CPU都采用乱序执行,就是大家自己找个位置,自己吃,互不干扰。
预测执行,也如其名,就是根据你平常的操作,预测你后面要干什么,CPU就帮你干了。预测错了呢?正常的设想,肯定是指令取消掉就行。但问题就出在这里。错误指令虽然取消了,但会留下缓存。而缓存的最大特点,就是曾经存过什么数据,这些数据后续访问就会变快。利用这个特点,攻击者可以“骗”处理器把目标数据,比如账号密码读入缓存中,然后遍历一个外部数组,根据读取速度的快慢来推导出读入缓存的数据值。
鉴于漏洞的技术分析需要计算机、代码等知识,比较复杂,感兴趣的同学可阅读文末的附录。
三、华为云安全提供立体的防御手段
该漏洞出现在电子世界的地基上,但地基的修复是很困难的,有待于CPU厂商的设计和更新。因此,目前主要的修复方案是修复地基上层的建筑,比如云平台操作系统、用户虚拟机操作系统。漏洞虽然产生了世界性的影响,但对用户来说,大可不必过于惶恐。
首先,华为云安全一直在与CPU厂商们积极沟通合作,不断分析和尝试给出更好的底层修复方案,以期彻底解决该漏洞。
其次,从云平台来说,包括华为云在内的各云厂商,都已启动了底层基础架构的修复更新。华为云安全已于1月4日发布公告,将于1月11日0时启动基础平台安全升级,方式为对用户无感知的热升级,正常情况下对用户业务无影响。
再次,对用户而言,漏洞原理及利用代码虽已公开,但要在真实的云环境下利用起来,是非常复杂和困难的。而且华为云安全推出了漏洞消减服务,可帮助用户对漏洞可能造成的威胁进行检测及防御。
最后,包括华为云在内的各大云厂商,日常最重要的工作之一,即是例行地检测和阻断各种针对云的攻击,保障云环境的安全稳定。华为云安全并配备了强大的专家团队,随时响应可能的安全事件。此次高危漏洞的爆发,华为云更加强了检测和防护力度,安全专家7*24小时轮班值守。截止目前,尚未发现可在真实环境下攻击成功,并造成明显损失的漏洞利用代码。
四、华为云安全与用户同承担、共进退
这两组漏洞,危害之大,修复之难,前所未有。可以预见,未来一段时间,仍将是业界关注的热点,但不管如何,华为云安全都坚定地站在用户身边,同承担、共进退,持续对漏洞进行跟踪、分析、研究,不断推出更好的防护方案和服务,帮助用户防护好业务数据。
***
附录:漏洞技术分析
1、Meltdown漏洞分析
Meltdown对应漏洞库编号为:CVE-2017-5754。结合业界公开的漏洞利用代码,分析如下:
1、此段代码运行在CPU用户态模式下(cpl=3),且ptr指向一个内核地址空间的地址。
2、CPU在执行指令2时,会首先把数据读取到缓存中(这时还没有进行权限检查)。
3、由于CPU的乱序执行特性,执行步骤2的同时,后面几条指令也被会执行,且指令3和指令5的计算操作是根据 指令2读取到的数据 执行的。
4、当CPU对指令2进行权限检查时会发生一个访问异常,之后执行的两条指令的操作状态会发生回滚,但Cache、TLB没有回滚,这样就绕过了CPU的权限检查机制。
5、可以利用边信道攻击来探测哪些页面被访问过,结合特定的代码场景,就可以推测出内核地址空间中的内容了。
2、Spectre漏洞分析
Spectre,对应漏洞库编号:CVE-2017-5753/CVE-2017-5715。
1、正常情况下,当offset 大于array1->length时,下面的代码永远不会执行。
2、如果array1->length没有被缓存,由于CPU分支预测的特性,CPU当前指令流水线会等待缓存加载完成,同时在另外一条指令流水线上,下一条指令“value = array1->data[offset]”会被预测执行。
3、一旦发现offset大于array1->length,预测执行的指令和结果将会被丢弃并加载正确的指令重新处理。
4、当array1->length和array2->length没有被缓存时,exploit可以分别读取 array2->data 0x200和0x300偏移处的数据,通过比较两次访问的用时,就可推断执行的是哪条指令,从而推断出value的低位值,而这个value正是上面越界读取到的值,这样就可以泄露任意内核地址空间的一位,这当然就可以构造出能读取更多内存地址的exploit了。通常访问用时更短的,说明数据已经被加载到了缓存,这也意味着分支指令被预测执行到了。