Перейти к содержанию

PCROP (proprietary code readout protection)

Библиотеку производителя, записанную во флеш-память STM32, можно вызывать из своей программы — и так же легко прочитать её байты. PCROP закрывает эту дыру: процессор выполняет защищённый код, но прочитать его как данные не может никто.

Обновлено Редакция GAW

PCROP (proprietary code readout protection) — защита секторов флеш-памяти STM32, при которой код из них выполняется, но читать их как данные нельзя. По RM0377 (разд. 3.4.2) блокируется чтение данных, а выборка команд — нет. Так производитель библиотеки или алгоритма может поставить код в микроконтроллер, не раскрывая его прикладной программе.

Как устроена у STM32L0

  • Включается битом WPRMOD = 1 в FLASH_OPTR (опционные байты).
  • Гранулярность — сектор 4 КБ (32 страницы); защиту сектора задают нулём в его бите WRPROT: 0 — защищён от чтения и записи, 1 — свободен.
  • Попытка прочитать защищённый сектор как данные ставит флаг RDERR в FLASH_SR, попытка записи — WRPERR.
  • При WPRMOD = 1 защиту можно только добавлять: снять её с сектора нельзя ни на каком уровне RDP.
  • Снять PcROP можно только массовым стиранием, которое переводит защиту на уровень 0 и стирает флеш-память.

Требование к коду

Защищённый код не должен читать данные из своей зоны, включая literal pool — константы, которые компилятор обычно кладёт рядом с функцией и читает командой LDR. Поэтому его собирают с соответствующей опцией компилятора — RM0377 называет это компиляцией «согласно опции PcROP».

PCROP, RDP и Firewall

ЗащитаОт когоЧто запрещено
RDPотладчик, загрузчикдоступ к флеш-памяти снаружи
PCROPлюбой код, в том числе свойчтение выбранных секторов как данных
Firewallкод вне защищённой областилюбой доступ, кроме входа через call gate

У STM32H7 PCROP тоже есть: по RM0433 — две области, по одной на банк, задаваемые опционными байтами PROT_AREA (разд. 4.5.4). Об уровнях RDP и прошивке защищённых микроконтроллеров — в статье «Загрузчик и защита флеш-памяти STM32».

Частые вопросы

Чем PCROP отличается от защиты чтения RDP?

RDP закрывает всю флеш-память от внешнего доступа — отладчика и системного загрузчика, но своя программа читает её свободно. PCROP закрывает выбранные секторы от чтения как данных для любого кода, в том числе внутреннего, оставляя только выполнение. Их применяют вместе: PCROP защищает библиотеку от прикладного кода, RDP — всё от отладчика.

Почему код под PCROP нужно компилировать особым образом?

Обычный компилятор кладёт константы рядом с кодом и читает их командами LDR — это чтение данных, которое PCROP запрещает. По RM0377 защищённый код не должен обращаться к данным в защищённой зоне, включая literal pool, поэтому его собирают с соответствующей опцией компилятора — RM0377 так и пишет: код компилируют «согласно опции PcROP».

Как снять PCROP?

У STM32L0 — только массовым стиранием. При WPRMOD = 1 можно добавить защищённые секторы, но не убрать их: запись, снимающая защиту, запускается, но ничего не меняет. Массовое стирание стирает флеш-память, переводит защиту на уровень 0 и выключает PcROP — вместе с самим защищённым кодом.

Источники

  1. STMicroelectronics. RM0377: Ultra-low-power STM32L0x1 advanced Arm-based 32-bit MCUs. Reference manual, Rev 10 — разд. 3.4.2: флеш-память можно защитить от чтения вредоносным кодом — блокируется чтение данных, но не выборка команд; защищённый код не должен обращаться к данным в защищённой зоне, включая literal pool; код компилируют с опцией PcROP; включается битом WPRMOD = 1 в FLASH_OPTR; гранулярность — сектор (32 страницы = 4 КБ), защита сектора — 0 в соответствующем бите WRPROT; любое чтение как данных из защищённого сектора ставит флаг RDERR в FLASH_SR, защищённый от чтения сектор защищён и от записи (WRPERR); табл. 22 — бит 0 — 0x0800 0000–0x0800 0FFF и т. д.; при WPRMOD = 1 нельзя снять защиту с сектора, только добавить; единственный способ снять — массовое стирание, которое переводит защиту на уровень 0 и выключает PcROP
  2. STMicroelectronics. RM0433: STM32H742, STM32H743/753 and STM32H750 Value line advanced Arm-based 32-bit MCUs. Reference manual, Rev 9 — разд. 4.5.4 Proprietary code readout protection (PCROP); в описании флеш-памяти — две области PCROP, по одной на каждый банк пользовательской флеш-памяти; опционные байты PROT_AREAx задают области
  3. STMicroelectronics. CMSIS device header stm32l073xx.h, cmsis-device-l0 v1.9.4 (GitHub, Apache-2.0) — бит FLASH_OPTR_WPRMOD регистра FLASH_OPTR

Нашли ошибку?