Para aumentar la gama de funciones y la seguridad del firmware de los productos Arduino, decidimos lanzar un nuevo gestor de arranque basado en MCUboot. Aquí hay una introducción rápida sobre todo lo que necesita saber al respecto.
Introducción a arranque MCU
MCUboot es un gestor de arranque seguro solución que ofrece seguridad integrada autenticación de firmware y actualización segura de firmware mecanismo, así como muchas otras funciones, como el cifrado de actualizaciones, la reversión de actualizaciones y el inicio de aplicaciones.
MCUboot no depende de ningún hardware o sistema operativo específico; En el momento de escribir este artículo, se admiten los siguientes RTOS: céfiro, nuez, en altoy mbed.
Nuestros esfuerzos se han centrado en la simplicidad y la reutilización del diseño OTA existente en las placas Arduino.
Bloques básicos de MCUboot
Para acceder a la memoria flash del microcontrolador, MCUboot se basa en la capa del controlador del sistema operativo. MCUboot admite el arranque de múltiples imágenes, por lo que configurarlo puede ser complicado; para una configuración básica de MCUboot, se deben definir dos áreas flash.
- UBICACIÓN 0: Representa la parte del flash que contiene la imagen de la aplicación actual;
- RANURA 1: representa la porción de flash que contiene la imagen de la aplicación de actualización.
Se necesita un área flash adicional para admitir el algoritmo de scratch de intercambio de MCUboot, llamado SCRATCH.
Para cambiar entre la ranura 1 y la ranura 0, MCUboot ofrece varios algoritmos.
- Aplastar: Este es el método de actualización básico compatible con MCUBoot y solo copia la RANURA 1 a la RANURA 0; la reversión no es compatible, pero es la forma más rápida de actualizar una imagen.
- cambiar cero: este método de actualización se basa en un área flash adicional donde los datos se almacenan temporalmente durante el intercambio de imágenes. Mediante este método tenemos la posibilidad de recuperar la imagen inicial de la aplicación si algo sale mal con la actualización. Una de las principales desventajas de este método de actualización es el desgaste del flash, ya que el área de borrado se escribe y borra varias veces durante un intercambio.
- Movimiento de intercambio: En lugar de usar un área de raspador externa, este método de actualización usa espacio adicional dentro de la RANURA 0. La principal ventaja del desplazamiento de intercambio sobre el raspador de intercambio es la reducción del desgaste del flash.
Para poder realizar todas las operaciones y comprobaciones, MCUboot necesita almacenar algunos metadatos junto con la imagen de la aplicación. Esto se hace usando una herramienta llamada imgtool que procesa la imagen binaria de la aplicación, reservando espacio y agregando toda la información requerida para realizar la verificación de la imagen e implementar un intercambio tolerante a fallas.
Al observar la ubicación de una imagen con más detalle, podemos dividirla en estas áreas flash:
- En cabeza: Se utiliza principalmente para indicar la longitud de otras partes de la ranura; tamaño del encabezado, tamaño del código y tamaño TLV. También incluye la dirección de carga de la aplicación y el número de ranura mágica que se usa para identificar una imagen MCUboot compatible.
- codificado: El binario de la aplicación.
- TLV: Secuencia de tuplas con longitud y valor de etiqueta. Por ejemplo, hash de imagen, hash de clave, firma de imagen.
- Trailer: Se utiliza para almacenar el estado de intercambio durante los intercambios de imágenes.
Para admitir Arduino OTA, el archivo de actualización se escribe en la memoria y el gestor de arranque lo procesa para actualizar la aplicación. Para los productos Portenta, el archivo se coloca en la segunda partición de la memoria flash QSPI de la tarjeta. Esto significa que nuestro SLOT 1 se coloca en el flash QSPI. El método de intercambio predeterminado que utiliza es swap scratch. El área borrador, asignada a un archivo llamado scratch.bin, se coloca en la memoria flash QSPI. Cuando se eligen imágenes encriptadas, las copias de firmware entre memorias externas siempre están encriptadas; de forma predeterminada, MCUboot descifra una actualización, ocupándose de las compensaciones necesarias, antes de escribirla en el área temporal. Para proteger los datos, se realiza un paso adicional para volver a cifrar todos los datos de trabajo antes de escribirlos. Cuando se restauran las imágenes, los datos de la memoria interna sin cifrar se cifran antes de escribirse en la RANURA 1.
Notar: Usando este diseño flash, es posible cargar una actualización a través de Internet, montando el dispositivo como almacenamiento masivo o usando su interfaz DFU.
Cuando haya una nueva actualización disponible y marcada como pendiente en el próximo reinicio, MCUboot se encargará de intercambiar las ranuras y aplicar la nueva imagen de la aplicación.
Seguridad
MCUboot usa dos claves diferentes para proporcionar verificación de firma de imagen y encriptación de imagen. Para la verificación de la firma de la imagen, imgtool usa la clave privada para firmar la actualización, y MCUboot usa la clave pública para verificarla.
Para el cifrado de imágenes, el esquema de cifrado de curva elíptica incorporado (ECIES) se utiliza con un par de claves efímeras secp256r1 y una clave AES aleatoria utilizada para cifrar la imagen.
En cualquier caso, MCUboot necesita conocer su parte de las claves de entrada. Por lo tanto, se guardan en la memoria flash junto con el binario del gestor de arranque.
Mirando de cerca el sector flash del gestor de arranque, encontraremos los siguientes datos:
Por defecto, las claves no se cargan en flash y el gestor de arranque iniciará cualquier boceto. Una vez que se cargan las claves, MCUboot aún verificará la firma de la imagen y solo iniciará bocetos válidos; si se detecta una actualización cifrada al leer los TLV, MCUboot desempaquetará la clave de cifrado y descifrará la imagen sobre la marcha mientras la mueve a la memoria flash interna.
Haga clic a continuación para probar Arduino MCUboot y únase a nosotros en las redes sociales o en los foros para hacernos saber lo que piensa.
Puede seguir cualquier respuesta a esta entrada a través de la fuente RSS 2.0. Puedes deja una respuestao trackback desde su propio sitio.