Рубрики
Проекты на ESP32

Как защитить прошивку и флэш-память ESP32 на платформе ESP-IDF

В эпоху Интернета вещей (IoT) беспроводная связь становится все более популярной в повседневной жизни. В мире устройств Интернета вещей ESP32 — это популярный недорогой микроконтроллер System on Chip (SoC) со встроенными гибридными чипами Wi-Fi и Bluetooth от компании Espressif Systems. Благодаря своей прочной конструкции и сверхнизкому энергопотреблению он стал невероятно популярен в приложениях Интернета вещей. Но когда мы говорим о приложениях IoT, на ум приходит безопасность в IoT , связанная с безопасностью данных и безопасным соединением. ESP32 поддерживает взаимную аутентификацию на основе сертификата X.509 для HTTP, аутентификацию в облаке IoT ( AWS-IoT, Azure, Google Firebase и т. д.) и передачу данных. Через сеть Интернет ESP32 также обеспечивает безопасность данных, хранящихся во флэш-памяти и загрузочных секторах, чтобы предотвратить кражу данных. Сегодня мы поговорим о функциях безопасности ESP32, в основном связанных с его загрузочными секторами. Две основные функции безопасности ESP32 называются Secure-Boot и Flash Security, также известные как Flash-Encryption.

Какие блоки eFUSE есть в ESP32?

ESP32 имеет 1024-битный одноразово программируемый (One-Time-Programmable, OTP) блок памяти. Этот блок памяти OTP разделен на 4 блока по 256 бит каждый.

В этих блоках памяти хранятся ключи шифрования Flash и Secure Boot. В связи с тем, что это одноразово программируемые блоки памяти, отсутствует какое бы то ни было программное обеспечение для считывания этих блоков памяти. Только оборудование модуля ESP32 может читать и проверять функции безопасности.

Из-за блока памяти OTP отсутствует программное обеспечение для считывания этих блоков памяти. Только оборудование ESP32 может читать и проверять функции безопасности.

Что такое флэш-шифрование? Как включить его на ESP32?

ESP32 Flash Encryption (флэш-шифрование) — это функция безопасности для ESP32, предоставляемая системой ESP-IDF от компании Espressif для защиты флэш-памяти. Флэш-шифрование шифрует содержимое флэш-памяти SPI ESP32, и когда эта функция включена, по умолчанию шифруются следующие типы данных:

  • загрузчик прошивки;
  • таблица разделов;
  • разделы типа «приложение» или разделы приложений;
  • любой раздел, помеченный в таблице разделов флажком «зашифрованный», также зашифрован.

В проектах ESP-IDF пользователи могут легко включить Flash Encryption из конфигурации проекта с помощью

После открытия меню конфигурации проекта ESP32 перейдите к

При флэш-шифровании существует два режима:

  • Режим разработки: в этом режиме все разделы флэш-памяти ESP32 зашифрованы и открыты для модификации, а также доступны для считывания флэш-памяти с помощью UART.
  • Режим выпуска: этот режим особенно рекомендуется для этапов производства и производства. В этом режиме считывание флэш-памяти с помощью UART/JTAG полностью блокируется, и новая прошивка может быть обновлена ​​только по беспроводной сети (OTA).

Когда флэш-шифрование включено, двоичные файлы текущего кода сохраняются в памяти ESP32 в виде обычного текстового файла. Но после завершения процесса прошивки, при первой загрузке ESP32 устройство само зашифрует каждый верхний раздел, один за другим, с помощью ключа шифрования флэш-памяти AES, который хранится в eFUSE-BLK1 во время прошивки. После шифрования раздела устройство ESP32 перезагрузится и обработает запрограммированную логику.

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

Что такое безопасная загрузка? Как включить ее на ESP32?

ESP32 Secure-boot (безопасная загрузка) — это функция безопасности, которая обеспечивает безопасность запуска корректных приложений на оборудовании ESP32. Когда включена безопасная загрузка, все двоичные файлы флэш-памяти [загрузчик программного обеспечения и встроенное ПО] проверяются перед загрузкой с помощью ключей подписи Secure-boot на основе RSA-3072. Таким образом, мы можем назвать Secure-boot «Хранителем (Guardian) ESP32».

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

Как работает Secure-boot?

Когда устройство ESP32 загружается, доверенная прошивка оборудования ESP32 или, как мы говорили, загрузчик 1-го этапа выполняет проверку с помощью ключа безопасной загрузки на основе RSA-3072 на программном загрузчике, а затем программный загрузчик проверяет прошивку приложения с тем же ключом подписи и запускает приложение.

Заключение

Модуль ESP32 поставляется с безопасной средой [Secure-boot & Flash-Encryption], которую нам необходимо включить во время прошивки кода. Для большей безопасности рекомендуется включить обе эти опции.

6 ответов к “Как защитить прошивку и флэш-память ESP32 на платформе ESP-IDF”

Помогите разобраться с процессором шифрования flash. У меня после включения шифрования перестала загружаться плата ESP32. Делал следующее: 1. Генерировал ключ. 2. Заливал в eFuse. 3. Включал шифрование. 4.Шифровал с помощью ключа бинарник прошивки и загружал в память. Все команды выполнялись без проблем, но программа больше не стартует. Попытки залить зашифрованные загрузчик и таблицу разделов ни к чему не привели. Что я сделал не так и как все исправить?

Проблема с загрузкой ESP32 после включения шифрования flash-памяти обычно возникает из-за неправильной последовательности действий или некорректных параметров. Давайте разберём возможные причины и способы исправления:

1. Основные ошибки
Неправильный порядок прошивки: При шифровании flash важно сначала загрузить зашифрованные bootloader, partition table и app, а только потом включать шифрование в eFuse.

Неправильные настройки конфигурации: В menuconfig должны быть включены соответствующие опции шифрования.

Некорректный ключ: Если ключ в eFuse не совпадает с тем, которым шифровалась прошивка, ESP32 не сможет расшифровать данные.

Повреждение eFuse: Если критические eFuse были записаны неправильно, восстановление может быть сложным.

2. Правильная последовательность действий
Вот корректный порядок для шифрования flash на ESP32:

1. Генерация ключа шифрования
espsecure.py generate_flash_encryption_key my_flash_encryption_key.bin
2. Запись ключа в eFuse (осторожно, это необратимо!)
espefuse.py —port /dev/ttyUSB0 burn_key flash_encryption my_flash_encryption_key.bi

3. Настройка конфигурации в menuconfig
Enable flash encryption (Security features → Enable flash encryption on boot).

Enable encrypted partition table (Partition Table → Encrypt partition table).

Mode: Обычно выбирают Development (позволяет обновлять прошивку) или Release (более строгий режим).

4. Сборка и шифрование прошивки
idf.py build

5. Прошивка зашифрованных бинарников
espsecure.py encrypt_flash_data —keyfile my_flash_encryption_key.bin —address 0x1000 -o bootloader_encrypted.bin build/bootloader/bootloader.bin
espsecure.py encrypt_flash_data —keyfile my_flash_encryption_key.bin —address 0x8000 -o partition_table_encrypted.bin build/partition_table/partition-table.bin
espsecure.py encrypt_flash_data —keyfile my_flash_encryption_key.bin —address 0x10000 -o app_encrypted.bin build/your_app.bin

esptool.py —port /dev/ttyUSB0 write_flash 0x1000 bootloader_encrypted.bin 0x8000 partition_table_encrypted.bin 0x10000 app_encrypted.bin

6. Включение шифрования в eFuse
espefuse.py —port /dev/ttyUSB0 burn_efuse FLASH_CRYPT_CNT

(После этого ESP32 будет требовать шифрование всей flash.)

3. Как исправить текущую ситуацию?
Если плата не загружается:

Проверьте, что прошиты зашифрованные бинарники (bootloader, partition table, app).

Убедитесь, что ключ в eFuse правильный (можно попробовать сгенерировать новый ключ и записать его, если eFuse ещё не записан).

Попробуйте сбросить eFuse (если используется Development Mode, можно отключить шифрование, сбросив FLASH_CRYPT_CNT).

Проверьте UART-лог (если есть вывод UART, он может показать, на каком этапе происходит ошибка).

4. Дополнительные советы
Используйте ENCRYPTION_IN_DEV (Development Mode) для отладки, чтобы можно было обновлять прошивку.

Не записывайте eFuse FLASH_CRYPT_CNT до проверки работоспособности зашифрованной прошивки.

Если eFuse уже записан в Release Mode, восстановление может быть невозможно без замены чипа.

Вывод
Скорее всего, проблема в том, что:

Либо вы записали FLASH_CRYPT_CNT до загрузки зашифрованной прошивки,

Либо прошили незашифрованные бинарники после включения шифрования.

Попробуйте заново выполнить шаги в правильном порядке и убедитесь, что menuconfig настроен корректно. Если проблема останется — проверьте UART-лог для точной диагностики.

а что решает эта защита, ведь слив дампа не позволит декомпилировать прошивку?

Не совсем понял слив какого дампа вы имеете ввиду?

Ну что поделать, будем ждать пока кто-нибудь придумает защиту получше ))

Добавить комментарий

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