Вычитываем прошивку STM32

в 19:18, , рубрики: stm32, взлом, информационная безопасность, обратная разработка, программирование микроконтроллеров, прошивка контроллера, уязвимости

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

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

Flash Readout Protection (RDP) ключевой компонент в защите, включенный во все линейки микроконтроллеров. Он защищает системную прошивку, сохраненную во внутренней флэш памяти от вычитывания. В зависимости от линейки, могут быть включены дополнительные механизмы, такие как Memory Protection Unit (MPU) и привилегированные / непривилегированные режимы исполнения. Вместе, эти системы призваны повысить защищенность.

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

RDP level 0 : установлен по умолчанию и не предполагает защиты. Используя интерфейс отладки, можно получить полный доступ к устройству.

PRD level 1: Интерфейс отладки остается активным, но доступ к флэшу ограничен. Как только подключается интерфейс отладки, флэш память блокируется. Она не может быть считана ни напрямую, ни через DMA, ни путем исполнения инструкций из нее. Уровень защиты может быть как повышен до 2, так и понижен до 0, с потерей содержимого всей флэш памяти.

PRD level 2: максимально ограничивает и предоставляет максимальный уровень защиты. Интерфейс отладки отключен. Уровень не может быть понижен. Однако, несмотря на самый высокий уровень защиты, уровень 1 широко используется. Многие компании предпочитают не блокировать устройства полностью, предполагая возможности для устранения багов и неисправностей, т. к. на уровне 2 отладка невозможна. К тому же, в серии STM32f1 нет поддержки RDP level 2.

Устройство защиты RDP

RDP level это часть конфигурации систем микроконтроллера, хранящаяся в выделенной option bytes секции как 16 бит non-volatile памяти в виде двух регистров, RDP и nRDP. nRDP побитно комплементарен к RDP. Избыточность необходима для защиты от смены уровня путем подмены одного бита.

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

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

Согласно datasheet, на RDP level 1 существует два режим исполнения. Режим пользователя и режим отладки. Как только мк переходит в режим отладки, доступ к флэш блокируется. Чтение из флэша по заявлениям производителя должен вызвать ошибку шины, затем Hard Fault interrupt.

Атака Cold-Boot Stepping

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

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

Схема установки для атаки CBS
Схема установки для атаки CBS

1. Установление системы в изначальное состояние

1. Отключение питания. Необходимо чтобы мк смог снова читать из flash памяти.
2. Установка RESET до подачи питания. Позволяет запустить систему без начала исполнения кода
3. Подача питания под установленным RESET

2. Запуск системы на N кол-во шагов.

1. Запускает исполнение кода путем снятия RESET
2. Ожидание пока исполнение прошивки дойдет до установленного места
3. Установка Reset. Останавливает выполнение, но данные в SRAM остаются нетронутыми.

3. Вычитывание содержимого SRAM в файл

1. Подключение отладчика к мк
2. Снятие сигнала reset. МК не начинает исполнение кода, т. к. находится в состоянии halt установленного отладчиком.
3. Вычитывание SRAM

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

Экстракция прошивки через CBS

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

Установка для атаки CBS
Установка для атаки CBS

На фотографии представлена автономная установка для извлечения прошивки. Ноутбук динамически подстраивает шаг, основываясь на успешности работы на предыдущем шаге. Для мк с малым объемом памяти, например STM32F051R8T6 на 64кб, экстракция займет несколько дней.

Получается, что несмотря на то, что RDP level 1 предоставляет защиту от чтения SRAM, она может быть взломана.

Использование RDP level 2 позволить обезопасить устройство от подобных атак, одна зачастую производители используют RDP level 1. Например, в популярном программном обеспечении для отладки, OpenOCD, предоставляет только команду “Lock” для защиты flash памяти устройство. При этом команда поддерживает только RDP level 1.

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

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

Таблица соответсвия состояний RDP
Таблица соответсвия состояний RDP

Методом UV-C оптической экспозиции можно добиться изменения бит с состояния “0” на “1”. Когда излучение в 254нм попадет на затвор, происходит внедрение электронов и состояние логической ячейки переходит с 0 (заряженное) на 1 (незаряженное). Предварительно требуется очистить кристалл с помощью химического травления.

Вычитываем прошивку STM32 - 5

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

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

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

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

Микроконтроллеры производителя ST предполагают отладку по интерфейсу SWD [2]. Когда отладчик подключается к мк с RDP level 1 защита флэш памяти ограничивает доступ. Плохо задокументированный механизм отладки вызывает много вопросов и подстегивает к его изучению.

Авторы статьи создали свою реализацию интерфейса SWD для изучения работы защиты. Оказывается, что защита активируется только если отладчик взаимодействует с шиной AHB-Lite [1]. Получая доступ только к регистрам SWD, защита не активируется, но как только запрашивается доступ к периферии, SRAM или Flash мк переходит в режим отладки и flash память блокируется.

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

Согласно документации на Cortex-M0 [3] инструкции процессора имеют приоритет по отношению к интерфейсу отладки.  Получается отладчику нужно дожидаться свободного цикла на шине чтобы исполнить свой запрос. Если отладчик получит доступ к шине раньше защиты flash памяти, то сможет считать данные из не заблокированной памяти.
Авторы статьи изучили работу защиты с прошивкой, эмулирующей нагрузку на шину, состоящий из интенсивного чтения и операций NOP. Если в прошивке нет таких операций, то чтения памяти отладчиком занимает 2 цикла: разрешения адреса и непосредственно чтение. Если добавить одну операцию NOP, то один из трех запросов на чтение не выполнится. Зависимость вероятности успешного чтения от кол-ва операций NOP может быть выражена в виде формулы

P_s=1 -frac{w}{2 + w}=frac{2}{2 + 2}

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

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

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

Вычитываем прошивку STM32 - 7

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

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

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

  3. Установка длины слова отладки в 32 бита

  4. Установка адреса чтения из флэша

  5. Попытка чтения из памяти

  6. Вычитывание считанных данных через SWD

  7. Повторить пока не прочтем всю память инкрементируя адрес

Средняя скорость вычитывания получается около 45 байт в секунду, что позволяет прочесть самый емкий «камень» в 256кб за 2 часа. Однако эксперименты проводились только на серии STM32F0 и предполагается, что из-за схожего внутреннего состояния, все мк линейки подвержены подобным атакам. Другие серии могут быть не затронуты.
Данную атаку можно избежать, используя второй уровень RDP, но как показано ранее уровень защиты может быть изменен. В то время как метод CBS требует работоспособность программного кода, уязвимость в отладчике может работать и в случае поврежденной при понижении уровня RDP прошивки.

Выводы

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

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

Оригинал статьи: Shedding too much Light on a Microcontroller's Firmware Protection | USENIX

[1] ARM LIMITED. AMBA 3 AHB-Lite Protocol Specification v1.0, 2006.

[2] ARM LIMITED. CoreSight Components Technical Reference Manual, 2009.

[3] ARM LIMITED. Cortex-M0 Technical Reference Manual, 2009.

Автор:
AleksandrVi

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js