
POC zum Testen der BootROM-Sicherheitslücke, die in der LPC55S69- und K82-Serie gefunden wurde.
POC zum Testen der BootROM-Sicherheitslücke in LPC55S69 und K82 Serie Revision A2. Die Sicherheitslücke ist in neueren Geräten mit der neueren Revision A3 für LPC55S69 behoben.
Betroffene Geräte:
Bestätigt: LPC55S69 und K82 Serie MCUs
Vermutet: andere NXP-Serien MCUs mit ähnlichem USB-ISP-Stack - Kinetis K-Serie und RT-Serie
Eine Puffer-Überlese-Sicherheitslücke wurde im USB In-System Programming (ISP)-Modus der NXP LPC55S69 und Kinetis K82 Mikrocontroller-Serien beobachtet. Bei Ausnutzung ermöglicht die Sicherheitslücke einem Angreifer, 16KB (LPC55S69) und 64KB (K82) Daten aus geschütztem Flash-Speicher zu lesen.
NXP LPC55S69 und K82 MCUs bieten In-System Programming (ISP)-Modi für die Feldaktualisierung der Firmware der MCUs mittels Peripheriegeräten wie USB, SPI, UART und I2C. Der USP ISP-Modus bietet einen eingebetteten Host zur Aktualisierung der Firmware über die dokumentierten Update-Befehle von NXP.
Der ISP ist Teil des LPC55S69 und K82 BootROM und wird ausgelöst abhängig von den Werten bestimmter Registerbits, des ISP-Pins und der Image-Header-Definition. Für LPC55S69 wird die USB HID-Klasse verwendet, um ein Image des USB0/1-Ports herunterzuladen, und ähnlich unterstützt für K82 der Kinetis Bootloader im ROM das Laden von Daten in den Flash über das USB-Peripheriegerät als USB HID-Klasse.
Sowohl der LPC55S69 als auch der K82 Serie ICs USB ISP verwenden drei (3) Endpunkte, die unten aufgeführt sind:
Die Puffer-Überlese-Sicherheitslücke wurde für den USB Control Endpunkt 0 beobachtet, der für die USB-Host-Enumeration verwendet wird.
Ziel 1: LPC55S69
Die Puffer-Überlese-Sicherheitslücke wird bei der GET Descriptor Configuration-Anfrage des eingebetteten USB-Hosts beobachtet. Ein Angreifer kann bis zu 16KB Antwortdaten anfordern, indem er eine USB-Anfrage zum Senden von GET Descriptor Configuration erstellt und den Wert „wlength“ auf 65535 Bytes ändert. LPC556S9 begrenzt und setzt zurück, wenn 16KB Daten in den USB-TX-Puffer kopiert und erfolgreich an den Host übertragen werden.
Gerätedetails:
Target Dev Board: LPC55S69 – EVK RevA2 USB Host: Ubuntu 20.04 oder Raspberry Pi 4 Model B
Schritte zur Reproduktion der Sicherheitslücke:
Abbildung 1: Ubuntu dmesg-Dienstprogramm zeigt USB-Gerätedetails
[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


Hinweis 1: Der Pufferüberlese von 4KB kann im Ubuntu-System aufgrund der Einschränkung von Libusb „MAX_CTRL_BUFFER_LENGTH“ angefordert werden. Dies kann in einem Raspberry Pi System geändert werden und 16KB können angefordert werden. Beigefügte Firmware „LPC.bin“, die vom LPC55s69-EVK-Board mit einem Raspberry Pi 4 Model B abgerufen wurde.
Wenn Sie Anfragen größer als 4KB stellen möchten, verwenden Sie dieses großartige Skript von Horac auf einem Raspi und führen Sie den POC mit auf 65535 (0xffff) geändertem wlength aus.
Ziel 2: Kinetis K82
Die Puffer-Überlese-Sicherheitslücke wird bei der GET Status-Other-Anfrage eines eingebetteten USB-Hosts beobachtet. Ein Angreifer kann bis zu 64KB Antwortdaten anfordern, indem er eine USB-Anfrage zum Senden von GET Status-Other erstellt und den Wert „wlength“ auf 65535 Bytes ändert. Das K82-USB-Gerät sendet erfolgreich 64KB Daten.
Gerätedetails:
Target Dev Board: FRDM-K82F USB Host: Ubuntu Laptop oder Raspberry Pi
sudo python3 K82_USB.py
Hinweis 1: Der Pufferüberlese von 4KB kann im Ubuntu-System aufgrund der Einschränkung von Libusb „MAX_CTRL_BUFFER_LENGTH“ angefordert werden. Dies kann in einem Raspberry Pi geändert werden und 64KB können angefordert werden.
Hinweis 2: Die Sicherheitslücke in K82 wird nur reproduziert, wenn die USB-Anfragen nach GET status-Device, Interface, Endpoint und andere nacheinander erfolgen, um die Sicherheitslücke auszulösen. Dies kann erreicht werden, indem die entwickelten PoC-Skripte nach mehreren ISP-Resets ausgeführt werden.
Wenn Sie Anfragen größer als 4KB stellen möchten, verwenden Sie dieses großartige Skript von Horac auf einem Raspi und führen Sie den POC mit auf 65535 (0xffff) geändertem wlength aus.