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 调试口保护

来源:How to bypass Debug Disabling on SM32F103
(TODO 待验证, 且文章中关于 RDP 和 PCROP 的绕过假设未经测试,多处描述存疑)

2.4 ESP32 绕过 secure boot

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


3. 参考资料

发表评论

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