Защита от чтения (RDP)
Готовую прошивку можно скачать с микроконтроллера отладчиком за минуту, если её ничто не защищает. В STM32 для этого есть байт защиты от чтения RDP: он запрещает доступ к флеш-памяти извне, но не мешает программе работать.
Обновлено Редакция GAW
Защита от чтения (readout protection, RDP) — механизм STM32, который запрещает читать флеш-память отладчиком, встроенным загрузчиком и кодом, запущенным из ОЗУ. Уровень защиты задаёт байт RDP в байтах конфигурации. Программа, запущенная из самой флеш-памяти, при этом работает как обычно и может читать и стирать свою память.
STM32F1: защищено или нет
У STM32F1 состояний два (PM0075, разд. 2.4.1). Память не защищена, только если в байте RDP записано 0xA5, а рядом — его дополнение. Любое другое значение, в том числе стёртое 0xFF, означает защиту. Под защитой:
- отладчик по SWD или JTAG и программа, загруженная в SRAM, не могут читать флеш-память, в том числе через DMA;
- первые страницы (0–3 у low- и medium-density, 0–1 у high-density) защищены от записи, а остальные нельзя стирать и писать в режиме отладки или при загрузке из SRAM.
Снять защиту можно, но только ценой прошивки: при записи 0x00A5 микроконтроллер сначала стирает всю основную флеш-память.
STM32F4: три уровня
| Уровень | Байт RDP | Что запрещено извне | Можно ли понизить |
|---|---|---|---|
| 0 | 0xAA | ничего | — |
| 1 | любой, кроме 0xAA и 0xCC | чтение, запись и стирание флеш-памяти и резервной SRAM отладчиком, из SRAM и загрузчиком | да, до 0 со стиранием флеш-памяти и резервной SRAM |
| 2 | 0xCC | всё, что на уровне 1, а также отладка, загрузка из SRAM и загрузчиком, изменение байтов конфигурации | нет, уровень необратим |
Таблица — по RM0090, разд. 3.7.3. Уровень 1 стоит по умолчанию после стирания байтов конфигурации. Если защиту ставят при подключённом отладчике, она вступает в силу только после сброса по питанию. Уровень 2 ST советует только для готовых изделий: такую микросхему уже нельзя ни отладить, ни вернуть на анализ.
Последовательность записи байтов, ключи и типичные ошибки — в статье «Flash и загрузчик STM32».
Не путать с защитой от записи (WRP) — она лишь запрещает стирать и писать выбранные страницы или секторы, а читать их не мешает, — и с шифрованием флеш-памяти у ESP32: там содержимое внешней флеш-памяти хранится зашифрованным, а RDP закрывает доступ к внутренней памяти микроконтроллера.
Частые вопросы
Как снять защиту от чтения с STM32F103?
Записать в байт RDP значение 0x00A5 — программатором через SWD или через встроенный загрузчик. Перед тем как снять защиту, микроконтроллер сам стирает всю основную флеш-память, поэтому прошивка при этом пропадает. Затем нужен сброс по питанию, а при снятии через загрузчик достаточно системного сброса (PM0075, разд. 2.4.1).
Можно ли отменить RDP уровня 2 на STM32F4?
Нет. Уровень 2 (RDP = 0xCC) необратим: отладка JTAG и SWD отключается навсегда, загрузка из SRAM и встроенным загрузчиком запрещена, байты конфигурации больше не меняются. ST предупреждает, что не сможет даже проанализировать такую микросхему при возврате (RM0090, разд. 3.7.3).
Работает ли программа под защитой RDP?
Да. Программа, запущенная из флеш-памяти, читает и пишет свою память как обычно — может хранить настройки и обновлять себя. Запрещён доступ извне: отладчику, коду в SRAM и встроенному загрузчику.
Источники
- STMicroelectronics. PM0075 Rev 2 (August 2012). STM32F10xxx Flash memory microcontrollers, programming manual — разд. 2.4.1 и табл. 6: память не защищена, только если RDP = 0xA5 (ключ RDPRT 0x00A5) и рядом его дополнение; стёртое 0xFF и любые другие значения — защита; под защитой чтение флеш-памяти запрещено всем, кроме программы, запущенной из неё же без отладки; страницы 0–3 (low- и medium-density) или 0–1 (high-density, connectivity line) защищены от записи; из SRAM и через DMA флеш не читается; включение — запись RDP и системный сброс, при подключённом отладчике — сброс по питанию; снятие — запись 0x00A5, перед которой выполняется полное стирание флеш-памяти; снять можно и через загрузчик
- STMicroelectronics. RM0090 Rev 21 (June 2024). Reference manual: STM32F405/415, STM32F407/417, STM32F427/437 and STM32F429/439 — разд. 3.7.3 и табл. 18: уровень 0 — RDP = 0xAA; уровень 1 — любое значение, кроме 0xAA и 0xCC, по умолчанию после стирания байтов: нет доступа к флеш-памяти и резервной SRAM при подключённом отладчике, загрузке из SRAM и системным загрузчиком (ошибка шины); переход 1 → 0 стирает флеш-память и резервную SRAM, OTP и прочие байты не трогает; уровень 2 — RDP = 0xCC: плюс запрет загрузки из SRAM и загрузчиком, JTAG/SWD, изменения байтов; уровень 2 необратим, ST не может анализировать такие микросхемы; при подключённом отладчике — сброс по питанию
Нашли ошибку?
Смотрите также
- Flash и загрузчик STM32Страницы и секторы, BOOT0, системный загрузчик, AN3155, IAP, option bytes, RDP
- Байты конфигурации (option bytes)Настройки защиты и режимов STM32 во флеш-памяти
- SWDSerial Wire Debug: отладка и прошивка Cortex-M по двум проводам
- Загрузчик (bootloader)Прошивка МК без программатора через UART или USB