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 размещают вне защищённых сегментов.
Источники
- 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 — один из источников системного сброса
- STMicroelectronics. CMSIS device header stm32l073xx.h, cmsis-device-l0 v1.9.4 (GitHub, Apache-2.0) — FIREWALL — регистры блока, бит FW_CR_FPA (Firewall pre-arm)
Нашли ошибку?
Смотрите также
- Защита от чтения (RDP)Запрет чтения прошивки STM32 отладчиком и загрузчиком
- PCROP (защита кода от чтения)Защита секторов флеш-памяти STM32: код выполняется, но не читается как данные
- Байты конфигурации (option bytes)Настройки защиты и режимов STM32 во флеш-памяти
- Блок защиты памяти (MPU)Права доступа к областям памяти в Cortex-M
- STM32L0Cortex-M0+, до 32 МГц, малое потребление: L010, L0x1, L0x2 с USB, L0x3 с ЖКИ — линейки и распиновки
- Flash и загрузчик STM32Страницы и секторы, BOOT0, системный загрузчик, AN3155, IAP, option bytes, RDP
- Безопасная загрузкаЗапуск только подписанной прошивки: подпись, ключи в OTP, откат версий