启明星辰ADLab:CPU“幽灵”漏洞分析与验证

发布时间 2018-01-08

1 前 言

        近日,CPU底层漏洞安全事件已经波及全球几乎所有的手机、电脑、云计算产品。这次的漏洞分别起名Meltdown(崩溃)和Spectre(幽灵)。这两个漏洞可能会造成受保护的密码、敏感信息泄露。

        启明星辰ADLab在三大操作系统(windows、macos、linux),验证设备(包括个人台式电脑、笔记本及服务器设备)上完成了“幽灵”漏洞验证工作。

        本文重点对“幽灵”漏洞的漏洞的原理、漏洞验证、危害及防护进行介绍。

2 漏洞原理

        由于高速CPU和低速内存之间的I/O瓶颈,现代处理器会利用流水线技术提高性能,通过预测下一步要执行的指令并提前把这些指令放在流水线上,以提高速度。但是如果程序有分支跳转的话,这些流水线上的预取的指令将全部作废, CPU需要清空所有的指令, 然后加载命中地址的指令,再将后续指令加载运行。

        如果程序有10个分支的话,那么流水线上预取的指令只有很低的概率(1/10)会命中。因此CPU需要一种预测技术来提高流水线预取指令的命中率,这一技术被称为CPU分支预测技术。

        CPU分支预测技术由CPU对历史指令的执行情况进行动态分析和学习,并进行预测。在高性能计算机中,CPU分支预测的成功概率在95%~98%之间,这大大提高了计算机的运算性能。Intel公司在1995年奔腾系列CPU起就已经采用CPU流水线及分支预测技术,目前主流的高性能CPU都采用这些技术。

        如果CPU分支预测的执行路径不正确,其后在流水线上误判并预取的指令最终并不会实际执行,但是为了提高性能的需要,流水线执行结束后并没有对所有预判执行的现场做完全回滚,TLB或缓存状态并没有被回滚,这就引入了安全问题。

        在计算机系统中缓存是CPU在执行程序运行时共享的区域,攻击者通过旁路攻击(Side Channel Attack)的方式获取到缓存的内容。

        如果攻击者能触发利用执行去访问指定的敏感数据区域的话,就可能读取到原本是其它用户或更高特权的敏感数据。

        更进一步的CPU分支预测的过程是可以被普通权限的恶意程序影响的,攻击者可以构造出类似ROP(Return-oriented Programming)攻击的逻辑去影响CPU的分支预测过程。 

        利用该漏洞可以有以下三种攻击场景: 

        CVE-2017-5753(绕过内存隔离边界检查):通过恶意代码污染分支预测,来绕过内核或虚拟机的内存对象边界检测。比如通过构造的恶意代码来触发有越界的数据下标,造成内存越界访问,由于这个访问操作是由CPU自己完成的,内核或虚拟机的防护无法起到作用。

        CVE-2017-5715(分支目标注入): 污染分支预测。在大型软件系统如浏览器等软件,高度抽象模型的代码中往往带有间接函数指针调用的情况,CPU在处理时需要进行必要的函数指针访问,为了提高I/O性能,CPU会进行分支预测,这样的话攻击者可以通过类似的ROP的方式来进行信息泄露函数指针,从而绕过地址随机化的防护。

        “恶意数据加载”:在部分CPU上,为了提高性能,并不是每次都对指令作权限检查的,检查的条件存在一定的缺陷,使得恶意的数据可以被加载到受保护的区域。

3 漏洞验证

        谷歌公司Project Zero安全团队近日公开了幽灵漏洞的POC(概念验证程序),参考链接:https://googleprojectzero.blogspot.com/2018/01/reading-privileged-memory-with-side.html。

        POC演示了将一段机密文字"The Magic Words are Squeamish Ossifrage." 放在内存中,并通过漏洞利用旁路分析的方式从缓存中猜测出了该段文字的内容。

        POC的攻击主要分三个步骤,分别是触发CPU进行分支预测,影响CPU的分支预测误判,探测缓存数据获取敏感数据。

        攻击主要由readMemoryByte函数完成。readMemoryByte函数首先多次调用victim_function这样会触发CPU分支预测技术,CPU分支预测技术认为针对x参数的地址访问,在下一次调用时可能是有效的值,所以CPU会提前将array1[x]的值准备在缓存中。

        然后,readMemoryByte函数向victim_function传入一个越界范围的x值参数,这时候CPU分支预测技术将会产生误判,然后程序通过访问array2[array1[x] * 512]这段地址范围的内容,将array1[x]的内容泄漏在缓存中。

        最后,我们可以使用简单的缓存刷新和缓存数据探测技术,猜测array2数组加载在缓存cache line中的值,从而读取机密文字的内容。在POC中,采用了计算内存访问指令的执行时间来测试是否命中缓存(如果命中缓存,则指令执行时间会比较短),从而判断是否成功读取到机密文字。

        在POC中机密文字最初并没有出现在缓存里,但是攻击过程的第一轮的迭代就把目标地址泄漏在缓存中,所以攻击过程可以被多次调用,从而读取到机密文字的全部内容。

3.1 验证结果

        我们分别在三台计算机上对漏洞进行了验证,这三台计算机的CPU分别是Intel的i5-3317U、i5-7360U、i7-4790K处理器,操作系统分别是Mac、linux、windows。

3.1.1 实验1

        操作系统:MACOSX Yosemite 版本10.10.5

        处理器名称:  Intel Core i5-3317U 1.7 G*2

3.1.2  实验2

        测试环境:   ubuntu 16.04 LTS  

        内核版本 4.10.0-42 64位  

        处理器型号:intel core i5-7360U cpu 2.30GHZ*4

3.1.3 实验3

          操作系统:win10

          CPU型号:intel core i7-4790K cpu 4.00GHZ*4

4 幽灵漏洞的影响和危害

        幽灵漏洞影响到几乎所有的操作系统及计算机设备。

        由于幽灵漏洞起因于CPU分支预测技术的缺陷,该技术在1995年起就一直是高性能CPU标配的技术。目前主流安全技术所采用的进程隔离,用户空间和内核地址隔离,多租户的虚拟隔离防护技术及沙箱隔离技术在这一漏洞下全部失效。

        幽灵漏洞对多租户下的云服务体系影响比较大,攻击者在云平台通过本地的普通的访问权限就可以读取云平台的敏感信息,为进一步获得更高的权限和获得机密数据提供了可能。

        该漏洞的危害还在于攻击者可以通过该漏洞远程发起攻击,当目标设备访问远程服务器的网页时,攻击者可以通过恶意js脚本来获得目标设备上的敏感信息,如保存在内存中的密码Cookie等。  

        幽灵漏洞受影响的处理器不仅包括intel,高通,AMD,ARM等厂家,下表为已知的受影响的intel处理器列表(数据来自intel官网):

  • Intel Core i3 processor (45nm and 32nm)
  • Intel Core i5 processor (45nm and 32nm)
  • Intel Core i7 processor (45nm and 32nm)
  • Intel Core M processor family (45nm and 32nm)
  • 2nd generation Intel Core processors
  • 3rd generation Intel Core processors
  • 4th generation Intel Core processors
  • 5th generation Intel Core processors
  • 6th generation Intel Core processors
  • 7th generation Intel Core processors
  • 8th generation Intel Core processors
  • Intel Core X-series Processor Family for Intel X99 platforms
  • Intel Core X-series Processor Family for Intel X299 platforms
  • Intel Xeon processor 3400 series
  • Intel Xeon processor 3600 series
  • Intel Xeon processor 5500 series
  • Intel Xeon processor 5600 series
  • Intel Xeon processor 6500 series
  • Intel Xeon processor 7500 series
  • Intel Xeon Processor E3 Family
  • Intel Xeon Processor E3 v2 Family
  • Intel Xeon Processor E3 v3 Family
  • Intel Xeon Processor E3 v4 Family
  • Intel Xeon Processor E3 v5 Family
  • Intel Xeon Processor E3 v6 Family
  • Intel Xeon Processor E5 Family
  • Intel Xeon Processor E5 v2 Family
  • Intel Xeon Processor E5 v3 Family
  • Intel Xeon Processor E5 v4 Family
  • Intel Xeon Processor E7 Family
  • Intel Xeon Processor E7 v2 Family
  • Intel Xeon Processor E7 v3 Family
  • Intel Xeon Processor E7 v4 Family
  • Intel Xeon Processor Scalable Family
  • Intel Xeon Phi Processor 3200, 5200, 7200 Series
  • Intel Atom Processor C Series
  • Intel Atom Processor E Series
  • Intel Atom Processor A Series
  • Intel Atom Processor x3 Series
  • Intel Atom Processor Z Series
  • Intel Celeron Processor J Series
  • Intel Celeron Processor N Series
  • Intel Pentium Processor J Series
  • Intel Pentium Processor N Series
  • 5 漏洞的防护

    1.敏感数据访问和运算尽可能在独立的安全芯片上运行,使得普通权限的执行环境和高权限的执行环境在物理上隔离,从而避免敏感信息泄漏。

    2.及时升级补丁,特别是公有云平台。由于云服务体系的庞大、复杂,云服务厂家应尽早地进行漏洞修补,避免关键数据和隐私的泄露、登陆凭证被窃取导致连锁攻击等次生灾害。

    3.目前基于软件补丁只是做了临时隔离,如TLB隔离等,但是未来将会有一些绕过技术会出现,更换硬件才是彻底修复这个问题的关键。

    4.在软硬件设计方面,开发者需要考虑性能和安全性之间取得平衡。