Безопасная загрузка (secure boot)
Если устройство должно выполнять только программу своего производителя, микроконтроллер проверяет цифровую подпись прошивки перед запуском. Чужую или изменённую программу он просто не загрузит.
Обновлено Редакция GAW
Безопасная загрузка (secure boot) — механизм, при котором микроконтроллер перед запуском программы проверяет её цифровую подпись. Производитель подписывает прошивку своим закрытым ключом, а загрузчик в ПЗУ чипа проверяет подпись открытым ключом. Изменённая или чужая программа проверку не пройдёт и запущена не будет.
Как это сделано в RP2350. По даташиту загрузчик:
- вычисляет хеш SHA-256 кода и данных программы;
- проверяет подпись открытым ключом, который хранится в самом образе программы (алгоритм ECDSA, кривая secp256k1);
- сравнивает подписанный хеш с вычисленным;
- проверяет, что ключ из образа совпадает с отпечатком SHA-256, записанным в OTP-память.
Только если всё совпало, программа запускается. Дополнительно в OTP хранится счётчик версий: загрузчик не запустит прошивку старше счётчика — это защита от отката, она не даёт вернуть версию с известной уязвимостью.
Подпись проверяется при любом способе загрузки — из флеш-памяти, из OTP, по USB или UART. Исключение — отладчик: он может управлять ядрами в обход загрузчика, поэтому при включении защиты отладку отключают. Проверять подпись программы, которая выполняется прямо из флеш-памяти, Raspberry Pi не рекомендует: содержимое микросхемы может подменить внешнее устройство уже после проверки. Надёжнее загрузить программу целиком в SRAM и проверить её там.
У ESP32. ESP32-S3 проверяет подпись RSA-PSS с аппаратным корнем доверия. Безопасную загрузку часто включают вместе с шифрованием флеш-памяти: например, модули ESP32-C3-MINI-1 с суффиксом -A поставляются с прошивкой AWS IoT ExpressLink, где включено и то и другое, и прошить в них свою программу уже нельзя.
Главное ограничение — необратимость: ключи и флаги записываются в однократно программируемую память, и снять защиту потом нельзя. Поэтому её включают последним шагом, когда прошивка отлажена. О том, что делает загрузчик, — в термине «Загрузчик».
Частые вопросы
Что такое secure boot?
Безопасная загрузка — режим, в котором микроконтроллер перед запуском проверяет цифровую подпись прошивки и запускает только подписанную владельцем ключа. У RP2350 подпись строится по алгоритму ECDSA на кривой secp256k1 с хешем SHA-256, у ESP32-S3 — по RSA-PSS.
Можно ли отключить безопасную загрузку?
Как правило, нет: её включают записью в однократно программируемую память, и это необратимо. Raspberry Pi прямо пишет, что безопасная загрузка навсегда меняет чип RP2350. Поэтому сначала отлаживают прошивку, а включают защиту в самом конце.
Что такое защита от отката версии?
Это счётчик в OTP, с которым загрузчик сравнивает номер версии прошивки. У RP2350 загрузчик откажется запускать программу с версией ниже счётчика и сам увеличит счётчик, когда запустит более новую. Так нельзя вернуть старую прошивку с известной уязвимостью.
Источники
- Raspberry Pi. RP2350 Datasheet — разд. 10.1.1 — чистый RP2350 можно необратимо изменить, чтобы он выполнял только ваш код; подпись — хеш SHA-256 программы, подписанный закрытым ключом ECDSA на кривой secp256k1; загрузчик вычисляет хеш, проверяет подпись открытым ключом из образа и сравнивает ключ с отпечатком SHA-256 в OTP; номер версии для защиты от отката сравнивается со счётчиком в OTP, версии ниже счётчика не загружаются, счётчик растёт сам при загрузке более новой; подписи проверяются для всех источников загрузки, кроме отладчика, поэтому отключение отладки входит в процедуру включения; проверять подпись у программы, выполняемой прямо из флеш-памяти, не рекомендуется — лучше загружать её в SRAM; разд. 3.9 — при включённой безопасной загрузке ядра RISC-V отключаются
- Espressif. ESP32-S3 Series Datasheet v2.2 — разд. 4.1.4.4 — безопасная загрузка с аппаратным корнем доверия: запускается только прошивка с подписью RSA-PSS
- Espressif. ESP32-C3-MINI-1 & ESP32-C3-MINI-1U Datasheet v2.2 — табл. 1-1, примечание 5 — модули с суффиксом -A поставляются с прошивкой AWS IoT ExpressLink, которая включает шифрование флеш-памяти и безопасную загрузку; режим загрузки прошивки отключён, записать другую программу через UART или USB нельзя
Нашли ошибку?
Смотрите также
- OTP-памятьОднократно программируемая память: ключи, настройки, необратимые биты
- Шифрование флеш-памятиПрошивка во внешней памяти в зашифрованном виде: XTS-AES, ключи в чипе
- Загрузчик (bootloader)Прошивка МК без программатора через UART или USB
- ESP32-C3-MINI-1: выводы модуля53 площадки, 15 GPIO: функции, strapping, USB, варианты, питание