
POC para testar a vulnerabilidade BootROM encontrada nas séries LPC55S69 e K82.
POC para testar a vulnerabilidade de BootROM encontrada na Revisão A2 das séries LPC55S69 e K82. A vulnerabilidade é corrigida em dispositivos mais novos com a nova Revisão A3 para o LPC55S69.
Dispositivos Vulneráveis:
Confirmados: MCUs das séries LPC55S69 e K82
Suspeitos: outros MCUs da série NXP com stack de USB ISP semelhante - séries Kinetis K e RT
Uma vulnerabilidade de buffer over read foi observada no modo de Programação no Sistema (ISP) via USB das séries de microcontroladores NXP LPC55s69 e Kinetis K82. Quando explorada, a vulnerabilidade permite que um atacante leia 16KB (LPC55S69) e 64KB (K82) de dados da memória flash protegida.
Os MCUs NXP LPC55S69 e K82 fornecem modos de Programação no Sistema (ISP) para atualização em campo do firmware do MCU usando periféricos como USB, SPI, UART e I2C. O modo USP ISP fornece um host embarcado para atualizar o firmware por meio dos comandos de atualização documentados da NXP.
O ISP faz parte do BootROM do LPC55S69 e K82 e é acionado dependendo dos valores de certos bits de registradores, do pino ISP e da definição do cabeçalho da imagem. Para o LPC55S69, a classe USB HID é usada para baixar uma imagem da porta USB0/1 e, de forma semelhante, para o K82, o Kinetis Bootloader na ROM suporta carregar dados na flash via periférico USB como uma classe USB HID.
O USB ISP dos ICs das séries LPC55S69 e K82 usa três (3) endpoints, listados abaixo:
A vulnerabilidade de buffer over read foi observada no endpoint 0 de controle USB, que é usado para enumeração do host USB.
Alvo 1: LPC55S69
A vulnerabilidade de buffer over read é observada na solicitação GET Descriptor Configuration de um host USB embarcado. Um atacante pode solicitar até 16KB de dados de resposta ao criar uma solicitação USB para enviar GET Descriptor Configuration, modificando o valor de “wlength” para 65535 bytes. LPC556S9 limita e reinicia quando 16KB de dados são copiados para o buffer TX USB e transmitidos com sucesso ao host.
Detalhes do Dispositivo:
Placa de desenvolvimento alvo: LPC55S69 – EVK RevA2 Host USB: Ubuntu 20.04 ou Raspberry-pi 4 Model B
Passos para reproduzir a vulnerabilidade:
Figura 1: Utilitário dmesg do Ubuntu mostrando detalhes do 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: A leitura de buffer over read de 4KB pode ser solicitada no sistema Ubuntu devido à restrição do Libusb “MAX_CTRL_BUFFER_LENGTH”. Isso pode ser modificado em um sistema Raspberry-pi e 16KB podem ser solicitados. O firmware anexado “LPC.bin” foi recuperado da placa LPC55s69-EVK usando um raspberry-pi 4 model b.
Se você quiser emitir solicitações maiores que 4KB, use este script incrível criado por Horac em um Raspi e execute a POC com wlength alterado para 65535(0xffff).
Alvo 2: Kinetis K82
A vulnerabilidade de buffer over read é observada na solicitação GET Status-Other de um host USB embarcado. Um atacante pode solicitar até 64KB de dados de resposta ao criar uma solicitação USB para enviar GET status-Other, modificando o valor de “wlength” para 65535 bytes. O dispositivo USB K82 envia com sucesso 64KB de dados.
Detalhes do Dispositivo:
Placa de desenvolvimento alvo: FRDM-K82F Host USB: laptop Ubuntu ou Raspberry-pi
sudo python3 K82_USB.py
Nota 1: A leitura de buffer over read de 4KB pode ser solicitada no sistema Ubuntu devido à restrição do Libusb “MAX_CTRL_BUFFER_LENGTH”. Isso pode ser modificado em um Raspberry-pi e 64KB podem ser solicitados.
Nota 2: a vulnerabilidade no K82 é reproduzida somente quando as solicitações USB para GET status-Device, Interface, Endpoint e outras ocorrem subsequentemente para acionar a vulnerabilidade. Isso pode ser alcançado executando os scripts de POC desenvolvidos após múltiplos resets de ISP.
Se você quiser emitir solicitações maiores que 4KB, use este script incrível criado por Horac em um Raspi e execute a POC com wlength alterado para 65535(0xffff).