通过OpenOCD实现STM32读出保护

Uli*_*ler 6 embedded stm32 openocd

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

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

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

Uli*_*ler 15

RDP水平

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

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

通常你想激活RDP级别1.为了避免错误,这肯定会困扰微控制器,我不会在这个答案中展示如何启用RDP级别2.有关详细信息,请参阅参考手册.

使用OpenOCD激活它

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

典型的OpenOCD配置文件看起来像这样(在运行之前需要刷新正确的固件):

# Set RDP to level 1
init
reset halt
stm32f1x lock 0
reset halt
exit
Run Code Online (Sandbox Code Playgroud)

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

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

openocd -d0  -f stlink-v2.cfg -f ocd-stm32f0.cfg -f ocd-lock.cfg
Run Code Online (Sandbox Code Playgroud)

其中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
Run Code Online (Sandbox Code Playgroud)

它有多安全?

如果没有其他信息,这是一个难以回答的难题.我可以给出的一个总结答案是,如果您认为保护没有固有的错误而且有人仅使用软件工具,则它非常安全.

在没有质量擦除闪存的情况下重置RDP位的最常用方法之一是使用激光禁用RDP.鉴于STM32系列不是具有特定对策的专用安全微控制器系列,如果您拥有合适的设备和足够的经验,这一点非常简单.甚至一些特定的安全MCU也存在一些安全问题,例如参见IC背面谈话中的安全性.但是,大多数低级攻击者通常会避免这样做的代价.