市场资讯
片上代码保护与片外代码代码保护,一个都不少(一)
发布日期:2021-11-15    

使用STM32H7新特性保护片上代码的机密性




相关阅读(点击文字查看)


(二)使用STM32L5 TrustZone 特性控制调试端口访问,保护片上代码安全

(三)使用STM32L5OTFDECICACHE功能实时高效运行片外Flash中的加密代码

(四)OTFDEC efficiency 基于 STM32H735G-DK 板的验证


本文将为大家介绍使用STM32H7新特性保护片上代码的机密性。

谈到STM32的高性能家族产品,大家已经对STM32F2/F4/F7耳熟能详。之后的STM32H7系列继承和发展了高性能产品家族的特性。然鹅,如何使用STM32H7进行安全存储、代码保护?你造吗?

 


使用STM32H7新特性保护片上代码的机密性包括:

  • 调试端口连接可控

RDP0条件下也可实现对调试端口的保护,上电调试接口即不可连接(具有类似RDP2的效果)

RDP2更灵活,可以由用户代码控制调试端口访问权限,实现安全调试,并保留修改选项字节的 可能性

  • 用户片上Flash进一步隔离-保护敏感代码不被木马程序攻击

  • 安全STM32H7可以实现以下功能

安全启动

安全用户存储区

安全调试

 

akxq0-d8qe1.jpg

 

STM32H7 硬件安全特性与机制主要包括:

·     安全STM32H7的启动路径

·     安全STM32H7 安全用户存储区

·     安全STM32H7的安全调试

 

aj4k3-d1js5.jpg



安全STM32H7 启动流程

·     安全STM32H7新增选项字节:SECURITYSEC_AREA

·     系统复位,装载选项字节的过程中,如果SECURITY置位,则无论BOOT引脚电平以及 BOOTADDR选项字节的内容,一定从位于片上系统FlashRSS启动

·     RSS会检查SEC_AREA的内容,是否已经有指定的有效区域(有效区域是指起始地址小于 结束地址)。如果区域有效,则跳转到它所指向的用户Flash上的安全用户存储区执行。如果区域无效,则按照常规启动流程,根据BOOT引脚电平,选择从BOOTADDR0 BOOTADDR1指向的地址启动

·     BOOTADDR0BOOTADDR1可以填写[0x0,0x3FFF 0000]范围内的任意地址。RDP2情况 下,系统只能从片上用户Flash启动。如果BOOTADDR0或者BOOTADDR1指向的不是片上 用户Flash,系统会强制从0x0800 0000启动

·     SECURITY=1时,系统复位时调试端口关闭

·     运行在RSS和安全用户存储区时,调试端口关闭

 

awuo2-0aidt.jpg



安全用户闪存区

  • 上电复位状态

只要使能Security并设置了安全用户闪存区的有效范围,则总是跳转到该区域的首地址运行

在这个区域(region A)内执行的时候,无法通过Debug连接芯片(即使RDP0状态下)

复位和运行在region A的时候,芯片处于安全访问模式



a1m8g-f21g1.jpg

 

从安全用户闪存区,不使能对它的保护,直接跳转到普通UserFlash区(region B

  • 处于region      BPC依旧可以访问安全用户闪存区(region      A)内容

  • region      B内执行的时候,仍然无法通过Debug连接芯片(即使RDP0状态下)

  • 运行在region      B的时候,虽然不在安全用户闪存区范围内,仍然处于安全访问模式

 

a1wjf-2hnwn.jpg

 

从安全用户闪存区,开启对它保护后,再跳转到普通UserFlash区(region B

  • 处于region      BPC无法访问安全用户闪存区(region A)内容,直到下一次复位后PCregion A执行

  • region      B内执行时,调试连接是可能的      (取决于跳转之前应用代码是否人为关闭了调试端口)

  • 运行在region      B的时候,不再处于安全访问模式
         
         

a1532-hwict.jpg



安全用户闪存区的设置和撤销

  • 芯片出厂时选项字节的缺省设置:SECURITY=0安全用户闪存区是无效区域

  • 设置 安全用户闪存区必须在SECURITY置位之后;否则设置无效

  • 安全用户闪存区有效的情况下,或者PCROP区域有效的情况下, SECURITY的清 零无法成功;需要先把这两种区域都设置成无效,再对SECRUITY清零

  • 安全用户闪存区的撤销,只需要运行在RSS安全用户闪存区的代码,把选项字节在Flash接口中对应的寄存器,其起始地址设置成大于结束地址,并让选项字节生效即可

  • PCROP区域的撤销,需要通过RDP降级和PCROP区域无效,同时进行才能完成

 

a6j11-dh578.jpg



安全STM32H7 代码保护示例

安全调试例程简介

  • 解压缩软件包,使用熟悉的IDE分别打开BootApp两个工程,编译后下载

  • 打开串口调试助手:115200波特率,8bit数据位,1bit停止位;无校验位,无流控

  • STM32H753-Nucleo

按下复位键,松开,程序运行

松开复位键时保持用户按键按下

根据屏幕菜单显示操作

  • 使用STM32CubeProgramer      ”hotplug””under reset”方式尝试连接目标芯片,以验证调试端口的保护效果;以及对隔离区内容的保护




a2f1k-cyx4l.jpg 


 Boot工程 菜单



a1yc5-likyg.jpg

 App工程

 

ai463-dc6h3.jpg

 带身份认证的调试使能控制

 

a1pll-656z4.jpg

 安全调试例程:安全用户闪存区的设置和撤销



注意事项

·     SEC_AREA 没有安全区时,只能由RSS来初始化;有了安全区后,运行在其中的代码可以修改 SEC_AREA STM32CubeProgrammer 是无法操作SEC_AREA 成功的

·     SECURITY=1IDE下载可能会失败;要么从STM32CubeProgramer连接后,清零SECURITY;要么修改工程的复位连接方式

 


ah418-91iuq.jpg 

小结

STM32H7通过以下两方面对片上代码施加保护:

  • 保护Bootloader里的敏感操作和数据

o  Bootloader运行时,调试不可连接

执行普通代码时,打开调试端口;普通代码 无法访问Bootloader区域内容

  • 保护片上代码不被普通用户调试,仅开放给持有密钥的特定用户

安全用户区里内容可以被其他区域代码访问

打开调试后,安全区代码无法被调试访问

 

ajs1u-b6ht6.jpg

 

 点击上方链接观看完整视频

 

使用STM32H7安全用户存储区,点击下方链接下载:


https://stmcu.com.cn/Designresource/detail/LAT/710479


微信扫一扫