stm32 等 MCU 读保护(RDP)、JTAG/SWD 绕过方案梳理

1. 背景介绍

stm32 及其背后的 Cortex-M 系列芯片被广泛应用在不同厂商的 IoT/嵌入式产品中, 以 stm32 为代表的 MCU 一般内置 Flash 和 SRAM 等基本存储单元, flash 用于存储应用代码(如果未使用外部 flash 的话)。 为了防止片内 flash 的代码、数据被泄漏, stm32 提供了不同等级的读写保护功能:

  • Read-out protection (RDP): 读保护,可控制 Flash、SRAM 和一些寄存器的读写权限;几乎存在于stm32每个系列中
    1) Level 0: 无保护
    2) Level 1: 内存启动或者JTAG/SWD调试模式下, 禁止读写 Flash、Backup SRAM、Backup Registers,但是可以读取 SRAM(不能写)
    3) Level 2: 内存启动或者JTAG/SWD调试模式下, 禁止读写任何资源,不可逆操作,无法重写芯片

  • Write protection: 写保护、擦除保护
    可针对 Flash 空间的单个扇区进行写保护控制,防止代码更新或擦除;支持的扇区数量有限,可通过 片上代码或者 St-link 调试工具更改

  • Proprietary code read-out protection (PCROP): protection against read and write operations on Flash and SRAM memories.
    可针对 Flash 空间的特定便宜的空间进行读保护控制,一般用于保护私有代码,被保护代码可以和其他函数相互调用,但是需要关闭 RDP 才可清除 PCROP 保护。(一般存在于 F4, L0, L1, L4等系列,F405、F407 例外)

  • Firewall: access protection to sensitive code and data against external processes
    stm32 L0、L4 系列提供的额外读写保护控制,具有更细粒度的权限管控策略


2. 主要方案

2.1 STM32 F0 系列: 多种方式绕过读保护 (RDP level=1)

来源:Shedding too much Light on a Microcontroller’s Firmware Protection
实际上这篇 paper 里介绍了多种绕过方式:
1) Cold-Boot Stepping: 精确控制芯片的工作周期,利用 CRC 校验等过程,遍历 flash 空间。每次对内存进行快照,并对 CRC 结果进行逆向,即可得到固件原数据。
2) 利用段波紫外射线,偏转 option bytes 相关比特位,实现禁用 RDP
3) JTAG/SWD 调试总线的竞争漏洞,自制调试器可实现数据读取

2.2 STM32 F1 系列: 异常处理机制绕过读保护 (RDP level=1)

来源:Exception(al) Failure - Breaking the STM32F1 Read-Out Protection
1)导出固件完整度大概在 90%~95% 之间
2)使用 Jlink 工具效果优于 st-link v2

2.3 STM32 F1 系列:利用 BOOT0 针脚绕过 JTAG/SWD 调试口保护 (RDP level=0)

来源:How to bypass Debug Disabling on SM32F103
1)文章中关于绕过 JTAG/SWD 调试的部分,前提是芯片没有开启 RDP 读保护;通过控制bootX引脚,进入其他引导模式,此时允许 JTAG/SWD 调试功能(flash 固件未启动运行),然后通过读出固件,patch 固件使其允许调试,最后写回芯片即可;
2)文章中关于 RDP 和 PCROP 绕过的介绍无实际价值

2.4 ESP32 绕过 secure boot

来源:Pwn the ESP32 Forever: Flash Encryption and Sec. Boot Keys Extraction
(TODO 待更新

2.5 第三方 DFU 实现

这里主要记录一种实际遇到的安全问题,某厂商为了给不支持 DFU 的 STM32 芯片实现 USB 升级的功能,因此在用户自己的 “bootloader” 中实现了 DFU;而该 DFU 实现忽略了 RDP 读保护的问题,导致可以被用于固件导出(Upload)
参考:
https://blog.stdio.io/1279
https://blog.csdn.net/zhengyangliu123/article/details/78788815


3. 参考资料

《stm32 等 MCU 读保护(RDP)、JTAG/SWD 绕过方案梳理》有2个想法

  1. Shaping the Glitch: Optimizing Voltage Fault Injection Attacks 的这篇论文提到 STM32F1 还可以通过电压攻击的方式跳过 RDP 检测。对攻击设备的要求比较高但是可以实现(至少 F103 100% 可以提取)。

    1. 对,电压故障注入成功率是挺高的,就是需要自己设计周边硬件,这块我还没有开始玩,所以只是列了个链接 =_=

发表评论

电子邮件地址不会被公开。 必填项已用*标注