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的代码镜像。


本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可。

相关文章

发表新评论