Создание безопасного загрузчика для Quark D2000 и SE

На ELC 2017 Даниэль Алессандрелли из Intel рассказал, как его команда создала загрузчик QM для MCU-подобных процессоров Intel Quark D2000 и SE с безопасными обновлениями прошивки.

Спустя годы после того, как Intel выпустила маломощный, совместимый с Linux процессор Quark X1000 , который работает на Intel Galileo и многочисленных шлюзах IoT , производитель микросхем в прошлом году выпустил три микроконтроллерных Quarks, которые не работают под управлением Linux.
Как и оригинальные Quarks, Quark D1000 ограничен совместимостью с Pentium ISA и поддерживает только реализации с нуля.
Quark D2000 и аналогичный Quark SE C1000, который управляет модулем Intel Curie, также поставляют полную версию Intel x86 ISA.
Им не хватает x86 FPU, но они по-прежнему могут работать с ОСРВ, такими как Zephyr.


На ELC 2017 Даниэль Алессандрелли из Intel описывает формат изображения Quark Format Upgrade (QFU), созданный для QM-Bootloader.

(щелкните изображение, чтобы увеличить)

Учитывая минимальное использование MCU и отсутствие технологий, связанных с Linux, таких как U-Boot, Intel пришлось с нуля разрабатывать загрузчик Quark D2000 / SE.
На февральской конференции по встраиваемым Linux- технологиям инженер-программист Intel Даниэль Алессандрелли подробно рассказал о внутренней работе загрузчика микроконтроллеров Intel Quark (QM-Bootloader).
В своей презентации Алессандрелли также рассказал о расширениях безопасности, добавленных в версию 1.4 QM-Bootloader с BSD-лицензией.

Разработанный для D2000 и SE C1000, QM-Bootloader предлагает типичные функции начальной загрузки, такие как инициализация системы, вычисление кода обрезки и восстановление контекста из спящего режима.
Он также обеспечивает функциональность управления микропрограммой (FM) на основе протокола DFU (обновление прошивки устройства) и его самого популярного хост-инструмента dfu-util.

Алессандрелли и его команде нужно было адаптировать dfu-util для работы как по UART, так и по USB.
Это обеспечило бы единообразное обновление прошивки независимо от того, работали ли разработчики с SE с поддержкой USB 1.1 или стандартом D2000, в котором отсутствует поддержка USB.


Блок-схема Quark SE

(щелкните изображение, чтобы увеличить)

D2000 и SE Quarks оснащены 32-мегагерцевыми ядрами Lakemont на базе x86, но только SE предлагает 32-МГц ядро ​​сенсорной подсистемы ARC.
Еще более усложнил процесс разработки QM-Bootloader тот факт, что SE предоставляет больше памяти: SRAM 80 КБ и флэш-память 384 КБ.
Обе модели, тем не менее, удобно использовать 8-килобайтное выделение OTP (одноразового программирования) SRAM.

«С точки зрения загрузчика два Quarks очень похожи, потому что мы поместили наш загрузчик в OTP», - сказал Алессандрелли, который, вместе с Хесусом Санчес-Паленсия, поддерживает проект.
«Ограничение в 8 КБ было ограничением, но мы все же смогли реализовать модульный подход, чтобы в будущем мы могли добавлять новые транспорты и, возможно, обновления OTA».

Основой QM-Bootloader является протокол DFU, который обеспечивает способ передачи данных на устройство с помощью DFU_DNLOAD для FM, а также извлечения данных с помощью DFU_UPLOAD.
Оба механизма основаны на блоках: все блоки, кроме последнего, должны иметь одинаковый размер.

«Мы решили использовать DFU, потому что он с открытым исходным кодом, хорошо документирован и предназначен для устройств с ограниченными ресурсами», - сказал Алессандрелли.
«Кроме того, DFU не определяет какой-либо конкретный формат изображения, и мы хотели создать наш собственный формат изображения с его собственными метаданными и механизмом аутентификации.
У нас недостаточно ОЗУ или флэш-памяти для хранения полного изображения, поэтому нам нужно было разработать собственный протокол блочной передачи / перепрошивки, чтобы позволить нам записывать изображение блоком за один раз ».

Чтобы адаптировать DFU для UART, команда Intel создала протокол Quark DFU Adaptation (QDA).
«QDA делает DFU доступным для любой передачи сообщений», - сказал Алессандрелли.
«Поскольку UART ориентирован на поток, мы добавили старый уровень протокола XMODEM-CRC для транспортировки пакетов QDA.
QDA предоставляет все сообщения запроса / ответа DFU, такие как DFU_UPLOAD, а также имитирует некоторые общие функции USB, включая активные альтернативные настройки.
Нам нужен другой хост-код для QDA / UART, поэтому мы изменили dfu-util для замены USB-слоя на QDA / UART ». Полученный код qm-dfu-util доступен на GitHub, лицензированном по GPLv2.

В верхней части уровня QDA команда Intel определила формат изображения Quark Format Upgrade (QFU), который работает с универсальными инструментами DFU и поддерживает аутентификацию встроенного программного обеспечения (см. Фото со схемой выше).
Этот «очень простой блочный формат» добавляет заголовок к первому блоку двоичного файла, «поэтому он обрабатывается перед изображением», сказал Алессандрелли.
Заголовок подразделяется на базовый заголовок, который содержит такую ​​информацию, как целевое устройство, идентификатор поставщика и продукта, а также расширенный заголовок, используемый для аутентификации.

«Мы не добавляем какой-либо конкретный адрес памяти в заголовок, а вместо этого предполагаем, что флэш-память разделена на разделы, и что каждое изображение предназначено для раздела», - сказал Алессандрелли.
Эта настройка позволяет загрузчику поддерживать один раздел на D2000 и два раздела на модели SE с поддержкой ARC.
Это также позволяет использовать будущие схемы, такие как несколько разделов на ядро, что может пригодиться для OTA.

Наконец, протокол Quark Firmware Management (QFM) работает поверх уровней DFU, обеспечивая таким образом функциональность, выходящую за рамки обновления прошивки, такую ​​как инициализация ключа, стирание приложения и получение информации о системе / прошивке.
QFM - это протокол запроса (DFU_DNLOAD) или ответа (загрузки).

QM-Bootloader 1.4 добавляет функции безопасности

Алессандрелли продолжил рассказывать о новых расширениях Secure Firmware Upgrade, которые были добавлены в слой QFM QM-Bootloader 1.4 для обеспечения аутентифицированных обновлений прошивки.
Из-за ограничений Кварка он не мог использовать схему открытого ключа.
Вместо этого он выбрал простую схему симметричного ключа под названием HMAC256.

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


Алессандрелли рассказывает о последних дополнениях для безопасного обновления прошивки в QM-Bootloader

(щелкните изображение, чтобы увеличить)

Заголовок QFU расширен расширенным заголовком HMAC.
«Мы не вычисляем HMAC для всего изображения, но мы аутентифицируем заголовок, добавляя массив хэшей, по одному на каждый блок, составляющий изображение», - сказал Алессандрелли.
«Мы проверяем подлинность заголовка с помощью HMAC, затем начинаем получать блоки изображений. Мы вычисляем SHA каждого блока и сравниваем его с SHA в заголовке».

Усовершенствования безопасности решают проблему обеспечения согласованности разделов - как обрабатывать сбои, которые могут приводить к тому, что разделы находятся в несогласованном состоянии, например, из-за сброса во время обновления прошивки.
Новый код связывает флаг согласованности с каждым разделом и сохраняет эти метаданные в файле загрузчика с именем BL-Data.

Обновленный загрузчик также добавляет управление ключами.
«Мы в основном определяем и аутентифицируем запрос на обновление ключа, расширение QFM», - сказал Алессандрелли.
«Мы используем двойную подпись, предоставляя как ключ прошивки, который используется для аутентификации образа, так и ключ отзыва». Хотя эту схему необходимо будет изменить, если они добавят поддержку OTA в будущем, «так как сейчас мы поддерживаем только проводную и двухточечную передачу USB или UART, человек в средней атаке победит », - отметил он.

Алессандрелли также описал усовершенствования безопасности, используемые для защиты BL-DATA с использованием CRC, и далее объяснил, как разделы связаны с целями.
Усовершенствования предназначены для поддержки будущих обновлений OTA и других дополнений, таких как модули BLE с их собственной прошивкой.

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

Смотрите полную презентацию ниже.

Видеозапись презентации Даниэля Алессандрелли на ELC 2017: «Управление микропрограммой для микроконтроллеров: подход Quark Bootloader»

Эта статья защищена авторским правом © 2017 Linux.com и была первоначально опубликована здесь .
Он был воспроизведен этим сайтом с разрешения его владельца.
Пожалуйста, посетите Linux.com для получения последних новостей и статей о Linux и open source.