带 TrustZone 的按键点灯工程示例
关键字:TrustZone, Secure, NonSecure
1. 引言
假设软件存在漏洞,攻击者利用软件漏洞就有可能导致关键的信息受损。这种情况下,使用系统隔离,将关键的资源以及操作和普通的分开,普通的应用程序无法访问关键资源,从而可以有效的降低软件漏洞带来的风险。
TrustZone 是系统隔离的一种硬件手段,它将整个系统分为安全世界和非安全世界。安全世界可以存储像密钥、配置关键外设等,非安全世界运行其余代码。这样,即使非安全侧遭受到攻击,由于访问权限的限制,安全侧的数据以及关键外设不会受到影响。
TrustZone 技术,在一个芯片上,按照地址,划分了安全世界和非安全世界。但一个地址,它的安全属性,有三种 Secure、NSC、Non-Secure。
为什么在安全世界中,要存在一个 NSC 区域呢?TZ 隔离出的两个世界,安全世界和非安全世界。安全世界可以随意调用非安全世界的代码,而非安全世界调安全世界的 API 则要经过中转站(NSC 区域)。不同安全属性的地址区域的调用关系如图 1 所示。
图1. 地址区域中的属性关系图
2. 按键点灯实验
接下来,我们将通过按键点灯实验,来体会系统隔离的魅力所在。这也将更好的帮助去理解系统的安全侧和非安全侧。
2.1. 使用准备
硬件:
- NUCLEO-H563ZI
软件:
- CubeMX 6.12.1 (或最新版本)
- STM32Cube_FW_H5_V1.2.0 (或最新版本)
- STM32CubeProgrammer 2.17.0 (或最新版本)
- IAR EW for Arm 9.50.2 (或最新版本)
2.2. 实验思想
在实验中,开启 USER_BUTTON (处于非安全侧)的外部中断功能。当用户按下按键并松开手,触发上升沿中断。在上升沿中断回调函数中,去翻转小灯 LED1_GREEN(处于安全侧)、LED2_YELLOW(处于非安全侧)、LED3_RED(处于非安全侧)。
引脚及所处状态总结如表 1 所示。
表1. 引脚及其所处状态表
2.3. 实验步骤
2.3.1. CubeMX 配置
1)使能 TrustZone,将 PC13 设置为 EXTI 模式,PB0、PF4、PG4 设置为推挽输出模式并设置处于安全侧还是非安全侧。设置如图 2 所示。
图2. GPIO 配置图
2)使能 PC13 的外部中断线 EXTI Line13。如图 3 所示。
图3. EXTI Line13 配置
3)点击 GENERATE CODE 生成代码。
2.3.2. 代码配置
1)如何实现在非安全侧调用安全侧的代码?需要在 Secure/Src/secure_nsc.c 中实现,在 Secure_nsclib/secure_nsc.h 中声明小灯状态翻转函数 void SECURE_LEDToggle(void)。
2)在非安全侧函数调用安全侧代码 SECURE_LEDToggle();
2.3.3. STM32CubeProgrammer 配置
1)首先需要使能 TrustZone 功能,点击 OB->User Configuration 2->TZEN,使能。
图4. TZEN 配置图
2)通过查看非安全侧代码,发现位于 0x0810 0000 ~ 0x081F FFFF。开启 TZ,默认所有的 Bank2 均处于安全侧。因此,我们需要手动更改 Bank2 的区域为非安全侧。如图 5、图 6 所示
图5. 非安全侧代码所处 ROM 地址区域
图6. 更改 Bank2 的安全属性
2.3.4. 编译代码并下载
编译下载后,当按下用户按键并松开后,小灯点亮。再次相同操作,小灯熄灭。
注:编译时,先编译安全代码,再编译非安全侧代码。
3. 小结
通过上面演示,操作非安全侧按键去点亮安全侧的 LED1 和非安全侧的 LED2、LED3, 来帮助大家更好的理解安全侧与非安全侧的资源与外设调用。