ARMv8-M的TrustZone可应对的攻击类型
在安全系统设计中,我们常会有一个问题就是:“这个系统到底有多安全?”而在TrustZone设计中,我们考虑了很多种攻击类型,比如:
软件访问控制
通过额外的系统组件,系统内存可以划分为Secure和Non-Secure空间,可以保护Secure空间不被Non-Secure模式访问。
Secure Address的跳转
通过SG指令和NSC空间的定义,可以保证系统只能在有效的Entry Point才能跳转到Secure程序中。
二进制代码中的无效SG指令
通过NSC空间,可以保证Secure只能通过Entry Point跳转,对于二进制数据中的意外SG指令,处理器会认为是无效的SG指令,运行的时候会产生异常。
SecureAPI返回时伪造返回地址
当SG指令之行的时候,函数的返回状态会存储在Link Register(LR)的最低位。函数返回的时候,系统会检查这个BIT,防止Secure API返回到一个假的返回地址。
尝试通过FNC_RETURN(function return code)切换Secure状态
当从一个没有Return的Secure程序(比如BootLoader)跳转到Non-Secure的时候,处理器通过使用BLXNS指令确保调用有一个有效的return stack。这个return stack可用于进入一个异常中断。
它的目的是防止Non-Secure通过FNC_RETURN机制,在Secure软件没有有效返回地址的时候,使Secure软件从Stack获取一个无效的返回地址,从而引起Secure程序崩溃。
不过并不推荐从Non-Secure调用Secure程序时候采用这个指令,而是应该使用BNXS指令。
通过伪造EXEC_RETURN(exception return code)尝试返回到Secure模式
当Secure模式下发生Non-Secure异常时,处理器会自动在Secure栈中加入签名值,如果Non-Secure软件尝试通过中断返回非法跳转到Secure程序的时候,签名检查会检测到这种错误。
尝试Secure软件堆栈溢出
Secure软件的堆栈会有一个堆栈大小的寄存器,可以有效的保护堆栈溢出攻击,当检测到堆栈溢出的时候会触发系统异常。
在调试端,TrustZone也考虑到了各种安全需求:
调试权限管理
处理器提供了一个调试鉴权功能,通过这个功能,设计者可以分别控制Secure和Non-Secure模式下的调试功能。
系统可以通过AMBA总线协议防止Debugger直接读取Secure内存中的数据。
Debug和Trace管理
当处理器在Secure模式的时候,可以禁用Debugger。
尽管系统设计的时候考虑到了多种攻击模式,用户在Secure软件设计的时候还是要注意各种安全特性,比如堆栈大小的检查,防止各种意外的攻击情况。现在ARM C语言扩展(ARM C Language Externsions ACLE)已经支持ARMv8-M架构,用户在设计Secure软件的时候应该实现扩展中的功能,从而使开发工具可以生成适合ARMv8-M的代码镜像。
最后更新于 2019-08-04 22:56:03 并被添加「安全 ARM TrustZone」标签,已有 4506 位童鞋阅读过。
本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可。