我要提问
ARTICLE DETAIL

资讯详情

前沿编程新知与开发实战干货的深度解读。

Broad Market Secure MCUs实战:从安全启动到TrustZone的安全架构解析

Broad Market Secure MCUs实战:从安全启动到TrustZone的安全架构解析 做嵌入式开发这些年我越来越确认一件事产品里的MCU如果只靠“藏起来”保证安全迟早要出事。最近和朋友聊项目选型他又问起 Broad Market Secure MCUs也就是面向广泛市场的安全微控制器。这个词听起来像某个产品线的营销词但拆开看它其实是整个物联网设备安全思路的一次大转向让安全能力不再是高端车规芯片的专属而是下沉到每一个智能门锁、每块传感器板卡、每台工业控制器都能用得起的通用MCU上。这篇文章就围绕“Broad Market Secure MCUs”这个主题把我实际接触到的主流安全MCU平台、硬件信任根、安全启动、TrustZone配置、密钥管理以及开发调试中的那些坑一次性讲清楚。不管你是刚接触安全MCU的工程师还是想给现有产品加安全特性的负责人都能从中找到可以直接套用的思路和避坑经验。1. 拆解“Broad Market Secure MCUs”这个看似普通的概念1.1 什么是“Broad Market”定位芯片原厂喜欢把产品线分成几个层级车规级、工业级、消费级。Broad Market 这个词业内通常理解为“大出货量、中低价格、覆盖各种主流应用”的市场区间。它不像汽车芯片那样强调20年供货和AEC-Q100认证也不像高端应用处理器那样追求极致性能它面对的是每年几千万颗出货量的智能家居、传感器节点、表计、医疗贴片、便携设备。过去安全MCU是一个偏窄的品类主要出现在金融POS、电池管理、车钥匙等高安全需求的专用场合。由于安全特性会带来额外的硬件开销和软件复杂度很多低成本产品根本用不起“正经”的安全MCU。而Broad Market Secure MCUs的思路就是把这些原本只在专用芯片上出现的安全机制——安全启动、硬件加密引擎、关键存储保护、生命周期管理——做成主流MCU的标准配置让一个普通的STM32级别产品天然具备抵御固件提取和伪造的能力。我接触过几款典型产品比如NXP的LPC55S系列、ST的STM32L5、瑞萨的RA系列它们在命名上各有各的套路但共同点非常明显核心都是带TrustZone的Arm Cortex-M33出厂内置BootROM提供硬件加密加速和密钥管理单元并且开发者可以用一套相对成熟的安全SDK来配置。这类器件价格已经贴近普通MCU但安全性比传统MCU高出一个量级。1.2 安全MCU和独立安全芯片Secure Element有什么区别很多朋友会把Secure MCU和Secure Element混为一谈。我举个例子Secure Element就像一个银行的保险柜它自己非常坚固里面有独立的CPU、存储和加密引擎但你只能通过它预留的小窗口存取东西想让它同时驱动马达、采样传感器、跑协议栈那基本没门。而Secure MCU是一间带保险柜的办公室你可以在里面正常干活同时还有一个专门上锁的保险柜存放密钥和关键数据。在实际产品里这两种方案各有适用场景。如果你只是需要一个盒子来保护密钥比如蓝牙配对用的长期密钥、支付应用中的证书那独立SE完全够用甚至更省心。但如果你希望主控本身能够区分“安全代码”和“普通代码”在固件被攻破时还能尽量守住关键资产那就需要Secure MCU。Broad Market Secure MCUs瞄准的正是后者它让通用MCU本身具备了可信执行能力而不是依赖外部挂一个安全芯片。1.3 典型应用场景和威胁模型要理解安全MCU的价值必须先搞清楚你面对的攻击者是谁。对智能门锁来说攻击者可能物理接触设备用JTAG调试器读取Flash或者换上伪造固件对工业传感器来说攻击者可能通过未加密的现场总线注入指令对智能表计来说攻击者可能尝试篡改计费数据或者从固件里挖出抄表密钥。Secure MCU在这类场景下主要提供四层保护第一让攻击者无法轻易读取和篡改固件第二让攻击者即使拿到固件也提取不到关键密钥第三让攻击者无法回滚固件到旧版本以利用已知漏洞第四让通信过程具备可验证的加密链路。这些能力落到产品上就体现为“固件是签名的”“密钥是密文存储的”“调试口是需要认证才能开的”。2. 安全架构第一课信任根和Secure Boot2.1 为什么必须从BootROM开始安全启动这件事听上去枯燥但它是一切安全机制的地基。一台MCU上电后第一个运行的代码必须是可信的而这份可信必须来自不需要验证自己的源头也就是信任根Root of Trust。在我的实践里这个信任根通常就是芯片出厂时固化的一段BootROM它烧在ROM里用户无法修改也没有外部接口能改写。BootROM上电后会去Flash的指定位置读取第一级启动代码的签名信息用存储在OTP一次性可编程熔丝里的公钥哈希去验证签名。这里关键的一点是芯片里保存的不是公钥本身而是公钥的哈希。为什么只保存哈希因为公钥很长把完整的RSA-2048公钥放进去会占用大量OTP空间而哈希只有256位或384位。同时哈希被烧写后无法修改相当于把“唯一信任的签名公钥”钉死在芯片里。如果攻击者想换掉公钥除非他能物理改写OTP而这在芯片封装完好时几乎不可能。这里有个非常常见的认知误区很多人觉得“我做了CRC校验BootROM启动时检查一下固件有没有被改过”就是安全启动。实际上CRC校验没有任何防伪能力攻击者可以同时修改固件和CRC值。安全启动的核心是签名验证私钥在产线或开发者手里攻击者没有私钥就无法生成合法签名所以任何篡改都会在启动阶段被拦下。2.2 Secure Boot流程一步步拆我把一个典型的Secure Boot流程拆给团队里新来的同事看过他是这么理解整个链路的芯片复位后CPU进入BootROMBootROM完成基础时钟和外设初始化然后从Flash固定偏移处读取BL2Bootloader第二级或TF-MTrusted Firmware-M镜像。BootROM会先用SHA-256计算固件摘要再用存储在OTP中的公钥哈希验证镜像的签名。如果签名通过CPU跳转到BL2执行如果失败根据策略进入错误状态或等待烧录工具介入。接下来BL2负责初始化内存保护、配置TrustZone的SAUSecurity Attribution Unit然后加载实际的应用固件。应用固件同样需要签名验证。有的方案把应用固件签名验证也放在BL2里有的方案则让应用固件自己再校验后续的更新包。整个链路从信任根开始逐级验证形成了一个完整的“信任链”。除了签名验证防回滚机制也非常重要。在更新固件时新版固件会带有一个递增版本号。BootROM或BL2会把版本号与OTP中保存的“最低允许版本”比较如果新固件版本低于最低允许版本拒绝启动。这样攻击者就不能把设备回滚到有已知漏洞的旧固件然后通过旧漏洞提权。2.3 TrustZone和AXI non-secure enablement聊到Arm Cortex-M33为核心的安全MCU就绕不开TrustZone for ARMv8-M。这套机制把系统划分为安全世界Secure World和非安全世界Non-Secure World。安全世界的代码可以访问所有资源非安全世界的代码只能访问被标记为非安全的区域。系统级的属性归属性配置由SAU和IDAU协同完成而具体到总线层就涉及AXI non-secure enablement这个概念。我说一个实际排错中遇到的例子。一个客户在基于Cortex-M33的MCU上启用了TrustZone把某个加密外设映射到了安全区域但忘了正确配置总线层的Non-Secure访问权限结果非安全世界的代码竟然还能读到加密模块的配置寄存器。这种现象就跟浏览器里的“insecure origins treated as secure”一样危险你以为某个资源是受保护的实际却被系统在底层当成了安全可动的。在研究TrustZone系统时你需要格外注意AXI总线上Non-Secure属性的传递。Cortex-M33在发起访问时会通过IDAU给地址打上安全属性标签这个标签随后通过AXI协议中的prot信号或专用信号传递到外设和内存控制器。如果外设挂在非安全区域而IDAU配置错误安全资产就可能通过旁路泄露。好在现代MCU原厂SDK已经把这些配置封装成了函数但开发者在自定义内存映射时仍然必须看懂硬件手册里的“Security Attribution”章节。3. 硬件加密、密钥保管和安全调试3.1 硬件加密引擎不是可选项在Broad Market Secure MCU上硬件加密引擎已经是标配。最常见的包括AES通常支持128/256位密钥带ECB、CBC、GCM模式、RSA、ECC、SHA-256/SHA-512以及真随机数发生器TRNG。有人会问软件也能实现AES为什么非要硬件引擎我给个直观回答首先软件实现AES在Cortex-M33上每秒只能处理几MB到几十MB加密一个固件包、跑一次完整握手协议会很慢其次软件密码学实现容易引入时序侧信道攻击者通过测量加密耗时可能恢复出部分密钥而硬件加密引擎经过模块化设计密钥存放在专用寄存器或安全内存中普通代码无法直接访问安全性高得多。在实际开发中我习惯把TLS握手、固件签名验证、安全存储加解密都交给硬件引擎。比如用mbedTLS做TLS时通过PSA Crypto API把AES-GCM和ECC运算下沉到硬件性能提升非常明显同时CPU占用从两位数百分比降到个位数。在低功耗应用中这个差别直接决定了设备能不能在电池下跑完一次完整握手。3.2 安全密钥管理和生命周期密钥管理是安全MCU设计中最容易翻车的部分。很多人买回安全MCU只是开了Secure Boot然后把密钥明文放在应用固件里这等于给保险柜配了一把挂在门上的钥匙。安全密钥管理通常分几个层次OTP熔丝区存放公钥哈希、安全启动配置、生命周期状态一次写入后不可更改。安全Flash区/KeyVault存放加密后的密钥由芯片内部的唯一密钥UID或硬件Key解密CPU只能通过密码学服务调用无法直接读出明文。应用层密钥比如物联网平台证书、Wi-Fi密码这些可以通过安全存储服务加密后保存运行时由硬件引擎解密到临时缓冲区。除了存储生命周期管理同样重要。芯片出厂时处于Open状态调试口完全开放。生产阶段先把密钥和固件烧录进去然后把生命周期切换到Closed状态关闭JTAG/SWD读取。到了产品部署阶段可以进一步切到Locked状态彻底锁死所有调试后门。这里最重要的经验是生命周期切换大多是不可逆的所以必须在产线上做好完整测试否则切完之后连你自己都调试不了。3.3 安全调试与远程连接的几个实操点很多工程师对安全MCU最直观的感受是原来能用的JTAG突然不好用了。这时你需要配置调试认证策略。主流方案是密码验证调试设置一个调试解锁密码调试器连接时如果密码不对芯片就拒绝进入调试模式。另外还有基于签名的调试认证每次调试需要带有一个由私钥签名的挑战响应安全性更高。在远程调试场景中我建议尽量避免使用明文协议。用SSHSecure Shell替代Telnet是基本操作用secure CRT这类终端工具时也务必把Profile存好并设置正确的密钥。这里有一个常见坑很多人下载安装Secure Shell客户端后生成SSH密钥时没设置正确权限导致SSH客户端拒绝加载私钥。在Windows上尤其明显私钥文件如果继承了Everyone可读权限OpenSSH会直接报错。解决办法是收紧文件权限只保留当前用户可读写。另外在嵌入式开发环境里用SCP或SFTP传固件到开发板也建议启用密钥登录而不用密码。这样既避免密码在局域网内裸奔也能让自动化CI流程直接串起来。4. 实际开发里的安全配置和通信排查4.1 让Secure Boot真正跑起来以STM32L5为例配置Secure Boot的通常步骤是这样的在STM32CubeProgrammer里设置RDPRead-out Protection等级至少设为Level 1防止调试器读取Flash。生成密钥对用私钥对固件签名把公钥哈希烧写到OTP中。使能HDPHide Protection隐藏指定Flash区域防止敏感代码被读出。配置TrustZone的SAU把隔离区域设置好确保安全应用和非安全应用在各自世界运行。按照固件更新流程通过签名固件包执行OTA升级。这套流程每一步都有讲究。比如RDP等级如果你直接调到Level 2后期就没有任何调试手段了所以我在样机阶段通常先烧好签名固件但保持RDP Level 1等整机验证通过后再上调等级。再比如公钥哈希一旦烧错芯片在法律上就“废了”。因此我的建议是在产线脚本中加入二次确认步骤读取写入的哈希值和数据库里的原始值比对一致后才允许进入下一道工序。有很多开发者在启用Secure Boot后遇到设备变砖排查下来往往不是签名出错而是密钥根本没烧录成功或者固件地址与BL2的期望地址不一致。所以开发前期一定要先做一次“最小安全启动”实验只让BootROM验证一个最简单的LED闪烁程序跑通了再加复杂功能。4.2 通信安全TLS证书验证与开发工具安全MCU接入物联网平台时通信安全通常建立在TLS/DTLS之上。设备端要保存客户端证书或预置根CA公钥平台端要能够验证设备身份。这里出问题最多的是证书链验证环节。我自己的体验是设备端用mbedTLS做TLS服务器证书由平台根CA签发只要设备里预置的根CA列表包含对应根证书握手就能通过。但很多团队在测试阶段会自建CA签一个测试证书设备端却忘了更新根CA导致TLS握手一直报证书验证失败。还有一类坑发生在PC端开发工具上。你写了一个Python脚本来连接设备上的服务但Python的SSL库提示证书验证失败。这种报错信息通常是“if you believe the connection should be secure, but python cannot see the certificate”翻译过来就是你相信连接是安全的但Python的证书仓库里找不到能验证该证书的根证书。解决方法不是跳过验证而是把设备的CA证书导入Python的证书库或者给Python环境指定信任的CA文件。另一个容易踩的坑是开发Web配置页面时用到了浏览器安全机制。现代浏览器只有在“安全上下文”Secure Context下才允许使用某些Web API比如navigator.credentials、getUserMedia。如果MCU的Web服务器走的是HTTP浏览器默认把它当作不安全来源功能不可用。有些开发者为了测试方便在chrome://flags里把特定IP源标记为“insecure origins treated as secure”这确实能让页面跑起来但正式产品如果依赖这种设置就等于是裸奔。正规做法是给设备配一张本地证书走HTTPS访问或者用基于mDNS的设备发现机制配合安全上下文。4.3 安全功能对资源的占用我经常收到反馈“开了Secure Boot和安全存储后Flash/RAM明显不够用。”很多刚接触安全MCU的人把安全功能看作免费的午餐实际上它是要付出代价的。以TF-MTrusted Firmware-M为例这是一个为ARMv8-M安全世界设计的参考固件。精简配置下TF-M本身可能占用90KB到150KB的Flash外加十几KB的RAM。如果你把TF-M的IPC、安全存储、加密服务全开再算上PSA Crypto的依赖Flash占用会进一步上升。再加上安全世界和非安全世界的上下文切换需要额外的栈空间RAM的预算不能只按裸机应用算。这里我给一个规则选择Broad Market Secure MCU时一定要把安全固件本身的资源占用算进BOM成本里而不是只看主频和Flash容量。如果你的产品只需要Secure Boot和密钥存储不一定要跑完整TF-M可以用原厂提供的轻量级安全运行库比如ST的Secure Manager或者NXP的EL2GO搭配运行时库。这类轻量方案通常够用而且资源开销能控制在几十KB以内。同时要注意每次执行安全服务调用从非安全世界进入安全世界都有不低的上下文切换开销越频繁的调用越会拖慢系统。在设计架构时最好把加密操作批量处理不要一次一字节地往安全世界丢。我在一个电力监测终端项目里通过把多个传感器数据打包后再加密上传安全服务调用次数减少了80%整体CPU占用从60%降到了30%出头。5. 选型参考和避坑清单5.1 评估一个Secure MCU的检查表我选型Secure MCU时通常会拿一张检查表逐项打钩这里也分享给你检查项说明重要度内核架构优先选择带TrustZone的Cortex-M23/M33/M55便于硬件隔离高信任根实现是否内置BootROM、OTP熔丝能否将公钥哈希固定在OTP中高安全启动方式支持RSA/ECC签名验证、防回滚机制高加密引擎AES-GCM、RSA/ECC、SHA-2、TRNG是否齐全是否支持DMA高密钥管理是否有KeyVault或安全存储密钥能否在硬件内完成解密高生命周期管理是否支持Open/Closed/Locked状态和配置调试认证高调试口保护JTAG/SWD可以灰度开启还是只能一次性锁定中软件生态官方是否提供Secure Boot例程、TLS集成库、产线烧录工具高文档质量安全手册是否解释清楚SAU、RDP、密钥存储细节中工具链支持IAR/Keil/GCC支持是否完善能否在现有工程中快速集成中成本与供货货源是否充足价格是否匹配Broad Market定位中如果拿NXP LPC55S69、ST STM32L552、瑞萨RA4M2来对比你会发现它们在安全特性上的侧重点略有差异LPC55系列的内存保护和PowerQuad协处理器有特色STM32L5的生态成熟度极高RA系列的Secure Crypto Engine和灵活配置也很有吸引力。但不管选哪家核心判断逻辑还是一样你选的不是芯片编号而是它背后的安全机制完整性。5.2 几个“看起来吓人但实际没用”的坑我在帮不同团队review安全方案时反复看到一些投入了精力但安全效果为零的操作整理出来给大家避坑开了Secure Boot但私钥保存在产品固件同一个仓库里。一旦软件包泄露攻击者可以重新签名任意固件安全启动形同虚设。配置了TrustZone但安全世界和非安全世界之间没有定义好IPC接口。随便用一个全局函数跨世界调用安全属性直接被绕过。调试口考都没考虑过。明明MCU支持Debug Authentication结果产品发布后JTAG口还是全开放任何人都可以连上SWD读Flash。固件更新时只校验了固件的CRC或长度没有校验签名。攻击者伪造一个CRC匹配的固件包照样能刷进去。把TLS客户端证书放进了应用固件明文存储。攻击者解包固件就拿到了平台证书可以仿冒设备接入云平台。这些问题的共同点是把“安全机制”当成了“安全结果”。实际上安全机制只有正确配置、密钥妥善保存才能在真实攻击场景中发挥作用。5.3 我在实际项目中的几点体会安全MCU的选择和落地没有标准答案最终还是得回到产品本身。这里分享几条经验供大家参考如果你做的产品生命周期短、出货量大、成本极其敏感那可能不需要把安全特性全部打开只需做好Secure Boot和密钥保护把固件提取门槛抬高就够了。但如果你做的是公用事业设备或医疗设备攻击者有足够的动力投入资源那TrustZone、生命周期锁定、防回滚都应该上齐。另外安全是持续对抗不是一次性的。芯片出厂后还有固件更新、证书轮换、密钥封存销毁等运营工作。建议在项目一开始就把安全运维计划写进需求文档而不是在量产前才临时补一个Secure Boot。再次提醒在任何安全MCU项目中不要因为“我用的是安全芯片”就放松了整体安全意识。硬件安全机制只是地基地基之上你的代码、密钥、产线流程、供应链任何一个环节出问题整个安全体系都可能被攻破。安全从来不是一个芯片能解决的问题但一台Broad Market Secure MCU至少能让你的产品从一开始就站在一个更扎实的起点上。
返回列表