Несмотря на рост количества сетевых атак на IoT-устройства, безопасность встроенного программного обеспечения часто отводится на второй план. Поскольку злоумышленники проникают в системный стек и нацеливаются на процесс загрузки и базовую конфигурацию оборудования, выбор архитектуры памяти стал ключевым решением в создании проверяемой цепочки доверия.
Таким образом, обеспечение безопасности встроенного ПО требует, чтобы каждый компонент перед выполнением проходил проверку шифрования. Этот путь начинается с неизменяемого загрузчика, который отвечает за загрузку и проверку основной прошивки. Однако технология памяти, используемая на каждом этапе, может привести к уязвимости прошивки к несанкционированным изменениям.
Внутренняя и внешняя флэш-память.
Физическое расположение энергонезависимой памяти, используемой для хранения прошивки, является одним из наиболее важных факторов в моделях угроз устройств. Разработчикам встроенного ПО необходимо сделать выбор между встроенной флэш-памятью (eFlash) и внешними флэш-модулями, подключенными через последовательные интерфейсы, такие как SPI или QSPI.
Встроенная флэш-память обычно интегрируется непосредственно в микроконтроллеры или чипы SoC. Эта архитектура обеспечивает высочайший уровень физической безопасности, поскольку злоумышленникам не доступны внешние шины. Даже доступ к внутренней флэш-памяти контролируется специальными регистрами и битами блокировки.
Кроме того, встроенная флэш-память поддерживает постоянную защиту от чтения. Замыкая накоротко специальные предохранители, разработчики могут отключить интерфейсы отладки JTAG или SWD, чтобы хакеры не могли модифицировать образы прошивки. Однако по мере перехода SoC к узлам меньшего размера эта технология сталкивается со значительными проблемами масштабируемости.
Внешняя флэш-память, напротив, размещается вне основного процессора и обменивается данными через высокоскоростной последовательный интерфейс. Такой архитектурный выбор упрощает масштабирование емкости хранилища, а также расширяет поверхность атаки системы. Любые данные, передаваемые между процессором и внешней флэш-памятью, по своей сути уязвимы для таких угроз, как подслушивание, атаки «посредника» и физическое вмешательство.
Чтобы устранить эти риски, разработчики встроенного программного обеспечения должны реализовать надежные меры защиты аппаратного и программного обеспечения. Многие внешние устройства флэш-памяти NOR оснащены контактом физической защиты от записи. Когда на вывод подается определенное напряжение, внутренняя логика микросхемы предотвращает выполнение любых команд стирания или записи.
Рис. 1. Защищенная последовательная флэш-память NOR компании Winbond Electronics W77Q32JWSSIR TR обладает сложными возможностями шифрования каналов связи. (Источник изображения: Winbond Electronics)
Однако если данные можно прочитать, просто заблокировать флэш-память недостаточно. Во время выполнения злоумышленники по-прежнему могут получить доступ к адресу и шине данных. Эта уязвимость побудила к разработке специализированных защищенных флэш-устройств, включая аппаратные механизмы корня доверия, зашифрованные каналы связи и монотонные счетчики для предотвращения атак отката.
Однако если выбрана неправильная архитектура хранилища, устройство оставит фундаментальные дефекты, которые невозможно полностью исправить программными патчами. Например, конструкции, которые хранят прошивку во внешней EEPROM без шифрования или проверки, всегда уязвимы для аппаратных злоумышленников. Напротив, выбор памяти с чрезмерными ограничениями может повлиять на ее функциональность.
Поэтому инженеры должны понимать лучшие практики и методы проектирования, чтобы максимизировать безопасность встроенного ПО за счет архитектуры памяти.
Лучшие практики для проектирования безопасного хранилища встроенного ПО
При разработке безопасного пути хранения встроенного ПО от запуска до выполнения инженеры встроенного ПО должны следовать следующим принципам:
1. Аппаратный корень доверия
Выполнение всегда должно начинаться с неизменяемых областей памяти. Например, загрузочное ПЗУ или постоянно защищенный флэш-сектор должен содержать код для проверки всей остальной прошивки. Это гарантирует, что злоумышленники не смогут обойти проверку, подделав первоначальный пароль.
2. Используйте зашифрованные подписи
Настройте безопасный загрузчик так, чтобы он запускал только образы прошивки, подписанные доверенными закрытыми ключами. Таким образом, даже если злоумышленники смогут получить доступ к памяти и изменить биты, они смогут предотвратить несанкционированный код. Если требуется конфиденциальность, сохраненную прошивку можно зашифровать.
3. Используйте аппаратные функции безопасности.
Если в архитектуре системы используется внешнее хранилище, инженерам следует выбирать устройства, поддерживающие аппаратную безопасность, например встроенную защиту паролем или простое шифрование. Хотя эти устройства могут быть не такими надежными, как полноценные компоненты безопасности, они добавляют еще один уровень защиты.
Рис. 2. Macronix поддерживает последовательную флэш-память NOR MX25L3233FM2I-08Q емкостью 32 МБ с последовательным периферийным интерфейсом. (Источник изображения: Macronix)
4. Изолировать прошивку и данные
Организуйте область памяти и отделите наиболее конфиденциальный код. В MCU размещайте важные рутинные инструкции в защищенной области памяти. Даже встроенное ПО, если оно поддерживается аппаратным обеспечением, может помечать определенные банки флэш-памяти как доступные только для исполнения или только для чтения.
5. План обновления прошивки безопасности
Убедитесь, что сам процесс обновления проверен (например, требуется подпись пакета обновления). Если в проекте используется внешнее хранилище для временных обновлений, следует принять те же меры безопасности, что и для основного хранилища встроенного ПО.

