STM32 系列微控制器具有读出保护功能,因此无法通过调试接口(JTAG 或 SWD)读出专有代码。
使用 OpenOCD,如何通过 SWD/JTAG 接口启用/禁用读出保护?RDP 读出保护的安全性如何?
如果可能,请给出一个对整个 STM32 系列都有效的答案。
首先,您必须知道要设置的读出保护级别(例如参见STM32F4 参考手册的第 3.7.3 节):
通常您要激活 RDP 级别 1。为了避免肯定会使微控制器变砖的错误,我不会在此答案中展示如何启用 RDP 级别 2。有关详细信息,请参阅参考手册。
lock
激活功能实际上是使用命令内置到 OpenOCD 中的。就像执行program
命令来刷新固件一样,您可以使用stm32f1x lock
命令(或stm32f2x lock
用于 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 是否处于活动状态
停用它也很简单:只需像这样使用stm32f1x unlock
(或stm32f2x unlock
用于 F2/F4 设备):
# Set RDP to level 0
init
reset halt
stm32f1x unlock 0
reset halt
exit
这是一个棘手的问题,如果没有额外的信息就无法真正回答。我可以给出的一个总结性答案是,如果您假设保护没有固有的错误并且有人只使用软件工具,那么它是非常安全的。
在不批量擦除闪存的情况下重置 RDP 位的最流行方法之一是使用激光禁用 RDP。鉴于 STM32 系列不是具有特定对策的专用安全微控制器系列,如果您在该领域拥有合适的设备和足够的经验,这将相当容易。甚至一些特定的安全性 MCU 也存在一些安全性问题,请参阅例如来自 IC 背面的安全性谈话。但是,大多数低级攻击者通常会避免这样做的成本。
另一种解决方案是使用带有 J-Link 解锁 STM32 软件的 Segger Jlink 6.60c(或更高版本,如果可用)。只需运行它,它将通知以下内容:“如果启用了设备的读保护,则重置选项字节将导致批量擦除”。单击确定。它将询问设备系列。输入器件系列(对于 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.