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

Firewall (STM32L0)

Защита от чтения (RDP) не пускает к флеш-памяти отладчик снаружи, но не мешает чужому коду внутри микроконтроллера. Для этого в STM32L0 есть блок Firewall: он закрывает выбранные сегменты памяти от всего кода, кроме своего.

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

Firewall (FW) — аппаратный блок STM32L0, который защищает выбранную часть кода и данных от остального кода в том же микроконтроллере. По RM0377 (разд. 5) он следит за шинами, к которым подключены флеш-память и SRAM, и пропускает обращения к защищённым сегментам только тогда, когда сам открыт.

Что можно защитить

СегментГде
Кодфлеш-память или SRAM, объявленная исполняемой
Энергонезависимые данныефлеш-память или data EEPROM
Изменяемые данныеSRAM

Адреса и длины сегментов задают до включения Firewall.

Как работает

  • Вход через call gate. После включения (сброс бита FWDIS в SYSCFG) Firewall закрыт. Чтобы его открыть, код переходит на второе из трёх слов в начале сегмента кода — это и есть call gate; второе и третье слово должны выполниться подряд, без постороннего чтения команд.
  • Выход. Защищённый код устанавливает флаг FPA (pre-arm) в FW_CR и переходит за пределы сегментов — Firewall закрывается. Без FPA такой переход вызывает сброс; ST советует перед выходом стереть секретные данные из регистров.
  • Сброс при нарушении. Любой недопустимый доступ к сегментам при включённом Firewall вызывает сброс — по RM0377 это «немедленно убивает» обнаруженное вторжение. Защита Firewall числится среди источников системного сброса.
  • Без DMA. Доступ DMA к защищённым сегментам запрещён всегда и тоже вызывает сброс.

Firewall и защита чтения

Firewall не заменяет защиту от чтения: при открытом Firewall отладчик продолжает читать защищённые сегменты. Поэтому RM0377 требует вместе с Firewall уровень 2 RDP. Для разработки ST предлагает заглушку с тем же API или работу на уровне 0, а для обновлений — загрузчик в защищённом от записи секторе. Похожая по цели защита — PCROP, которая запрещает чтение кода как данных, но не ограничивает вход. Внутри ядра доступ к областям памяти разграничивает ещё блок MPU.

Типичное применение — библиотека производителя (алгоритм, ключи), которую нужно выполнять, но нельзя прочитать или вызвать в обход. Об уровнях RDP и загрузчике — в статье «Загрузчик и защита флеш-памяти STM32».

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

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

RDP защищает память от внешнего доступа — отладчика и загрузчика. Firewall защищает выбранные сегменты от кода, который выполняется в самом микроконтроллере вне защищённой области. По RM0377 они дополняют друг друга: при открытом Firewall отладчик не блокируется, поэтому для настоящей защиты нужен ещё RDP уровня 2.

Что такое call gate у Firewall STM32?

Единственная разрешённая точка входа в защищённый код: по RM0377 это три 32-битных слова в начале сегмента кода, и для открытия Firewall выполнение должно перейти на второе слово. Первое слово всегда закрыто, чтобы Firewall не открылся от буфера предвыборки. Любой другой доступ к закрытым сегментам — переход в середину кода, чтение данных — вызывает сброс микроконтроллера.

Может ли DMA читать память, защищённую Firewall?

Нет. RM0377 запрещает любой доступ DMA к защищённым сегментам, открыт Firewall или закрыт; такая попытка считается недопустимой и вызывает сброс. Поэтому буферы DMA размещают вне защищённых сегментов.

Источники

  1. STMicroelectronics. RM0377: Ultra-low-power STM32L0x1 advanced Arm-based 32-bit MCUs. Reference manual, Rev 10 — разд. 5.1: Firewall защищает часть кода или данных в энергонезависимой памяти и/или изменяемые данные в SRAM от остального кода вне защищённой области; разд. 5.2: сегмент кода — во флеш-памяти или в SRAM, если объявлен исполняемым; данные — во флеш-памяти или data EEPROM (энергонезависимый сегмент) и в SRAM (изменяемый сегмент); доступ — когда Firewall открыт; открытие и закрытие — механизм call gate; начальные адреса и длины сегментов задают до включения; любой недопустимый доступ при включённом Firewall вызывает сброс; любой доступ DMA к защищённым сегментам запрещён в любом состоянии и тоже вызывает сброс; разд. 5.3.1: Firewall следит за шинами AMBA, к которым подключены памяти; разд. 5.3.6: три состояния — выключен (FWDIS = 1 после сброса), закрыт, открыт; call gate — три слова в начале сегмента кода, первое всегда закрыто (от предвыборки), для открытия нужно перейти на второе слово и выполнить второе и третье без постороннего чтения команд; закрытие — установить флаг FPA в FW_CR и перейти за пределы сегментов, без FPA — сброс; перед выходом рекомендуется стирать секретные данные из регистров; разд. 5.3.2: при открытом Firewall отладчик доступ не блокируется, поэтому вместе с Firewall нужна защита чтения уровня 2; для отладки предлагают заглушку с тем же API или разработку при уровне 0; разд. 7.1.1 — защита Firewall — один из источников системного сброса
  2. STMicroelectronics. CMSIS device header stm32l073xx.h, cmsis-device-l0 v1.9.4 (GitHub, Apache-2.0) — FIREWALL — регистры блока, бит FW_CR_FPA (Firewall pre-arm)

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