相关阅读(点击文字查看)
(二)使用STM32L5 TrustZone 特性控制调试端口访问,保护片上代码安全
(三)使用STM32L5的OTFDEC和ICACHE功能实时高效运行片外Flash中的加密代码
(四)OTFDEC efficiency 基于 STM32H735G-DK 板的验证
本文将为大家介绍使用STM32H7新特性保护片上代码的机密性。
谈到STM32的高性能家族产品,大家已经对STM32F2/F4/F7耳熟能详。之后的STM32H7系列继承和发展了高性能产品家族的特性。然鹅,如何使用STM32H7进行安全存储、代码保护?你造吗?
使用STM32H7新特性保护片上代码的机密性包括:
调试端口连接可控
o 在RDP0条件下也可实现对调试端口的保护,上电调试接口即不可连接(具有类似RDP2的效果)
o 比RDP2更灵活,可以由用户代码控制调试端口访问权限,实现安全调试,并保留修改选项字节的 可能性
用户片上Flash进一步隔离-保护敏感代码不被木马程序攻击
安全STM32H7可以实现以下功能
o 安全启动
o 安全用户存储区
o 安全调试
STM32H7 硬件安全特性与机制主要包括:
· 安全STM32H7的启动路径
· 安全STM32H7的 “安全用户存储区”
· 安全STM32H7的安全调试
安全STM32H7 启动流程
· 安全STM32H7新增选项字节:SECURITY、SEC_AREA
· 系统复位,装载选项字节的过程中,如果SECURITY置位,则无论BOOT引脚电平以及 BOOTADDR选项字节的内容,一定从位于片上系统Flash的RSS启动
· RSS会检查SEC_AREA的内容,是否已经有指定的有效区域(有效区域是指起始地址小于 结束地址)。如果区域有效,则跳转到它所指向的用户Flash上的“安全用户存储区”执行。如果区域无效,则按照常规启动流程,根据BOOT引脚电平,选择从BOOTADDR0或 BOOTADDR1指向的地址启动
· BOOTADDR0和BOOTADDR1可以填写[0x0,0x3FFF 0000]范围内的任意地址。RDP2情况 下,系统只能从片上用户Flash启动。如果BOOTADDR0或者BOOTADDR1指向的不是片上 用户Flash,系统会强制从0x0800 0000启动
· SECURITY=1时,系统复位时调试端口关闭
· 运行在RSS和安全用户存储区时,调试端口关闭
安全用户闪存区
上电复位状态
o 只要使能Security并设置了安全用户闪存区的有效范围,则总是跳转到该区域的首地址运行
o 在这个区域(region A)内执行的时候,无法通过Debug连接芯片(即使RDP0状态下)
o 复位和运行在region A的时候,芯片处于“安全访问模式”
从安全用户闪存区,不使能对它的保护,直接跳转到普通UserFlash区(region B)
处于region B的PC依旧可以访问安全用户闪存区(region A)内容
在region B内执行的时候,仍然无法通过Debug连接芯片(即使RDP0状态下)
运行在region B的时候,虽然不在安全用户闪存区范围内,仍然处于“安全访问模式”
从安全用户闪存区,开启对它保护后,再跳转到普通UserFlash区(region B)
处于region B的PC无法访问安全用户闪存区(region A)内容,直到下一次复位后PC在region A执行
在region B内执行时,调试连接是可能的 (取决于跳转之前应用代码是否人为关闭了调试端口)
运行在region B的时候,不再处于“安全访问模式”
安全用户闪存区的设置和撤销
芯片出厂时选项字节的缺省设置:SECURITY=0,“安全用户闪存区”是无效区域
设置 “安全用户闪存区”必须在SECURITY置位之后;否则设置无效
“安全用户闪存区”有效的情况下,或者PCROP区域有效的情况下, SECURITY的清 零无法成功;需要先把这两种区域都设置成无效,再对SECRUITY清零
“安全用户闪存区”的撤销,只需要运行在RSS或“安全用户闪存区” 的代码,把选项字节在Flash接口中对应的寄存器,其起始地址设置成大于结束地址,并让选项字节生效即可
PCROP区域的撤销,需要通过RDP降级和PCROP区域无效,同时进行才能完成
安全STM32H7 代码保护示例
安全调试例程简介
解压缩软件包,使用熟悉的IDE分别打开Boot和App两个工程,编译后下载
打开串口调试助手:115200波特率,8bit数据位,1bit停止位;无校验位,无流控
STM32H753-Nucleo板
o 按下复位键,松开,程序运行
o 松开复位键时保持用户按键按下
o 根据屏幕菜单显示操作
使用STM32CubeProgramer 的”hotplug”和”under reset”方式尝试连接目标芯片,以验证调试端口的保护效果;以及对隔离区内容的保护
▲ Boot工程 菜单
▲ App工程
▲ 带身份认证的调试使能控制
▲ 安全调试例程:安全用户闪存区的设置和撤销
注意事项
· SEC_AREA 没有安全区时,只能由RSS来初始化;有了安全区后,运行在其中的代码可以修改 SEC_AREA ;STM32CubeProgrammer 是无法操作SEC_AREA 成功的
· SECURITY=1,IDE下载可能会失败;要么从STM32CubeProgramer连接后,清零SECURITY;要么修改工程的复位连接方式
小结
STM32H7通过以下两方面对片上代码施加保护:
保护Bootloader里的敏感操作和数据
o Bootloader运行时,调试不可连接
o 执行普通代码时,打开调试端口;普通代码 无法访问Bootloader区域内容
保护片上代码不被普通用户调试,仅开放给持有密钥的特定用户
o 安全用户区里内容可以被其他区域代码访问
o 打开调试后,安全区代码无法被调试访问
▲ 点击上方链接观看完整视频
使用STM32H7安全用户存储区,点击下方链接下载:
https://stmcu.com.cn/Designresource/detail/LAT/710479