通过 OpenOCD 的 STM32 读出保护

STM32 Read-out protection via OpenOCD

STM32 系列微控制器具有读出保护功能,因此无法通过调试接口(JTAG 或 SWD)读出专有代码。

使用 OpenOCD,如何通过 SWD/JTAG 接口 enable/disable 读出保护? RDP 读出保护有多安全?

如果可能,请给出对整个STM32系列有效的答案。

RDP 级别

首先,您必须知道要设置的读出保护级别(例如,请参阅 STM32F4 reference manual 的第 3.7.3 节):

  • RDP 级别 1:此级别是可逆的。一旦禁用它,系统内存将被大量擦除,您可以重新编程
  • RDP 级别 2:此级别是不可逆的,并且会完全禁用调试接口。更新固件的唯一方法是通过一些引导加载程序机制。

通常你想要激活 RDP 级别 1。为了避免错误,这肯定会使微控制器变砖,我不会在这个答案中展示如何启用 RDP 级别 2。详见参考手册

使用 OpenOCD 激活它

激活功能实际上是使用 lock 命令内置到 OpenOCD 中的。就像执行 program 命令来刷新固件一样,您可以使用 stm32f1x lock 命令(或 stm32f2x lock for STM32F2/F4)来激活它。

典型的 OpenOCD 配置文件如下所示(您需要在 运行 之前刷入正确的固件):

# Set RDP to level 1
init
reset halt
stm32f1x lock 0
reset halt
exit

请注意,只有在微控制器复位或断电后,读出保护才会生效(这就是命令序列中有第二次复位的原因)。

典型的 OpenOCD 调用可能如下所示:

openocd -d0  -f stlink-v2.cfg -f ocd-stm32f0.cfg -f ocd-lock.cfg

其中 ocd-lock.cfg 包含上面显示的命令序列。

激活后,您可以通过使用常用的编程命令序列尝试刷新 MCU 来验证 RDP 是否处于活动状态

停用 RDP

停用它非常简单:只需使用 stm32f1x unlock(或 stm32f2x unlock 用于 F2/F4 设备),如下所示:

# Set RDP to level 0
init
reset halt
stm32f1x unlock 0
reset halt
exit

它有多安全?

这是一个棘手的问题,如果没有额外的信息就无法真正回答。我可以给出的一个总结答案是,如果您假设保护没有固有错误并且有人仅使用软件工具,那么它是非常安全的。

在不批量擦除闪存的情况下重置 RDP 位的最流行方法之一是 disable the RDP with a laser. Given the fact that the STM32 family is not a family of dedicated security microcontrollers with specific countermeasures, this is rather easy if you have the right equipment and sufficient experience in this area. Even some specific security MCUs have some security issues, see e.g. the Security from the IC backside 交谈。然而,大多数低级攻击者通常会避免这样做的代价。

另一种解决方案是使用 Segger Jlink 6.60c(或更高版本,如果可用) 用J-Link解锁STM32软件。 只要 运行 它,它就会通知以下内容:"If read protection of the device is enabled, reset the option bytes will cause a mass erase"。单击确定。它将询问设备系列。输入设备系列(我为 STM32L4R9ZI 选择 12)并按 Enter。

如果一切顺利,输出将是这样的:

Please select the correct device family: 12
Connecting to J-Link via USB...O.K.
Using SWD as target interface.
Target interface speed: 1000 kHz.
VTarget = 3.396V
Reset target...O.K.
Reset option bytes to factory settings...
Resetting FLASH_OPTR...
Reset target...O.K.
Reset target...O.K.
Resetting Write protection (WRP) and PCROP...O.K.
Reset target...O.K.
Option bytes reset to factory settings.
Press any key to exit.