1、TrustZone 概述:ARM TrustZone 技术背景、核心概念、安全世界与非安全世界隔离模型
1.1 为什么需要 TrustZone?—— 技术背景
嵌入式安全,说白了就是一场攻防战。
我入行那会儿,嵌入式设备还比较简单。一个单片机,跑个裸机程序,顶多加点密码算法。但现在不一样了。手机、物联网、车机、智能门锁……哪个设备不在联网?哪个设备不存敏感数据?指纹、支付密钥、人脸模板,全在芯片里跑。
问题来了:操作系统本身就不安全。Linux 内核可能有漏洞,App 可能被篡改,攻击者一旦拿到 Root 权限,你的密钥就像放在玻璃柜里——看得见,拿得走。
传统的做法是加一个独立的安全芯片(SE),或者用 TEE(可信执行环境)软件方案。但独立芯片成本高、通信带宽低;纯软件 TEE 又容易被侧信道攻击。ARM 给出的答案是——TrustZone。
我个人习惯把 TrustZone 理解为:在同一个物理 CPU 上,硬生生切出两个虚拟的“世界”。一个跑普通应用,一个跑安全服务。硬件帮你隔离,软件不用操心。
核心思想:不需要额外芯片,不需要改 CPU 架构,只需要在总线上加一个“安全位”标记。就这么简单,但效果极好。
1.2 两个世界:安全世界与非安全世界
TrustZone 把 CPU 的执行状态分成两种:
- 非安全世界(Normal World):运行 Rich OS(比如 Linux、Android)。所有普通 App 都在这里跑。攻击者能拿到最高权限,但仅限于这个世界。
- 安全世界(Secure World):运行 Trusted OS(比如 OP-TEE、Trusty)。只有经过签名的可信应用(TA)才能在这里执行。密钥、指纹数据、支付逻辑,全放在这里。
你想想看,攻击者就算攻破了 Linux 内核,拿到了 Root 权限,他能干什么?他只能看到非安全世界的东西。安全世界的内存、寄存器、外设,他根本碰不到——因为硬件总线会检查一个叫 NS(Non-Secure)位 的东西。
我的经验:我在项目中遇到过客户问“我能不能在安全世界跑 Linux?”答案是理论上可以,但没人这么干。安全世界资源有限,跑个微型内核就够了。Linux 太庞大,反而增加攻击面。
1.3 隔离模型:硬件怎么做到的?
TrustZone 的隔离不是靠软件,而是靠硬件。具体来说,有这几个关键点:
1.3.1 处理器状态切换
ARM 处理器新增了一个 安全监控模式(Monitor Mode)。这是两个世界之间的“门”。
- 从非安全世界切换到安全世界,必须通过一条特殊指令:
SMC(Secure Monitor Call)。 - Monitor Mode 的代码是最高权限的,它负责保存/恢复上下文,然后切换世界。
// 一个典型的 SMC 调用示例(伪代码)
// 非安全世界发起请求
smc #0x0;
// 此时 CPU 进入 Monitor Mode
// Monitor 检查参数,切换到安全世界
// 安全世界处理完,返回结果
嗯,这里要注意:SMC 指令只能在 EL3 或 Monitor Mode 下处理。如果你在非安全世界乱发 SMC,系统会直接崩溃。我调试时吃过这个亏,后来养成了习惯——先检查当前异常级别。
1.3.2 内存和外设隔离
ARM 在系统总线上加了一个 NS 位。每个内存访问、每个外设访问,都会带上这个位。
- 如果 NS=0,表示安全访问。
- 如果 NS=1,表示非安全访问。
硬件会检查:安全世界可以访问所有内存,非安全世界只能访问标记为“非安全”的内存。这就叫“单向隔离”。
避坑指南:我曾经在配置 TZASC(TrustZone Address Space Controller)时,忘记把某个外设的寄存器区域标记为安全。结果安全世界的 TA 写数据时,非安全世界的恶意程序也能读到。嗯,那是一次惨痛的教训——隔离必须覆盖所有共享资源,不只是内存。
1.3.3 中断隔离
TrustZone 还支持 安全中断 和 非安全中断。比如,指纹传感器的中断可以配置为安全中断,只有安全世界能处理。非安全世界的中断控制器根本看不到它。
为什么会这样?因为 GIC(通用中断控制器)也支持 TrustZone。GIC 会检查中断源的安全属性,然后决定把中断发给哪个世界。
1.4 实际应用场景
说了这么多理论,咱们看看实际怎么用。我列几个常见的:
| 场景 | 非安全世界 | 安全世界 |
|---|---|---|
| 移动支付 | 支付宝/微信 App | 存储支付密钥、签名验证 |
| 指纹解锁 | Android 系统 | 指纹特征比对、模板存储 |
| 数字版权管理 | 视频播放器 | 解密视频流、输出到安全显示 |
| 车机系统 | 车载娱乐系统 | 车辆控制指令、OTA 固件验证 |
说白了,所有需要“保密性”和“完整性”的操作,都放到安全世界。非安全世界只管跑业务逻辑。
1.5 小结与个人体会
TrustZone 不是万能的。它解决的是 硬件级隔离 问题,但软件漏洞依然存在。比如,安全世界的 TA 如果写得烂,照样能被攻击。
我记得刚接触 TrustZone 时,总觉得它很神秘。后来做多了才发现,它其实就是一套硬件规则:谁可以访问什么,谁不能访问什么。你只要把规则配置好,剩下的交给硬件。
最后说一句:TrustZone 的隔离模型,是嵌入式安全的基石。不理解它,后面所有章节都白搭。所以,请务必把这一章吃透。
我的建议:如果你手头有开发板,可以试试写一个最简单的 SMC 调用。从非安全世界发一个命令,让安全世界点亮一个 LED。做完这个实验,你对 TrustZone 的理解会上一个台阶。