2018-01-31 12:35:555276人阅读
Yue qiang Cheng, Yulong Zhang, Chenfu Bao, Zhaofeng Chen, Yu Ding, Tao Wei
Baidu X-Lab, Jan 30, 2018
1. 引言
在上一篇中 [1],我们主要介绍了Meltdown和Spectre的原理,以及其在Intel平台下的攻击及缓解措施。本文主要关注 Meltdown和Spectre对于ARM平台的影响,重点讲述与Intel平台的不同的地方。
ARM上面的攻击,Spectre(V1和V2)攻击的潜在威胁仍在,不能忽视。由于应用程序之间(例如Android平台上)有强大的互相调用能力,本地运行的恶意软件有可能通过V1/V2攻击绕过沙箱机制,获取属于其他程序的敏感数据。对于Meltdown(即V3)攻击,目前市面上所有的ARM设备并不受影响。然而,新的V3变种(命名为V3a)可以获取高特权级(例如VMM和内核)的寄存器信息,其威胁不可忽视。目前没有完整的解决方案来很好的缓解V3a攻击。浏览器攻击场景(A2w/A3w)威胁仍在,目前仅有一些临时的缓解方案 [8],希望相关厂商尽快给出全面的有效的解决方案。
2. ARM平台上的攻击防御和缓解
针对上一篇中提到的各种攻击场景,我们将ARM平台上所有的攻击和解决方案归纳总结到表1里面。表中的V1/V2及A1/A2/A3/A2w/A3w定义与前文[1] 一致。但需要注意的是ARM官方特别区分了V3中对高权限系统寄存器的攻击(标记为V3a),并且绝大多数ARM芯片(已知只有Cortex-A75受影响,但相关芯片还未发售)都没有普通的V3问题,因此我们在表中删除了V3,新加了V3a。在ARM平台上面,EL0/PL0指用户空间,EL0/PL1/SVC指内核空间,EL2/PL2/HYP指虚拟机监控器空间。
表1:对ARM平台的攻击评估和防御方法。浏览器攻防(A2w/A3w)的解决方案均为临时解决方案[8],希望相关 厂商尽快发布更加全面有效的解决方案。
对Android的影响
三星等Android厂商在内核下面增加了一个虚拟机管理器 [5],用于提供内核实时完整性保护等安全能力。由于该虚拟机管理器功能单一,只是负责安全管理,并不支持多个虚拟机切换调度和资源管理,因此体量一般非常小。虽然理论上本地攻击者可以通过V1/V2发起针对虚拟机管理器的A1攻击,但由于虚拟机管理器的体量小,其二进制代码里具备符合条件的gadgets(代码片段)非常罕见,故而这一安全风险极低。通过V3a发起的针对虚拟机管理器的A1攻击是可行的,这些虚拟机管理器专有寄存器的泄露会导致信息泄露。
用户态攻击者也可以利用V1/V2发起对Android内核的A2攻击。类似地,通过V1/V2直接攻击内核需要内核自带完全符合条件的gadgets,要求极高、攻击成功的可能性很低。虽然Android内核中有eBPF机制,但是仅有seccomp能使用该机制,并没有直接提供bpf()系统调用,因此攻击者无法注入可控的V1/V2 gadgets到内核空间。V3a对Android内核的影响则没有什么特殊性,一些内核寄存器的泄露会导致信息泄露(例如VBAR_EL1包含了内核地址信息,该寄存器值的泄露会直接导致kASLR的失效)。
对于A3攻击而言,由于在Android上Binder/ashmem等机制允许应用程序之间互相调用和数据传递,如果应用程序甚至Android系统框架中存在V1/V2所依赖的gadgets,则相应程序会受到V1/V2的影响,导致沙箱机制被绕过。在上一篇中,我们提到,ASLR会限制Spectre攻击,但是在Android上,由于实现机制的原因(所有的App进程都由zygote进程fork而来,因此有同样的内存布局),导致ASLR有严重的本地泄露问题,从而增加了攻击的风险。
对于浏览器攻击内核的场景(A2w),V1/V2皆有可能,性质与上面的分析一致。但对于Javascript/WebAssembly而言,想要发起有效的V1/V2攻击,还需要突破浏览器的ASLR,难度愈加增大。通过浏览器对用户空间其他用户的攻击(A3w)也一样,需要先突破浏览器的ASLR才能发起有效的V1/V2攻击。
对iOS的影响
iOS平台没有虚拟机监控器(VMM),因此不存在A1的攻击。A2攻击和Android平台一样,可以发起V1/V2/V3a攻击;但用户态进程无权限启用BPF构建任意gadget,因此受到V1/V2攻击的可能性也大大降低,V3a对特殊寄存器的泄漏问题依然存在。
对于A3攻击而言,iOS上允许用户态进程通过Mach Port/XPC//Notification等机制进行数据传递,如果接收方的处理代码中包含相应的gadget,则可能受到V1/V2的影响导致沙箱机制被绕过。
对于浏览器攻击内核的场景(A2w),在iOS 11.2.2中已经对浏览器的JIT相关模块进行了缓解,对侧信道攻击时间粒度与下标检查的gadget两方面进行了防护。旧版的iOS版本上仍然可能对用户空间进行攻击,因此用户应尽快升级到最新版本。
3. ARM平台上的攻击能力和影响面分析
Spectre和Meltdown在ARM平台上与Intel平台上的攻击原理是基本一致的。但是,ARM处理器的不同特性,以及Android/iOS等操作系统的特有机制,会导致漏洞在该平台上的攻击能力和影响面略有不同。
边界检查绕过攻击 - V1
图1:ARM64上面V1攻击的核心代码片段。
V1的基本工作原理在ARM和Intel/AMD平台是相同的。图1中是在ARM64平台上面一段典型的V1代码片段。注意V1在ARM上面非常依赖于乱序执行。对于没有乱序执行的ARM处理器(in-order processor),是无法发起V1攻击的(因为没有足够的时间给推测执行 (speculative execution))。绝大部分的主流ARM处理器,包括Cortex-A73, Cortex-A72, Cortex-A57等,都受到V1攻击的影响。详细列表参见[2]。
跳转目标注入攻击 - V2
V2的基本工作原理在ARM和Intel/AMD平台是相同的。同V1一样,绝大部分的主流ARM处理器都受到V2攻击的影响。详细处理器列表参见。V2的攻击场景也非常广,已有攻击表明V2可以攻击虚拟机监控器、内核和应用程序 [2]。
Meltdown攻击变种 - V3a
根据ARM的官方声明,Cortex-A15, Cortex-A57和Cortex-A72三款处理器受到V3a攻击的影响。其原理是,在这些特定的ARM处理器上,处理器的预测执行可以导致其成功读取在当前特权级上本无权读取的系统寄存器。这些系统寄存器的值被预测执行读取之后,其值可以被用作进一步的预测,从而能通过类似V3攻击一样的Cache侧信道的方式推测得到这些系统寄存器的值。
图2:ARM64上面V3a攻击的核心代码。实例中EL0代码试图访问TTBR0_EL1
图3:ARM32上面V3a攻击的核心代码。示例中PL0代码试图去访问TTBR0
虽然这些系统寄存器中并不会存放任何与key相关的数据(ARMV8.3-A标准中的Pointer Authentication机制会导致用来校验指针完整性的key被泄露,但是没有使用了该机制的处理器受V3a漏洞影响),但是某些寄存器会导致敏感信息泄露。例如VBAR_EL1包含了内核地址信息,该寄存器值的泄露会直接导致kASLR的失效。
表2:ARM上面一些V3a的测试结果[4]。
浏览器攻击
在浏览器中,可以通过JavaScript或者Web Assembly进行攻击代码构造。对于浏览器攻击内核的场景(A2w),V1/V2皆有可能,性质与普通A2的分析一致。对于Javascript/WebAssembly而言,想要发起有效的V1/V2攻击,还需要突破浏览器的ASLR,难度愈加增大。通过浏览器对用户空间其他用户的攻击(A3w)也一样,需要先突破浏览器的ASLR才能发起有效的V1/V2攻击。
对于V3a,A2w的场景下JIT无法生成相应的访问系统寄存器的指令,因此无法发起攻击。V3a无法夸进程攻击,因此A3w也无法攻击。
4. ARM平台上的缓解方案
边界检查绕过的缓解 - V1的缓解
与Intel平台的缓解方案类似,在ARM平台上,也可以通过插入barrier来阻止预测运行机制的执行。具体来讲,ARM64、ARM32以及Thumb32有一个新的CSDB指令可以用作该场景下的barrier。该指令在老的处理器上,相当于NOP。对于老处理器,需要在条件判断后面添加一个条件选择/条件赋值指令CSEL/MOVGE(ConditionalSelect/Conditional Move)来实现对越界的变量清空。因此,CSDB和CSEL/MOVGE的组合可以应对所有ARM处理器上面的V1攻击(如图2和图3所示)。注意使用ConditionalSelect/CSDB相比于使用普通的barrier(DSB SY +ISB),会有较大的性能优势。ARM也提供了相应的编译器扩展函数 __builtin_load_no_speculate 来方便在编译期间在代码中加入相应的barrier。
图4:AArch64上面缓解V1的关键代码示例。
图5:AArch32上面缓解V1的关键代码示例。
跳转目标注入攻击的缓解 - V2的缓解
与上一篇中提到的Intel平台的缓解方案类似,在ARM平台上使用BTB 刷新可以有效缓解V2攻击。在ARM32上,可以通过MCR p15, 0, Rx,c7, c5, 6来实现BTB的清空。在ARM64上,没有单独清BTB的指令。可以通过IC IALLU来同时清空I-cache和BTB。刷新BTB会带来一定的性能开销。之前提到由于bpf()系统调用的缺失,在Android ARM平台上,用户态程序直接攻击内核的难度较大,因此不建议在每次进入内核态的时候刷新BTB,而只是在进程切换的时候刷新BTB,这样也可缓解应用程序间的攻击。
Meltdown攻击的缓解措施 - V3a的缓解
ARM官方表示,V3a一般情况下不需要软件方案缓解 (绝大多数系统寄存器的内容没有特别隐私的信息) [2]。但是,某些安全机制可能会依赖某些系统寄存器,比如kASLR依赖于VBAR_EL1。这些寄存器内容的泄露会让该安全机制强度降低或者完全失效。为了保护这类系统寄存器,可行的缓解方式是当系统即将切换到低特权级(例如用户态)运行时,将这些关键寄存器备份,并设置为无用的值[2]。对于有些系统寄存器是不能换成无用的值的(有些位的设置/撤销对系统行为有影响),因此上面的方法也不是一个通用方法。希望相关厂商尽快发布更加全面有效的方案。
浏览器攻击的缓解
除了ASLR带来的缓解外,几大主要浏览器(比如Chrome,Firefox, 和Microsoft Edge/IE)还有一些临时的缓解方式,其核心思想就是(1)降低时钟精度,和(2)增加噪音。
降低时钟精度。目前有两个思路去降低时钟精度。第一个思路就是降低浏览器中相关API(比如 performance.now)的时钟精度,比如微软Edge和Firefox把时钟精度从原来的5us降低到了现在的20us(Chrome也有相应程度的降低)。第二个思路是防止攻击者在JS或者WASM里面自己建立精确时钟。目前脚本自己建立时钟的一个主要载体就是SharedArrayBuffer。因此,第二个思路就是移除对SharedArrayBuffer的支持。目前 Chrome(自2018年1月5号的更新版本)、Firefox版本57和微软Edge都里面移除SharedArrayBuffer的支持。
增加时钟噪音。增加时钟噪音就是在时钟的返回值上面加上一个随机的波动。目前公开数据是微软的Edge增加了该功能,使得时钟的有高达20us的波动。
Google给出的针对Android系统的缓解方案
针对Meltdown/Spectre,Google给出了一个针对Android系统的漏洞缓解方案,其主要原理是限制用户态程序访问high-precisiontimer,从而限制侧信道攻击的利用。这些缓解方案被包含在2018年1月的Android安全补丁中。其对应的漏洞编号为CVE-2017-13218,Android BugId为A-68266545。
其主要原理是,通过设置cntkctl_el1寄存器的值,关闭用户态程序对cntvct_el0等寄存器、也就是high-precision timer的访问,此时用户态程序对于这些指令的访问将会导致陷入到内核中,内核中做了内存屏障操作后,再将时间返回给用户态。因为调用一次相关指令需要进出内核且涉及内存屏障操作,用户态将无法得到足够准确的时间度量。
但是在实际测试中,我们发现,即使不使用high-precision timer,单纯在用户态使用一个变量循环累加来做计数器,也能达到类似的效果。因此,我们认为,Google给出的这个漏洞缓解方案作用十分有限。
Apple给出的针对iOS系统的缓解方案
Apple在2017年12月2日发布的iOS 11.2 和macOS 10.13.2安全更新中针对Meltdown进行修复,在Kernel中使用类似KPTI的方式隔离用户空间与内核空间的page table,在用户空间与内核空间切换时进行页表的切换 [7]。2018年1月8日,发布iOS 11.2.2 安全更新针对浏览器中的Spectre问题进行了缓解。具体做法为降低时间精度到毫秒级别,同时禁用可被用于预测高精度时间的SharedArrayBuffer,以此来增加在浏览器中发起侧信道攻击的利用难度。此外,还对关键可索引数据类型(如Type Array, WebAssembly memories, Strings等)的下标进行“IndexMasking”操作,引入掩码操作替代原有的下标边界分支检查,消除可能被利用的Spectre gadget。
5. 结语
本文对Meltdown和Spectre在ARM平台上的攻击及缓解措施进行了总结。一方面,由于目前市面上所有的ARM设备并不受Meltdown(即V3)攻击影响,以及在Android系统中bpf的缺失,导致针对其的威胁相对于Intel平台要小很多。另一方面,Spectre(V1和V2)攻击的潜在威胁仍不能忽视,由于Android应用程序之间有强大的互相调用能力,本地运行的恶意软件有可能通过V1/V2攻击绕过Android的沙箱机制,获取属于其他程序的敏感数据。对于浏览器攻击场景(A2w/A3w)以及V3a攻击,目前仅有一些临时的或不全面的缓解方案,希望相关厂商尽快给出全面的有效的解决方案。
参考资料
https://bsi.baidu.com/article/detail/99
Vulnerability of Speculative Processors to Cache Timing Side-Channel Mechanism
https://developer.arm.com/support/security-update
Google. Android Security Bulletin -- January 2018
PoC code of Meltdown attack for AArch64
https://github.com/lgeek/spec_poc_arm
White Paper: An Overview of the Samsung KnoxTM Platform
https://kp-cdn.samsungknox.com/df4184593021d7b8fabfdfeff5c318ba.pdf
What Spectre and Meltdown Mean For WebKit
https://webkit.org/blog/8048/what-spectre-and-meltdown-mean-for-webkit/
About speculative execution vulnerabilities in ARM-based and Intel CPUs
https://support.apple.com/en-us/HT208394
Actions required to mitigate Speculative Side-Channel Attack techniques
https://www.chromium.org/Home/chromium-security/ssca
本文来自百度安全实验室,百度安全经授权发布
文章图片来源于网络,如有问题请联系我们