🛠 Secure boot et TrustZone-M sur RP2350 : signer son firmware sans se faire avoir
Objetivos
El RP2350 es el primer chip «de consumo» de Raspberry Pi con una pila de seguridad real: Arm TrustZone-M extendido al sistema (periféricos, GPIO y canales DMA asignables individualmente a los dominios Secure/Non-Secure, 8 regiones SAU + 8+8 regiones MPU por núcleo), arranque firmado (SHA-256 + ECDSA secp256k1, huella de clave pública en el OTP de 8 KB, contador anti-retroceso), claves de cifrado en el OTP, acelerador de hardware SHA-256, TRNG, coprocesador de redundancia (RCP) y detector de glitches contra la inyección de fallos (datasheet RP2350, §10, §3.6.3, §12.12–12.13). Este tutorial: comprender la cadena de confianza, sus dos grandes compromisos y el orden de las operaciones — porque el OTP es irreversible.
Material
- 1 × placa RP2350 de prueba (el OTP es de un solo sentido: nunca empieces con tu placa «de producción»)
- pico-sdk 2.x + herramientas de firma del SDK (categoría
pico_bootrom/OTP; SIN VERIFICAR: los nombres exactos de las utilidades de firma evolucionan — sigue la documentación de seguridad del SDK de tu versión) - Par de claves generado fuera de la placa, clave privada nunca almacenada en la máquina de desarrollo final
La cadena de confianza
- Boot ROM inmutable: en cada reinicio, lee un descriptor de firma en la flash; si el arranque seguro está desactivado (estado predeterminado), arranca cualquier cosa — esto es lo que hace posible el arrastre y suelta de UF2.
- Huella de clave en el OTP: activar el arranque seguro = grabar la huella de tu clave pública en el OTP. Cualquier imagen no firmada con la clave privada correspondiente es rechazada. No existe un «apagado» para el OTP: una clave perdida = ningún firmware posible en el chip.
- Anti-retroceso: el contador OTP impide volver a versiones anteriores (protección contra el downgrade) — define tu política de versiones ANTES de grabar.
- TrustZone-M: partición SAU/MPU por núcleo, y sobre todo la granularidad del sistema — puedes poner el controlador USB en Non-Secure y tu clave en Secure. Atención al errata E3 en RP2350A (QFN-60):
GPIO_NSMASK0aplica los permisos Non-Secure de los PADS a los pines incorrectos (el mapeo ignora el remapeo de los pads QFN-60, datasheet Appendix D.1.1) — revisa el errata antes de diseñar una partición Secure/Non-Secure en un RP2350A.
Los dos compromisos a conocer
- Arranque seguro ⇒ RISC-V desactivado: la verificación de firma está en la ruta de arranque del Cortex-M33; activar SB fuerza los núcleos Arm (datasheet §10). Eliges entre firma y ARCHSEL.
- La seguridad física tiene un precio: el desafío de hacking de DEF CON 32 ($10k→$20k para leer el OTP) fue ganado en enero de 2025 por 4 equipos mediante inyección de fallos láser en el arranque seguro y lectura del OTP mediante haz de iones focalizados; Raspberry Pi publicó las mitigaciones E20/E21/E24/E26 (bootrom de los steppings A3/A4). Compra silicio reciente y ten en cuenta el RCP + detector de glitches en tu modelo de amenazas.
Verificación esperada
En la placa de prueba: imagen firmada arrancada, imagen modificada en un byte rechazada (el LED de estado o el código de retorno del bootrom lo indican). SIN VERIFICAR: el procedimiento exacto de escritura OTP (comandos pico-bootrom, páginas involucradas) — sigue la documentación de seguridad del SDK, no improvises con el OTP.
Errores frecuentes
- Grabar la huella de clave en LA placa que quieres conservar, sin copia de seguridad de la clave privada: bloqueo garantizado si se pierde la clave.
- Probar el arranque seguro en un stepping A2: los erratas E20/E21/E24/E26 (mitigaciones de inyección de fallos) solo se corrigen en A3/A4 — el silicio importa.
- Olvidar el errata E3 (QFN-60) y creer que tu partición PADS es correcta en RP2350A.
- Confundir arranque seguro (autenticidad) y cifrado (confidencialidad): el arranque firmado impide el firmware no autorizado, pero no la lectura de tu flash mediante XIP — el RP2350 no cifra la flash XIP por defecto.
- Ignorar los términos «PUF» o el pin «TRUSTED» que se leen en algunos blogs: SIN VERIFICAR — estos mecanismos no aparecen en el datasheet 2025-07-29; los componentes documentados son OTP, SAU/MPU, RCP, TRNG y SHA-256.
- Descuidar los otros erratas del bootrom (E13 imagen inválida bloquea el arranque, E18 patrón ECC inválido en el campo de partición OTP = arranque bloqueado): en A2, una escritura OTP mal formada puede matar el chip — revisa cada palabra antes de escribir.
- Pensar que TrustZone protege contra ataques físicos conectados sin activar el RCP ni el detector de glitches: ambos son periféricos que deben configurarse, no magia.
Otros tutoriales para esta placa
- Flasher MicroPython sur une carte RP2350 générique et faire clignoter la première LED
- Console série sur RP2350 : USB CDC natif et UART0 de secours
- Lire l'ADC 12 bits et le capteur de température interne du RP2350
- Exploiter les 3 blocs PIO et 12 machines d'état du RP2350 (avec IRQ dédiées)
- Pico SDK 2.x sur une carte RP2350 générique : CMake, board header et PICO_BOARD
- Basculer les cœurs de Arm Cortex-M33 à Hazard3 RISC-V avec ARCHSEL
Ejemplos de código para esta placa
clignotante.pyPythonbouton-interruption.pyPythonpwm-servo.pyPythonlecture-adc.pyPythonneopixel.pyPythonoled-i2c.pyPython