11

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

使用 OpenOCD,如何通过 SWD/JTAG 接口启用/禁用读出保护?RDP 读出保护的安全性如何?

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

4

2 回答 2

25

RDP 级别

首先,您必须知道要设置的读出保护级别(例如参见STM32F4 参考手册的第 3.7.3 节):

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

通常您要激活 RDP 级别 1。为了避免肯定会使微控制器变砖的错误,我不会在此答案中展示如何启用 RDP 级别 2。有关详细信息,请参阅参考手册。

使用 OpenOCD 激活它

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 是否处于活动状态

停用 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 背面的安全性谈话。但是,大多数低级攻击者通常会避免这样做的成本。

于 2015-09-10T18:59:48.740 回答
1

另一种解决方案是使用带有 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.
于 2019-12-24T22:09:15.533 回答