Чтение Прошивки Stm32

Практически каждый микроконтроллер со встроенной флэш-памятью имеет защиту от чтения прошивки.

Это сделано для защиты интеллектуальной собственности, криптографических ключей и алгоритмов от злоумышленников.

Особенно часто атакам подвергаются микроконтроллеры серии STM32, получившие распространение в последнее время, однако практического опыта и информации относительно защищенности STM32 от таких атак в открытом доступе нет. В этой статье мы рассмотрим системы защиты прошивки на примере серии STM32f0.



Концепция защиты

Flash Readout Protection (RDP) — ключевой компонент защиты, включенный во все линейки микроконтроллеров.

Он защищает системную прошивку, хранящуюся во внутренней флэш-памяти, от чтения.

В зависимости от линии могут быть включены дополнительные механизмы, такие как блок защиты памяти (MPU) и привилегированные/непривилегированные режимы выполнения.

Вместе эти системы предназначены для повышения безопасности.

RDP имеет 3 уровня защиты, уровень RDP 0, 1, 2. Безопасность повышается с увеличением количества.

Уровень РДП 0: устанавливается по умолчанию и не обеспечивает защиту.

Используя интерфейс отладки, вы можете получить полный доступ к устройству.

ПРД уровень 1: Интерфейс отладки остается активным, но доступ к флэш-памяти ограничен.

Как только интерфейс отладки подключен, флэш-память блокируется.

Его нельзя прочитать ни напрямую, через DMA, ни выполнив из него инструкции.

Уровень защиты может быть как повышен до 2, так и понижен до 0, с потерей содержимого всей флэш-памяти.

ПРД уровень 2: максимально ограничивает и обеспечивает максимальный уровень защиты.

Интерфейс отладки отключен.

Уровень не может быть понижен.

Однако, несмотря на самый высокий уровень защиты, широко используется уровень 1. Многие компании предпочитают не блокировать устройства полностью, предполагая возможность устранения ошибок и неисправностей, поскольку на уровне 2 отладка невозможна.

Кроме того, серия STM32f1 не поддерживает RDP уровня 2.

Устройство безопасности RDP

Уровень RDP является частью конфигурации системы микроконтроллера, хранящейся в выделенной секции дополнительных байтов в виде 16 бит энергонезависимой памяти в виде двух регистров, RDP и nRDP. nRDP дополняет RDP по битам.

Резервирование необходимо для защиты от изменения уровня путем замены одного бита.



Чтение прошивки STM32

Регистры конфигурации RDP

Логика работы RDP

Согласно даташиту, на уровне RDP 1 есть два режима выполнения.

Пользовательский режим и режим отладки.

Как только МК переходит в режим отладки, доступ к флешке блокируется.

Чтение из флэш-памяти, по словам производителя, должно вызвать ошибку шины, а затем прерывание Hard Fault.

Степовая атака с холодной загрузкой

В режиме RDP level 1 при подключении отладчика доступ к FLASH-памяти ограничивается, при этом SRAM остается доступным.

Мы можем попробовать вычесть данные в момент их загрузки в оперативную память.

С этой уязвимостью борются разработчики криптографических библиотек.

Ключи шифрования сохраняются в SRAM только во время использования, что составляет несколько миллисекунд, что делает такую атаку практически невозможной, даже без того, что мы не знаем об организации памяти.

Чтобы преодолеть это ограничение, авторы статьи разработали метод Cold-Boot Stepping (CBS) — метод, позволяющий делать точные снимки оперативной памяти.

Идея метода состоит в том, чтобы точно отсчитывать время от события, например RESET, и циклически делать снимок содержимого SRAM с шагом в несколько тактов.

Атака состоит из следующих шагов:

Чтение прошивки STM32

Схема настройки атаки CBS 1. Установка системы в исходное состояние 1. Выключите питание.

Это необходимо, чтобы МК снова имел возможность чтения из флэш-памяти.

2. Установка RESET перед подачей питания.

Позволяет запустить систему без запуска выполнения кода 3. Источник питания находится в состоянии RESET. 2. Запустите систему на N шагов.

1. Начинает выполнение кода, очищая RESET. 2. Подождите, пока выполнение прошивки дойдет до указанного места.

3. Сброс установки.

Останавливает выполнение, но данные в SRAM остаются нетронутыми.

3. Чтение содержимого SRAM в файл 1. Подключение отладчика к микроконтроллеру 2. Удаление сигнала сброса.

Микроконтроллер не приступает к выполнению кода, поскольку находится в состоянии остановки, установленном отладчиком.

3. Вычитание SRAM Повторив этот алгоритм необходимое нам количество раз, мы можем получить информацию о контексте выполнения программы.

Для реализации этой атаки необходимо точно контролировать время, что возможно только при использовании дополнительного микроскопа.



Эизвлечение прошивки через CBS

Разработав описанный метод, можно создать метод полного извлечения прошивки.

Во многих продуктах производители используют загрузчик, алгоритм проверки прошивки которого основан на расчете суммы проверки, например CRC32, реализованный в некоторых линейках МК.

Используя CBS (Cold-Boot Stepping) на этапе загрузчика, можно полностью восстановить прошивку путем анализа аппаратных регистров контрольной суммы или ее программной реализации, поскольку на определенном этапе она сохраняет байты интересующей нас части прошивки.

.



Чтение прошивки STM32

Настройка атаки CBS На фото автономная установка для извлечения прошивки.

Ноутбук динамически корректирует шаг в зависимости от успеха предыдущего шага.

Для микронов с небольшим объемом памяти, например STM32F051R8T6 с 64кб, извлечение займет несколько дней.

Оказывается, хотя RDP уровня 1 обеспечивает защиту от чтения SRAM, его можно взломать.

Использование RDP уровня 2 позволяет защитить устройство от подобных атак; производители часто используют уровень RDP 1. Например, в популярном программном обеспечении для отладки OpenOCD предусмотрена только команда «Lock» для защиты флэш-памяти устройства.

Однако команда поддерживает только уровень RDP 1.

Снижение уровня защиты

Давайте теперь рассмотрим методы снижения уровня RDP. Производитель утверждает, что установка уровня RDP 2 необратима.

В идеале нам нужно понизить уровень 2 до 0, но избыточность регистров RDP требует замены 8 бит. Чтобы понизить 2-> 1, вам нужно изменить всего 1 бит.

Чтение прошивки STM32

Таблица сопоставления состояний RDP Используя метод оптического воздействия UV-C, можно изменить состояние битов с «0» на «1».

Когда излучение с длиной волны 254 нм попадает на затвор, в него вводятся электроны, и состояние логической ячейки меняется с 0 (заряжено) на 1 (незаряжено).

Кристалл необходимо предварительно очистить с помощью химического травления.



Чтение прошивки STM32

Однако необходимо локализовать область кристалла, где расположены байты RDP. Производитель не документирует внутреннюю структуру кристалла.

Напишем программу, которая будет читать области памяти и определять, изменилось ли что-нибудь.

В это время различные части микроскопа будут постепенно подвергаться воздействию радиации.

После того как положение байтов RDP найдено, можно составить маску для целевого воздействия на микрон.

В меру своих сил авторы статьи смогли понизить уровень безопасности RDP без дополнительных ошибочно измененных битов.



Защита от перехода на более раннюю версию

Защиты от понижения версии RDP нет, но можно написать программу для проверки значения битов RDP и FLASH_OBR, которые сохраняют текущий уровень защиты, как можно раньше на этапе инициализации и прекратить выполнение, что делает метод извлечения CBS бесполезным.

.



Взлом интерфейса отладки

Микроконтроллеры производителя ST требуют отладки через интерфейс SWD [2].

Когда отладчик подключается к микроконтроллеру с уровнем RDP 1, защита флэш-памяти ограничивает доступ.

Плохо документированный механизм отладки вызывает много вопросов и требует дальнейшего изучения.

Авторы статьи создали собственную реализацию интерфейса SWD для изучения работы защиты.

Получается, что защита срабатывает только при взаимодействии отладчика с шиной AHB-Lite [1].

При обращении только к регистрам SWD защита не активируется, но как только запрашивается доступ к периферии, микроконтроллер SRAM или Flash переходит в режим отладки и флэш-память блокируется.

Для определения логики защиты авторы сократили количество запросов SWD до необходимого минимума для успешной инициализации.

В процессе инициализации защита не срабатывает. Согласно документации Cortex-M0 [3], инструкции процессора имеют приоритет над интерфейсом отладки.

Получается, что отладчику необходимо дождаться свободного цикла на шине, чтобы выполнить свой запрос.

Если отладчик получит доступ к шине до защиты флэш-памяти, он сможет читать данные из незаблокированной памяти.

Авторы статьи исследовали работу защиты с помощью прошивки, эмулирующей нагрузку на шину, состоящую из интенсивного чтения и NOP-операций.

Если в прошивке нет таких операций, то чтение памяти отладчиком занимает 2 цикла: разрешение адреса и прямое чтение.

Если вы добавите одну операцию NOP, то один из трех запросов на чтение завершится неудачей.

Зависимость вероятности успешного чтения от количества операций NOP можно выразить формулой

Чтение прошивки STM32

Использование операций STR в качестве нагрузки покажет, что флэш-память сама контролирует доступ.

Прошивка также очень быстро моргает светодиодом, и момент, когда он перестает мигать, говорит о том, что память заблокирована и выполнение кода остановлено.

Одним из объяснений этой уязвимости может быть неправильная реализация координации источника тактовой частоты и остальной логики.

Авторы представили рабочую реализацию извлечения кода с использованием двух STM32F0 Discovery. Данные передаются на ПК через интерфейс UART, а SWD реализован на одном из STM.

Чтение прошивки STM32

Атака состоит из следующих шагов:

  1. Перезагрузите систему, выключив и выключив питание, чтобы сбросить защиту флэш-памяти.

  2. Инициализация интерфейса отладки.

  3. Установка длины слова отладки в 32 бита
  4. Установка адреса чтения из флешки
  5. Попытка прочитать из памяти
  6. Чтение считанных данных через SWD
  7. Повторяем, пока не прочитаем всю память, увеличивая адрес
Средняя скорость чтения составляет около 45 байт в секунду, что позволяет прочитать самый емкий «камень» размером 256 Кб за 2 часа.

Однако эксперименты проводились только на серии STM32F0 и предполагается, что из-за схожего внутреннего состояния все линейки МК подвержены подобным атакам.

Другие серии могут не быть затронуты.

Этой атаки можно избежать, используя второй уровень RDP, но, как было показано ранее, уровень защиты можно изменить.

Хотя метод CBS требует, чтобы программный код работал, уязвимость в отладчике также может сработать, если прошивка повреждена при понижении уровня RDP.

выводы

Серия МК STM32F0 содержит ряд уязвимостей, позволяющих создать установку для чтения прошивки в лаборатории с базовым оборудованием.

Методы можно комбинировать для достижения наилучшего результата или позволить работать на уровне RDP 2. Все необходимые материалы, исходный код и примеры предоставлены публично авторами статьи по лицензии MIT. https://science.obermaier-johannes.de/ .

Оригинальная статья: Проливаем слишком много света на защиту встроенного ПО микроконтроллера | ЮСЕНИКС [1] АРМ ЛИМИТЕД.

Спецификация протокола AMBA 3 AHB-Lite, версия 1.0, 2006 г.

[2] АРМ ЛИМИТЕД.

Техническое справочное руководство по компонентам CoreSight, 2009 г.

[3] АРМ ЛИМИТЕД.

Техническое справочное руководство Cortex-M0, 2009 г.

Теги: #информационная безопасность #Программирование микроконтроллеров #stm32 #взлом #уязвимости #обратный инжиниринг #прошивка контроллера

Вместе с данным постом часто просматривают: