边界划分原则:芯片内安全域、外设边界、系统级边界设计

做硬件安全,最怕的就是边界模糊。说白了,安全边界就像你家的围墙,哪段是防盗门,哪段是院墙,哪段是小区围墙必须分清楚。我在好几个项目里见过因为边界划分不清导致的安全漏洞——不是攻击者太厉害,而是我们自己把门开在了不该开的地方。

这一节,我们就来聊聊这三个层次的安全边界怎么划:芯片内部的安全域、芯片与外设的交互边界、以及系统级的多芯片协作边界。嗯,一张图先帮大家理解整体结构。

硬件安全边界三层架构 芯片内安全域 安全CPU核心 安全内存/缓存 密码引擎 eFuse/OTP 信任根(RoT) 安全DMA 外设边界 IOMMU/SMMU 防火墙/过滤 安全中断路由 外设访问控制 DMA管控 共享外设隔离 系统级边界 芯片间安全通信 安全协议隔离 硬件信任链传递 物理攻击防护 安全启动校验 调试接口管控 内而外层层隔离,权限可控

芯片内安全域:最内层的“金库”

芯片内部的安全域是可信计算基(TCB)的核心。我个人习惯把这部分比喻成银行的「金库」——只有持特定钥匙的人才能进去,而且金库内部还有保险柜。

设计时我们要明确划分出安全世界和普通世界。常见的划分方式有这些:

  • 物理隔离:独立的安全CPU核、安全SRAM、专用密码加速器。我记得在某个IoT芯片项目中,我们直接割了一块单独的电源域给安全子系统,功耗虽然高了点,但侧信道攻击的难度直接升了两个等级。
  • 逻辑隔离:基于TrustZone或类似架构的虚拟化隔离。其实现在ARM Cortex-A系列大多支持,关键是把安全监控器(Secure Monitor)的代码写对——我曾见过一个项目就因为安全监控器里有一个越界写,导致非安全世界能直接改写安全内存。
  • 访问控制隔离:通过硬件防火墙、MPU(内存保护单元)或MPU增强的MMU来限制非安全模块的访问权限。

关键原则:安全域内的硬件资源(如eFuse、密钥寄存器、安全RAM)只能被经过认证的安全固件访问。非安全世界连地址都看不到,更别谈读写了。

外设边界:内部与外部的“海关”

芯片内部的资源毕竟有限,很多功能需要靠外设来完成。比如UART、SPI、I2C、USB,甚至是一般目的GPIO。这些外设是攻击者最常试探的入口。为什么?因为它们直接暴露在芯片外部,而且往往有DMA能力。

外设边界的设计核心就是:谁可以用、怎么用、用多少。我建议每个外设都挂一个硬件身份令牌(比如总线主设备ID),由系统级防火墙来裁决。

看一个典型的管控表:

外设类型 默认所有者 安全世界访问 非安全世界访问 DMA特权
安全UART(调试) 安全CPU 完全 禁止 无
普通UART(用户) 非安全CPU 只读 完全 无
USB控制器 非安全CPU 通过IOMMU过滤 完全 需安全固件授权
SPI Flash(安全) 安全CPU 完全 通过安全固件代理 允许(有限地址范围)
GPIO(敏感) 安全CPU 完全 仅读取,写需要授权 无

个小技巧:把外设的访问控制寄存器做成一次性可编程(OTP)或者由安全启动阶段配置。我曾经遇到攻击者利用系统在运行时动态修改访问权限,后来我们改成启动时锁死,系统运行后就不能再改——副作用就是换外设得重启,但安全收益很大。

系统级边界:多芯片协作的“国境线”

现在芯片越做越复杂,一块SoC往往集成了多个die,甚至板子上还有独立的安全芯片(比如TPM、HSM)。这就涉及系统级的安全边界——不同安全等级的芯片之间如何进行可信交互?

系统级边界设计要解决三个核心问题:

  1. 身份认证:通信之前,先确认对方的身份。不能光靠物理连接就信任——你想想看,调试接口插上去,攻击者也能接。所以要有硬件绑定的密钥对(比如每颗芯片的证书)。
  2. 通信保护:协议层面做加密和完整性校验。SPI总线上跑数据时,攻击者用逻辑分析仪就能抓包。我建议使用内置安全协议的接口,比如I3C、安全JTAG,或者在普通总线上加一层轻量级传输层安全。
  3. 信任链传递:系统上电后,安全启动流程要把信任从ROM一步一步传递到操作系统。每个环节都要进行签名验证,而且签名密钥必须安全存储在安全芯片内部。

注意:系统级边界最容易被忽视的是调试接口。我曾经接手过一个项目,芯片内部安全域做得滴水不漏,外设边界也很严,但调试接口(JTAG/SWD)直接接在了芯片外部,而且没有任何鉴权机制。攻击者用几十块钱的调试器就能停掉安全CPU,读取eFuse内容。后来我们加了物理熔丝来永久禁用调试接口——但千万要记得量产前再熔断,否则修bug就麻烦了。

三个边界的协同设计要点

这三个边界不是独立的,它们需要协同一体。给你一个检查清单:

  • 芯片内安全域产生的数据,离开安全域时要被外设边界审计和管控。
  • 外设边界不能绕过芯片内安全域的权限控制——比如DMA不能直接写到安全内存。
  • 系统级边界的通信密钥和认证材料必须由芯片内安全域产生和管理。
  • 所有边界上的异常事件(比如访问冲突、认证失败)都要上报到安全监控器并记录到安全日志。

归纳一下:边界越往内,越要“窄”;边界越往外,越要“严”。芯片内安全域只放最关键的资源,外设边界做细粒度访问控制,系统级边界保证整条信任链不中断。

实战建议:在开始硬件设计前,就画好一张“边界图”,把每个模块的信任等级、互通路径、访问权限标出来。在RTL设计阶段逐条验证这些边界约束。不要等到流片回来才用扫描工具检查——那时候改一版光掩膜的成本够你买一辆车了。