
POC para probar la vulnerabilidad BootROM encontrada en LPC55S69 y la serie K82
POC para probar la vulnerabilidad BootROM encontrada en las series LPC55S69 y K82 Revisión A2. La vulnerabilidad está corregida en dispositivos más nuevos con la nueva Revisión A3 para LPC55S69.
Dispositivos vulnerables:
Confirmados: MCU de las series LPC55S69 y K82
Sospechosos: otros MCU de la serie NXP con una pila USB ISP similar: series Kinetis K y RT
Se observó una vulnerabilidad de sobrelectura de búfer en el modo de programación en sistema (ISP) USB de las series de microcontroladores NXP LPC55S69 y Kinetis K82. Cuando se explota, la vulnerabilidad permite a un atacante leer 16 KB (LPC55S69) y 64 KB (K82) de datos de la memoria flash protegida.
Los MCU NXP LPC55S69 y K82 proporcionan modos de programación en sistema (ISP) para la actualización en campo del firmware del MCU mediante periféricos como USB, SPI, UART e I2C. El modo ISP USB proporciona un host integrado para actualizar el firmware mediante los comandos de actualización documentados de NXP.
El ISP forma parte del BootROM de LPC55S69 y K82, y se activa según los valores de ciertos bits de registro, el pin ISP y la definición del encabezado de imagen. Para LPC55S69, se utiliza la clase USB HID para descargar una imagen del puerto USB0/1 y, de manera similar, para K82, el Kinetis Bootloader en la ROM admite cargar datos en la flash a través del periférico USB como una clase USB HID.
Tanto los IC de las series LPC55S69 como K82 usan tres (3) endpoints USB ISP, que se enumeran a continuación:
La vulnerabilidad de sobrelectura de búfer se observó en el endpoint de control USB 0, que se utiliza para la enumeración del host USB.
Objetivo 1: LPC55S69
La vulnerabilidad de sobrelectura de búfer se observa en la solicitud GET Descriptor Configuration desde el host USB integrado. Un atacante puede solicitar hasta 16 KB de datos de respuesta al crear una solicitud USB para enviar GET Descriptor Configuration, modificando el valor de “wlength” a 65535 bytes. LPC556S9 limita y se reinicia cuando se copian 16 KB de datos al búfer TX USB y se transmiten correctamente al host.
Detalles del dispositivo:
Placa de desarrollo objetivo: LPC55S69 – EVK RevA2 Host USB: Ubuntu 20.04 o Raspberry-pi 4 Model B
Pasos para reproducir la vulnerabilidad:
Figura 1: la utilidad dmesg de Ubuntu mostrando los detalles del dispositivo USB
[43295.318228] usb 1-1.4: USB disconnect, device number 95
[43296.175536] usb 1-1.4: new full-speed USB device number 96 using xhci_hcd
[43296.397315] usb 1-1.4: New USB device found, idVendor=1fc9, idProduct=0021, bcdDevice= 3.00
[43296.397331] usb 1-1.4: New USB device strings: Mfr=1, Product=2, SerialNumber=0
[43296.397337] usb 1-1.4: Product: USB COMPOSITE DEVICE
[43296.397342] usb 1-1.4: Manufacturer: NXP SEMICONDUCTOR INC.
[43296.400768] hid-generic 0003:1FC9:0021.0055: hiddev0,hidraw4: USB HID v1.00 Device [NXP SEMICONDUCTOR INC. USB COMPOSITE DEVICE] on usb-0000:00:14.0-1.4/input0
sudo python3 LPC_USB.py


Nota 1: La sobrelectura de búfer de 4 KB se puede solicitar en el sistema Ubuntu debido a la restricción de Libusb “MAX_CTRL_BUFFER_LENGTH”. Esto se puede modificar en un sistema Raspberry-pi y se pueden solicitar 16 KB. El firmware adjunto “LPC.bin” se obtuvo de la placa LPC55s69-EVK usando una raspberry-pi 4 model b.
Si desea realizar solicitudes superiores a 4 KB, use este increíble script creado por Horac en una Raspi y ejecute la PoC con wlength cambiado a 65535 (0xffff).
Objetivo 2: Kinetis K82
La vulnerabilidad de sobrelectura de búfer se observa en la solicitud GET Status-Other desde un host USB integrado. Un atacante puede solicitar hasta 64 KB de datos de respuesta al crear una solicitud USB para enviar GET status-Other, modificando el valor de “wlength” a 65535 bytes. El dispositivo USB K82 envía correctamente 64 KB de datos.
Detalles del dispositivo:
Placa de desarrollo objetivo: FRDM-K82F Host USB: portátil Ubuntu o Raspberry-pi
sudo python3 K82_USB.py
Nota 1: La sobrelectura de búfer de 4 KB se puede solicitar en el sistema Ubuntu debido a la restricción de Libusb “MAX_CTRL_BUFFER_LENGTH”. Esto se puede modificar en una Raspberry-pi y se pueden solicitar 64 KB.
Nota 2: la vulnerabilidad en K82 se reproduce solo cuando las solicitudes USB de GET status-Device, Interface, Endpoint y otras ocurren posteriormente para desencadenar la vulnerabilidad. Esto se puede lograr ejecutando los scripts PoC desarrollados después de múltiples reinicios del ISP.
Si desea realizar solicitudes superiores a 4 KB, use este increíble script creado por Horac en una Raspi y ejecute la PoC con wlength cambiado a 65535 (0xffff).