В эпоху Интернета вещей (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 из конфигурации проекта с помощью
|
1 |
idf.py menuconfig |
После открытия меню конфигурации проекта ESP32 перейдите к
|
1 2 3 |
“Security Features” --> “Enable flash encryption on boot” --> “Enable usage mode (Development(NOT SECURE))” / “Enable usage mode (Release)” |
При флэш-шифровании существует два режима:
- Режим разработки: в этом режиме все разделы флэш-памяти 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».
Для включения флэш-шифрования мы аналогичным образом можем включить безопасную загрузку из меню конфигурации проекта.
|
1 2 |
“Security Features” --> “Enable hardware Secure Boot in bootloader” |
Как работает Secure-boot?
Когда устройство ESP32 загружается, доверенная прошивка оборудования ESP32 или, как мы говорили, загрузчик 1-го этапа выполняет проверку с помощью ключа безопасной загрузки на основе RSA-3072 на программном загрузчике, а затем программный загрузчик проверяет прошивку приложения с тем же ключом подписи и запускает приложение.

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




Помогите разобраться с процессором шифрования 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-лог для точной диагностики.
а что решает эта защита, ведь слив дампа не позволит декомпилировать прошивку?
Не совсем понял слив какого дампа вы имеете ввиду?
На хакере уже опубликован взлом.
Ну что поделать, будем ждать пока кто-нибудь придумает защиту получше ))