
POC per testare la vulnerabilità BootROM trovata nei modelli LPC55S69 e serie K82
POC per testare la vulnerabilità BootROM trovata su LPC55S69 e K82 Series Revision A2. La vulnerabilità è corretta nei dispositivi più recenti con la nuova Revision A3 per LPC55S69.
Dispositivi vulnerabili:
Confermati: MCU delle serie LPC55S69 e K82
Sospetti: altre serie di MCU NXP con stack USB ISP simile - Serie Kinetis K e Serie RT
È stata osservata una vulnerabilità di buffer over read nella modalità di programmazione In-System (ISP) USB delle serie di microcontrollori NXP LPC55s69 e Kinetis K82. Quando sfruttata, la vulnerabilità consente a un attaccante di leggere 16KB (LPC55S69) e 64KB (K82) di dati dalla memoria flash protetta.
Gli MCU NXP LPC55S69 e K82 forniscono modalità di programmazione In-System (ISP) per l'aggiornamento sul campo del firmware dell'MCU utilizzando periferiche come USB, SPI, UART e I2C. La modalità ISP USB fornisce un host embedded per aggiornare il firmware tramite i comandi di aggiornamento documentati da NXP.
L'ISP fa parte del BootROM di LPC55S69 e K82 e viene attivato in base ai valori di alcuni bit di registro, al pin ISP e alla definizione dell'header dell'immagine. Per LPC55S69, la classe USB HID viene utilizzata per scaricare un'immagine dalla porta USB0/1 e, analogamente, per K82 il bootloader Kinetis nella ROM supporta il caricamento dei dati nella flash tramite la periferica USB come classe USB HID.
Sia le serie LPC55S69 che K82 utilizzano tre (3) endpoint USB, elencati di seguito:
La vulnerabilità di buffer over read è stata osservata per l'endpoint USB Control 0, utilizzato per l'enumerazione dell'host USB.
Target 1: LPC55S69
La vulnerabilità di buffer over read è osservata nella richiesta GET Descriptor Configuration dall'host USB embedded. Un attaccante può richiedere fino a 16KB di dati di risposta, creando una richiesta USB per inviare GET Descriptor Configuration, modificando il valore "wlength" a 65535 byte. LPC556S9 limita e resetta quando 16KB di dati vengono copiati nel buffer TX USB e trasmessi con successo all'host.
Dettagli del dispositivo:
Scheda di sviluppo target: LPC55S69 – EVK RevA2 Host USB: Ubuntu 20.04 o Raspberry-pi 4 Model B
Passaggi per riprodurre la vulnerabilità:
Figura 1: Utility Ubuntu dmesg che mostra i dettagli 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: Il buffer over read di 4KB può essere richiesto su sistemi Ubuntu a causa della restrizione di Libusb "MAX_CTRL_BUFFER_LENGTH". Questo può essere modificato su un sistema Raspberry-pi e possono essere richiesti 16KB. Firmware allegato "LPC.bin" recuperato dalla scheda LPC55s69-EVK utilizzando un raspberry-pi 4 model b.
Se desideri inviare richieste superiori a 4KB, utilizza questo fantastico script creato da Horac su un Raspi ed esegui il POC con wlength modificato a 65535(0xffff).
Target 2: Kinetis K82
La vulnerabilità di buffer over read è osservata nella richiesta GET Status-Other da un host USB embedded. Un attaccante può richiedere fino a 64KB di dati di risposta, creando una richiesta USB per inviare GET status-Other, modificando il valore "wlength" a 65535 byte. Il dispositivo USB K82 invia con successo 64KB di dati.
Dettagli del dispositivo:
Scheda di sviluppo target: FRDM-K82F Host USB: Laptop Ubuntu o Raspberry-pi
sudo python3 K82_USB.py
Nota 1: Il buffer over read di 4KB può essere richiesto su sistemi Ubuntu a causa della restrizione di Libusb "MAX_CTRL_BUFFER_LENGTH". Questo può essere modificato su un Raspberry-pi e possono essere richiesti 64KB.
Nota 2: La vulnerabilità in K82 viene riprodotta solo quando le richieste USB per GET status-Dispositivo, Interfaccia, Endpoint e other devono avvenire successivamente per attivare la vulnerabilità. Ciò può essere ottenuto eseguendo gli script PoC sviluppati dopo più reset ISP.
Se desideri inviare richieste superiori a 4KB, utilizza questo fantastico script creato da Horac su un Raspi ed esegui il POC con wlength modificato a 65535(0xffff).