多个bit位整合成一个byte输出_除了使用TrustZone,升到64位也很重要

本文首发极术社区
原文: 除了使用TrustZone,升到64位也很重要
作者:Ethan.Zhang
更多平台安全架构的技术干货,请关注 极术社区PSA专栏。如想探讨,欢迎添加微信 aijishu20,加入PSA微信群.

最近跟朋友聊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等,具体在其他文章里有描述。

373b89f018f84bf9aee77790f929ad9b.png


我们今天介绍是Armv8.x-A的新安全技术,主要是解决一些系统安全问题,但是这些安全特性是跟Arm AArch64有很大依赖关系。在介绍之前,我们先回忆下Arm AArch64. AArch64在七八年前是非常火的话题,那时候Armv8.0-A刚刚发布,Armv8.0-A相当于Armv7-A是一个特别大的升级,但是又兼容Armv7-A架构,也就是说Armv8-A'支持64位,也支持32位。

e6fb847fe32d541c60932832de5ed19a.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位。

bfd39a4928f7768ae0cdcd085ef5cf64.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位置,我们刚好可以利用起来,可以用来做安全检查。

b0906b7ac1922bebfb4f0b90c50a6889.png

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

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

8be795ab1d334d176459ad64f88c9271.png

PAC
PAC的全称是Pointer Authentication,是Armv8.3增加的安全特性。通过上面提到的PXN和UXN可以解决执行权限的安全问题。但是我们系统里有非常多的函数和代码,攻击者会分析这些代码,例如有些函数的其中一部分对他们来说是有用的,直接跳转到函数的中间去执行,然后执行到返回。他们可以通过这些代码片段来组合成成恶意程序,这种代码本身就是可执行的,PXN和UXN就无法阻止这种攻击。在Arm v8.3中增加了PAC就是来解决这种攻击方式,也就是ROP(Return-oriented programming)攻击,基本原理就是在进入函数时对返回地址的地址进行签名,执行完函数再对返回地址进行校验,如果校验通过说明跳转到的是合法地址,如果校验失败,则认为有安全分险。那对返回地址的签名放在什么位置呢?

4a02fce261fb04b1d739109b9f9154ed.png


这部分就利用到前面提到的64bit虚拟地址,因为支持的虚拟地址是48bit或者52bit,一些高bit位是没有用到的,例如我们可以利用高bit位来存签名,通过这种方式可以缓解ROP的攻击方式。

6a5b1090c00d637678e4c56ce0c7532a.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的攻击方式

a5a4255ead753ac73ce935048c46db85.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不一致时,可以立即产生异常,或者是进行标记,不产生异常,系统寄存器来记录,可以后面再进行分析。通过纯软件的方式也可以实现类似的功能,只是开销非常大。

4ad3c14ec49f64e3c483746a07c73fc8.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更加符合应用的发展趋势。

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

  • Providing protection for complex software
  • 学Arm TrustZone需要看哪些资料?
  • Arm的TrustZone, CryptoCell, 以及Cryptoisland到底什么关系?
  • Cortex-M和Cortex-A的TrustZone差异
更多Arm Trustzone相关的技术文章可以关注 平台安全架构(PSA)专栏。如希望加入极术社区专业PSA技术交流群,欢迎联系极术小姐姐(微信: aijishu20, 备注PSA)加入。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值