总线防火墙与 TrustZone 过滤:主设备权限、安全属性与地址拦截
更新时间:2026-09-19。前置:APB 桥与 PPROT、地址译码与重映射、MMU/TLB、BootROM 安全启动。MPU/MMU 管「CPU 核内」的访问权限,但 DMA、其他主控不走 CPU,需要放在总线上的硬件防火墙。
本文要回答的问题
- DMA 直接读密钥寄存器怎么办?总线防火墙拦在哪、按什么判断?
- TrustZone 的安全/非安全属性怎么随总线事务传递?
- 违规访问如何响应(错误/中断/终止)?
- 总线防火墙和 MPU/PMP、和地址重映射是什么分工?
一、为什么 CPU 侧保护不够
MPU(ARM)/PMP(RISC-V)/MMU 只检查通过该 CPU 加载存储单元发起的访问(见 MMU/TLB)。但 SoC 上还有很多其他总线主设备:
它们直接经互连访问地址,不经过受害 CPU 的 MPU。若不加约束,一个被攻破的外设/DMA 可绕过软件直接读写安全 SRAM、密钥寄存器。**总线防火墙(bus firewall / peripheral protection controller / IOPMP、TZASC、TrustZone Protection Controller)**就是插在互连或从设备端口上的硬件访问控制点。
二、过滤依据:五元组
每条总线事务经过防火墙时,按以下信息查表决定放行/拒绝:
- 主设备身份(master ID / security master):互连给每个主设备分配固定 ID(AXI AxID/QOS、AHB HMASTER、CHI SrcID,见 CHI)。
- 安全属性(secure / non-secure,TrustZone 的 NS 位):经 AxPROT(AxBIT1)/HPROT/PPROT 传递(见 APB 桥)。
- 读/写类型(R/W):可读但不可写等。
- 目标地址窗口:把地址空间划成 region,逐窗口配权限(类似 MPU 但作用于总线)。
- 特权级(部分实现):user/privileged 位。
规则形如:「master ID=3(以太网 DMA)、非安全 → 只允许读写地址窗口 0x8000_0000~0x800F_FFFF,写其余区域一律拒绝」。密钥/efuse 窗口只允许特定安全主控(见 eFUSE/OTP、PUF/TRNG)。
三、TrustZone 属性怎么传递
ARM TrustZone 把系统分安全世界(Secure)和普通世界(Normal/Non-secure):
- CPU 执行非安全代码时,总线事务带 NS=1(AxPROT 位 / HPROT);安全代码 NS=0。外设/APB 经桥把该位映射到 PPROT(见 APB 桥 PPROT)。
- 安全外设/安全内存只接受 NS=0 事务;非安全主控访问被防火墙/TZASC 拦截。这样即使非安全 OS 被攻破,也读不到安全世界的密钥与内存。
- 安全世界通过 SMC 调用提供受控服务(共享内存经显式配置的窗口),而不是开放全部地址。
- RISC-V 对应物理内存保护 PMP(核内)+ 总线侧 IOPMP(IO Physical Memory Protection,管 DMA 等外部主控),理念一致。
四、违规响应
命中拒绝规则时,防火墙通常可配置为:
- 返回总线错误:AXI SLVERR/DECERR(RRESP/BRESP)、AHB HRESP ERROR、APB PSLVERR(错误映射见 AXI 错误响应、APB 桥),让发起方收到异常。
- 触发安全违规中断/告警:锁存违规 master ID、地址、R/W,发中断给安全处理器/ESM(接 事件路由、时钟安全监控 的安全告警路径)。
- 终止/隔离事务:不向从设备转发,防止写发生(必须在读数据/写使能到达前拦截,不能事后回滚)。
- 严重攻击可触发复位/锁芯片(联动 复位控制器、安全启动)。
五、和 MPU/PMP、地址重映射、安全启动的关系
- MPU/PMP(核内):管该核代码可访问的页/区域,做线程/OS 隔离,软件可配置但管核。
- 总线防火墙/IOPMP(核外):管所有总线主控,包括 DMA,通常由安全固件/可信启动阶段一次性配置并锁定,普通软件不可改。
- 地址重映射窗口可与防火墙叠加:同一物理外设经不同安全窗口可见性不同(见 地址译码重映射)。
- 信任根:防火墙配置本身必须由可信代码(BootROM→安全监调器链)在启动时建立并锁定,否则恶意软件先把规则全放行就形同虚设(见 安全启动信任链)。配置寄存器通常只允许安全特权写。
六、实现要点与常见坑
- 默认放行(缺省 permit):上电/未配置窗口外若默认允许,漏配一个安全区域就洞开;应默认拒绝(deny by default),白名单放行。
- 窗口间隙/重叠:region 之间留空洞或重叠,产生可绕过缝;地址空间要完整覆盖、优先级明确。
- master ID 可伪造/不稳定:若软件能改某外设发出的 ID,或 ID 在跨桥/跨 NoC 时丢失/被改写,隔离失效;ID 要由互连硬件强制绑定(见 NoC)。
- 只拦写不拦读:密钥泄漏往往靠读,必须读写分别严格限制。
- TOCTOU/转发时序:防火墙必须在事务真正作用于从设备前判定;若先转发再补错误,写已经生效。
- 安全属性默认值错:复位后 NS 默认按 0(安全)会让未初始化主控被当安全;要明确冷启动默认并在启动早期锁定。
- 配置寄存器自身暴露:防火墙规则寄存器能被非安全软件改写,全盘失守;只允许安全特权访问并在启动后锁定。
- DMA 共享内存窗口开太大:为通信给 DMA 开的窗口覆盖了相邻安全数据,应最小化窗口/粒度。
- 读错误响应但发起者不处理:DMA 忽略错误响应继续用未定义数据;发起端也要有错误处理(见 AXI 错误)。
- 调试口绕过防火墙:JTAG/调试主口能直接访问全部地址,量产必须关闭或安全认证(见 JTAG、调试模块)。
- 事务中途属性变化:AxPROT 等必须在地址相位固定且与数据一致,桥接不能丢失安全位。
- 只隔离不告警:没有违规日志/中断,攻击发生却无感知;应记录 master/地址并安全告警。
相关与延伸
核内保护见 MMU/TLB、MPU/PMP;属性经桥传递见 APB 桥;启动配置信任根见 安全启动;告警路由见 事件路由。
总结
总线防火墙是插在互连或从设备端口上、按「主设备硬件 ID + TrustZone 安全/非安全 NS 属性(AxPROT/HPROT/PPROT)+ 读写类型 + 地址窗口」逐条查表放行或拒绝的硬件访问控制点,专门补上 MPU/PMP 管不到的 DMA 和其他主控:非安全事务访问安全密钥/efuse/安全 SRAM 时在写使能/读数据真正到达前就被拦截,返回 SLVERR/DECERR、锁存违规记录并向安全处理器告警;规则必须由可信启动阶段按默认拒绝、最小窗口白名单配置并锁定,master ID 由互连强制不可伪造、调试口量产关闭——默认放行、窗口留缝、ID 可伪造、只拦写和配置寄存器自身暴露是五大被绕过根因。