Como proteger o firmware ESP32 e a memória Flash na estrutura ESP-IDF

Tempo de leitura: 4 minutes

Na era da Internet das Coisas (IoT), a comunicação sem fio está se tornando cada vez mais popular na vida cotidiana. No mundo dos dispositivos IoT, o ESP32 é um microcontrolador System on Chip (SoC) de baixo custo popular com WiFi híbrido e chips Bluetooth integrados da Espressif Systems. Por causa de seu design robusto e consumo de energia ultrabaixo, ele se tornou muito popular em aplicações de IoT. Mas quando falamos sobre aplicativos IoT, a segurança na IoT virá à nossa mente para a segurança de dados e conexão segura. ESP32 suporta autenticação mútua baseada em certificado X.509 para HTTPs, autenticação de nuvem IoT (AWS-IoT, Azure, Google Firebase, etc.) e comunicações de dados. Na Internet, o ESP32 também nos dá a segurança dos dados armazenados na memória FLASH e nos setores de inicialização para evitar que os dados sejam roubados. Hoje falamos sobre os recursos de segurança do ESP32, principalmente relacionados aos setores de Boot. Os dois principais recursos de segurança do ESP32 são chamados de Secure-Boot e flash security, também conhecido como Flash-Encryption.

 

O que o eFUSE bloqueia no ESP32?

O ESP32 possui um bloco de memória One-Time-Programmable (OTP) de 1024 bits. Este bloco de memória OTP é dividido em 4 blocos de 256 bits cada.

Esses blocos de memória armazenam as chaves de criptografia Flash e inicialização segura. Por causa do bloco de memória OTP, não há software presente para ler esses blocos de memória. Um e apenas o hardware ESP32 pode ler e validar os recursos de segurança.

 

O que é criptografia Flash? Como habilitá-lo no ESP32?

O ESP32 Flash Encryption é um recurso de segurança do ESP32 fornecido pelo ESP-IDF da Espressif System para proteger a memória flash. A criptografia Flash criptografa o conteúdo da memória flash SPI do ESP32 e quando esse recurso está ativado, os seguintes tipos de dados são criptografados por padrão:

  • Firmware Bootloader
  • Tabela de Partição
  • Partições do tipo “app” ou partições de aplicativo
  • Qualquer partição marcada com um sinalizador “criptografado” na tabela de partição também é criptografada.

Em projetos ESP-IDF, os usuários podem habilitar facilmente o Flash Encryption a partir da configuração do projeto pelo

idf.py menuconfig

Depois de abrir o menu de configuração do projeto ESP32, agora navegue até

“Security Features” -->  
“Enable flash encryption on boot” --> 
“Enable usage mode (Development(NOT SECURE))” / “Enable usage mode (Release)”

Na criptografia flash, existem dois modos:

  • Modo de desenvolvimento: neste modo, as partições de memória flash ESP32 são criptografadas e abertas para modificação e também são acessíveis para leitura de flash pelo UART.
  • Modo de liberação: este modo é especialmente recomendado para as etapas de fabricação e produção. Neste modo, a leitura do flash pelo UART/JTAG fica totalmente bloqueada e o novo firmware só pode ser atualizado por over-the-air (OTA).

Quando a criptografia de flash está ativada, os binários do código atual piscam na memória do ESP32 como um arquivo de texto simples. Mas após a conclusão do processo de flash, na primeira inicialização do ESP32, o próprio dispositivo criptografou cada partição de menção superior, uma por uma, usando a chave de criptografia flash AES que é armazenada no eFUSE-BLK1 no momento do flash. Após criptografar a partição, o dispositivo ESP32 reiniciou-se e processou com a lógica programada.

O processo de execução flash do ESP32 descriptografa os dados da memória flash quando a unidade de execução do ESP32 tenta ler e para o processo de gravação, o processo de execução flash criptografa os dados antes de gravar na memória flash.

 

O que é Secure-Boot? Como habilitá-lo no ESP32?

O ESP32 Secure-boot é um recurso de segurança, que fornece segurança para executar aplicativos corretos no hardware ESP32. Quando a inicialização segura está habilitada, cada um dos binários da memória flash [carregador de boot de software e firmware do aplicativo] são verificados antes de carregar com as chaves de assinatura de inicialização segura com base em RSA-3072. Podemos chamar o Secure-boot de “Guardião do ESP32”.

Para habilitar o Flash Encryption, nos mesmos passos podemos habilitar o Secure-boot a partir do menu do projeto.

“Security Features” -->  
“Enable hardware Secure Boot in bootloader”

 

Como funciona a inicialização segura?

Quando o dispositivo ESP32 é inicializado, a ROM confiável do hardware ESP32 ou dissemos que o bootloader de 1ª fase executa a verificação com a chave de inicialização segura baseada em RSA-3072 no bootloader do software e, em seguida, o bootloader do software verifica o firmware do aplicativo com a mesma chave de assinatura e iniciar o aplicativo.

 

Conclusão

O ESP32 vem com um ambiente seguro [Secure-boot & Flash-Encryption], que precisamos habilitar enquanto atualizamos o código. Para obter mais segurança, precisamos habilitar os dois.