Как защитить прошивку и флэш-память 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.

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

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

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

Блок памяти OTP в ESP32

В этих блоках памяти хранятся ключи шифрования 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?

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

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

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

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

Принцип работы безопасной загрузки в модуле ESP32

Заключение

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

(Проголосуй первым!)
Загрузка...
1 317 просмотров

Комментарии

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

  1. Помогите разобраться с процессором шифрования 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-лог для точной диагностики.

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

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

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

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