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

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

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

最佳答案

RDP级别

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

  • RDP级别1:此级别是可逆的。禁用它后,系统内存将被大量擦除,您可以重新编程
  • RDP级别2:此级别不可逆,并且完全禁用调试接口(interface)。更新固件的唯一方法是通过某种 bootstrap 机制。

  • 通常,您要激活RDP级别1。为了避免肯定会使微 Controller 陷入困境的错误,我不会在此答案中展示如何启用RDP级别2。有关详细信息,请参见引用手册。

    使用OpenOCD激活它

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

    典型的OpenOCD配置文件如下所示(运行此文件之前,您需要刷新正确的固件):
    # Set RDP to level 1
    init
    reset halt
    stm32f1x lock 0
    reset halt
    exit
    

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

    典型的OpenOCD调用可能如下所示:
    openocd -d0  -f stlink-v2.cfg -f ocd-stm32f0.cfg -f ocd-lock.cfg
    

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

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

    停用RDP

    停用它非常简单:只需使用stm32f1x unlock(或F2/F4设备的stm32f2x unlock),如下所示:
    # Set RDP to level 0
    init
    reset halt
    stm32f1x unlock 0
    reset halt
    exit
    

    它有多安全?

    这是一个棘手的问题,没有其他信息就无法真正回答。我可以给出一个简要的答案是,如果您认为保护没有固有的错误并且仅使用软件工具,那将是非常安全的。

    在不对闪存进行整体擦除的情况下重置RDP位的最流行方法之一是disable the RDP with a laser。鉴于STM32系列不是具有特定对策的专用安全微 Controller 系列,如果您在该领域拥有合适的设备和足够的经验,这将非常容易。甚至某些特定的安全MCU也存在一些安全问题,请参见例如Security from the IC backside谈话。但是,大多数低级别攻击者通常会避免这样做的成本。

    关于embedded - 通过OpenOCD进行STM32读出保护,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32509747/

    10-11 19:43