16

Ethan.Zhang · 2020年05月20日

除了使用TrustZone,升到64位也很重要

最近跟朋友聊Arm安全时,发现存在一些误解,认为Arm安全只有TrustZone?不是的,安全是一个比较大话题,Arm TrustZone只是Arm架构的安全扩展。目前Armv7-A,Armv8-A,以及Armv8-M的CPU都实现这个安全扩展,也就是说所有Arm开发的Cortex-A,Cortex-Mxx的CPU都是支持TrustZone,但是除此之外Arm在其他安全技术投入也非常大,例如SecurCore系列CPU,主要是针对一些高安全要求的市场,例如金融,通信,身份认证等领域,比较有代表性的CPU是SC000,SC300,Cortex-M35P等,Cortex-M35最近也通过CC EAL6+认证;还有一些security IP,例如TRNG,Cryptocell,Cryptoisland等,具体在其他文章里有描述。
image.png
      我们今天介绍是Armv8.x-A的新安全技术,主要是解决一些系统安全问题,但是这些安全特性是跟Arm AArch64有很大依赖关系。在介绍之前,我们先回忆下Arm AArch64. AArch64在七八年前是非常火的话题,那时候Armv8.0-A刚刚发布,Armv8.0-A相当于Armv7-A是一个特别大的升级,但是又兼容Armv7-A架构,也就是说Armv8-A'支持64位,也支持32位。
image.png

AArch32 和AArch64
Armv8-A有两个执行状态,分别是AArch32和AArch64。AArch32可以认为Armv7-A的演进,支持A32和T32指令集,同时也新增了一些新的指令,采用的还是Armv7-A的exception model,还是支持32位的虚拟地址。AArch64也就是我们说的64位,AArch64采用指令集是A64,指令的长度是固定的32bit,使用新的exception model,如EL0,EL1,EL2,EL3,同时通用寄存器的长度也是64位,虚拟地址也是64位。
image.png
   64bit VA访问地址范围是非常大的,很多应用场景下可能用不到这么大的地址空间,所以有的CPU只支持48位或52位的虚拟地址空间,当然软件也可以根据具体的要求来配置具体的虚拟地址大小,例如CPU支持48虚拟地址,但是软件可以配置为只使用39bit的虚拟地址。例如以48 bit的虚拟地址为例,会多出来16 bit,在默认的情况下,这16个bit要么是全0,要么是全1,如果是全1的时候代表的kernel的地址空间,如果是全0的时候代表是用户态的地址空间,如果是其他值得话表示一个非法地址,会产生异常。那64bit的虚拟地址,有效部分只是48 bit或者52bit,多出来的这些bit位置,我们刚好可以利用起来,可以用来做安全检查。image.png

攻击的方法是非常多样化的,Google也会统计Android每年的安全漏洞和种类,我们也可以对这些漏洞进行整理和和分类,大体上可以分为控制流程完整性和数据安全性,Arm也在对这些漏洞做分析和研究,从CPU架构上来缓解这些安全问题。

PXN和UXN
       例如在比较早期的攻击方式,利用栈溢出,恶意程序将恶意代码写入到栈区,然后进行跳转来执行代码,这种攻击方式Arm架构增加了执行权限检查,在页表内有执行权限的bit位,例如把数据区域对应的页表的执行标志位置1,就标志不能执行,当然也进行了细化,例如不同的特权级可以配置不同的执行权限,PXN和UXN。
image.png

PAC
PAC的全称是Pointer Authentication,是Armv8.3增加的安全特性。通过上面提到的PXN和UXN可以解决执行权限的安全问题。但是我们系统里有非常多的函数和代码,攻击者会分析这些代码,例如有些函数的其中一部分对他们来说是有用的,直接跳转到函数的中间去执行,然后执行到返回。他们可以通过这些代码片段来组合成成恶意程序,这种代码本身就是可执行的,PXN和UXN就无法阻止这种攻击。在Arm v8.3中增加了PAC就是来解决这种攻击方式,也就是ROP(Return-oriented programming)攻击,基本原理就是在进入函数时对返回地址的地址进行签名,执行完函数再对返回地址进行校验,如果校验通过说明跳转到的是合法地址,如果校验失败,则认为有安全分险。那对返回地址的签名放在什么位置呢?
image.png
      这部分就利用到前面提到的64bit虚拟地址,因为支持的虚拟地址是48bit或者52bit,一些高bit位是没有用到的,例如我们可以利用高bit位来存签名,通过这种方式可以缓解ROP的攻击方式。
image.png
BTI
BTI的全称是Branch Target Instructions,是Armv8.5-A增加的安全特性,主要是来解决JOP(Jump-oriented Programming)这种攻击方式,如果细心的同学可以看到,通过PAC保证的是返回地址必须是合法的返回地址,但是我们的指令集中还有跳转指令如B,BL。那攻击者在分析我们代码时,可以挑选函数中间的代码片段,没有执行到RET指令就已经跳出了函数,通过这种方式也可以组合出恶意程序,这种方式PAC就无法进行防护。所以在Armv8.5-A中增加了BTI来解决JOP的攻击方式,主要原理时是进行B或BL跳转时,只能调转到特定的代码,例如跳转后的地址必须有BTI,如果不是指定的代码,那么就会产生异常,认为有安全风险,那哪些代码需要进行检查呢,这个可以利用MMU的页表,在页表中增加了一个GP的bit,当这个bit置1时,才会进行检查,如果该bit是0的话,就不进行检查,通过BTI可以缓解JOP的攻击方式
image.png
MTE
MTE的全称是Memory Tagging,也是Armv8.5-A增加的安全特性,主要是缓解数据完整性的漏洞。大部分的漏洞是我们编程中的写的bug,例如Use after free,Buffer overflow,MTE主要是检查这些问题。MTE就是在分配内存的时候,按照每16Byte来分配一个Tag,这个Tag的长度是4bits,可以认为是一个lock和一把key,这个key存储的位置也是存储在指针的高bit位,也是利用到上面所说的64bit的虚拟地址未用到的高bit位, lock是存储内存的特殊位置。当分配memory的时候会打Tag,访问memory的时候会先进行比对,如果比对成功则能访问memory,如果tag不一致,说明可能存在风险。通过这种方式可以检测memory safty的问题,例如我们在开发阶段可以使能这些feature来做检查,量产时也可以disable掉,如果是比较核心的代码也可以一直使能检查,如果出现Tag不一致时,可以立即产生异常,或者是进行标记,不产生异常,系统寄存器来记录,可以后面再进行分析。通过纯软件的方式也可以实现类似的功能,只是开销非常大。
image.png

从上面PAC,BTI,以及MTE这些新安全特性看出,安全是互补的,并不是说通过一个安全特性可以解决所有问题,例如:

  • PXN/UXN可以缓解执行权限的安全问题
  • TrustZone主要是保证系统被攻击后,也无法窃取敏感信息,以及敏感信息存储、输入、输出,以及basic hardware attack
  • PAC主要是缓解ROP攻击
  • BTI主要是缓解JOP攻击
  • MTE主要是检查不正确使用memory的行为
  • Armv8.5增加的Speculation Barrier指令、execution and data prediction restriction指令来缓解侧信道攻击
  • Security IP来增加安全启动、安全升级、密钥管理等
  • Cryptoisland来满足高安全应用的需求,例如strongbox、iSIM等应用场景
  • .......

通过软件或硬件都可以提高安全性,如果有硬件上支持的话,可以大大简化软件的设计难度,同时对性能影响也最小,这PAC,BTI,MTE 以及S-EL2的安全特性都是在AArch64执行状态下才支持的,从长远来看64位 only的CPU更加符合应用的发展趋势。

以上仅是个人观点,如果有任何问题,欢迎随时讨论,下面连接是一些更详细的解释

更多Arm Trustzone相关的技术文章可以关注平台安全架构(PSA)专栏。如希望加入极术社区专业PSA技术交流群,欢迎联系极术小姐姐(微信:aijishu20, 备注PSA)加入。
推荐阅读
关注数
4548
内容数
127
Arm发布的PSA旨在为物联网安全提供一套全面的安全指导方针,使从芯片制造商到设备开发商等价值链中的每位成员都能成功实现安全运行。
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息