Защищаем микроконтроллер. Как работает Firmware Hardening и Secure Boot на примере STM32

Астрологи провозгласили десятилетие атак на устройства IoT. Новые угрозы требуют комплексного подхода, поэтому безопасностью встраиваемых систем сегодня озабочены не только их разработчики, но и производители железа. Сегодня я на примере отладочной платы Nucleo с STM32H743 расскажу, какие векторы атаки стоит рассматривать в первую очередь и как можно защитить прошивку и конфиденциальные данные.

Безумная иллюминация в стиле Жана Мишеля Жарра или новый альбом группы Rammstein из колонок в половине пятого утра — это все милые шалости по сравнению с тем, к каким последствиям может привести взлом автоматических кормушек для питомцев или носимых медицинских устройств.

Обновления «по воздуху» и многочисленные отладочные интерфейсы умных устройств могут оказаться серьезной дырой в безопасности, которая позволит опытному злоумышленнику подменить заводскую прошивку своей собственной, — не говоря уж о банальной краже чужой интеллектуальной собственности. Глупый, глупый современный IoT!

 

Для чего нужен Secure Boot

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

  • В первую очередь следует реализовать механизм подтверждения подлинности прошивки (аутентификации). Для этого используются различные криптографические алгоритмы (например, SHA-256 и NIST P256). Они позволяют убедиться, что на устройстве будет исполняться только доверенный код.
  • Кроме того, необходимо защитить память от внешних атак и лишить злоумышленника доступа к критичным регионам, который он может в теории получить с помощью уязвимостей ПО либо при использовании отладочных интерфейсов (например, JTAG) или логического анализатора.

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

 

Как это работает

Сегодня самый простой способ обновить прошивку устройства (SFU, Secure Firmware Update) — это отправить ему свежую версию удаленно, «по воздуху». Таким образом, мы храним на сервере и распространяем уже зашифрованный бинарник, который клиент может скачать, подтвердить его целостность, аутентифицировать, расшифровать и, наконец, установить.

Базовую безопасность при этом обеспечивают следующие меры: во-первых, исключается возможность альтернативных методов загрузки. Для этого применяется подтвержденный Secure Boot, который формирует root of trust в нашей системе. Во-вторых, приватные ключи шифрования должны храниться в прошивке устройства и быть индивидуальными.

Кроме того, конкретную реализацию криптографического алгоритма следует проверять на устойчивость к АВК (атака по второстепенным каналам, side-channel attack) или АМИС (атака методом индуцированных сбоев, fault injection attack). К этому мы еще вернемся.

Наконец, следует озаботиться защитой от нежелательного внешнего доступа. К счастью, многие разработчики уже научились отключать JTAG — самый желанный подарок для злоумышленника. Однако производители не стоят на месте и предлагают сегодня дополнительные средства обнаружить воздействие, такие как Anti-Tamper. Ими пользуются пока не так часто, как хотелось бы.

 

Аппаратные средства

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

 

Защита от чтения, RDP

Это базовый механизм безопасности, который предотвращает доступ к содержимому памяти микроконтроллера различными отладочными средствами (JTAG, SWV и ETM). Его применение рекомендуется во всех случаях на готовых серийных устройствах. Отключение RDP возможно только для первого уровня защиты и приводит к стиранию содержимого флеш-памяти. Включение второго уровня — необратимая операция для микросхемы.

Теоретически все это может осложнить сервисное обслуживание и поиск причины неисправности возвращенного пользователем оборудования. Однако, так как само приложение все равно сохраняет способность писать в постоянную память и изменять ее, возможность обновлений прошивки (в том числе с помощью SFU) остается. При включенном RDP попытка доступа к защищенному участку памяти приводит к генерации ошибки на шине AHB.

На H743 за эту функцию отвечают биты RDP [15:8] в паре регистров FLASH_OPTSR_CUR и FLASH_OPTSR_PRG из области Option Bytes. При этом значение 0xAA соответствует нулевому уровню защиты (по умолчанию), значение 0xCC — первому, а любое другое — второму (максимальному) уровню.

Источник: xakep.ru

Ответить

Ваш адрес email не будет опубликован. Обязательные поля помечены *