
PoC для тестирования уязвимости BootROM, обнаруженной в LPC55S69 и серии K82
POC для проверки уязвимости BootROM, обнаруженной в LPC55S69 и K82 Series Revision A2. Уязвимость устранена в новых устройствах с Revision A3 для LPC55S69.
Уязвимые устройства:
Подтверждено: микроконтроллеры серий LPC55S69 и K82
Предположительно: другие серии микроконтроллеров NXP с аналогичным стеком USB ISP – серии Kinetis K и RT
Уязвимость чтения за пределами буфера была обнаружена в режиме USB-внутрисистемного программирования (ISP) микроконтроллеров NXP LPC55s69 и Kinetis K82. При эксплуатации уязвимость позволяет злоумышленнику прочитать 16 КБ (LPC55S69) и 64 КБ (K82) данных из защищенной флеш-памяти.
Микроконтроллеры NXP LPC55S69 и K82 предоставляют режимы внутрисистемного программирования (ISP) для полевого обновления прошивки с помощью периферийных интерфейсов, таких как USB, SPI, UART и I2C. Режим USP ISP предоставляет встроенный хост для обновления прошивки с помощью документированных команд обновления NXP.
ISP является частью BootROM LPC55S69 и K82 и запускается в зависимости от значений определенных битов регистров, вывода ISP и определения заголовка образа. Для LPC55S69 используется класс USB HID для загрузки образа через порт USB0/1, а для K82 загрузчик Kinetis в ROM поддерживает загрузку данных во флеш-память через USB-периферию как класс USB HID.
Микросхемы серий LPC55S69 и K82 используют три (3) конечные точки USB ISP, которые перечислены ниже:
Уязвимость чтения за пределами буфера была обнаружена для контрольной конечной точки USB 0, используемой для перечисления хоста USB.
Цель 1: LPC55S69
Уязвимость чтения за пределами буфера наблюдается при запросе GET Descriptor Configuration от встроенного USB-хоста. Злоумышленник может запросить до 16 КБ данных ответа, сформировав USB-запрос на отправку GET Descriptor Configuration, изменив значение «wlength» на 65535 байт. LPC556S9 ограничивает и сбрасывает, когда 16 КБ данных копируется в TX-буфер USB и успешно передается хосту.
Детали устройства:
Целевая плата: LPC55S69 – EVK RevA2 USB-хост: Ubuntu 20.04 или Raspberry-pi 4 Model B
Шаги для воспроизведения уязвимости:
Рисунок 1: Утилита dmesg в Ubuntu, показывающая детали 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


Примечание 1: Чтение за пределами буфера объемом 4 КБ может быть запрошено в системе Ubuntu из-за ограничения Libusb «MAX_CTRL_BUFFER_LENGTH». Это можно изменить в системе Raspberry-pi, и можно запросить 16 КБ. Прилагаемая прошивка «LPC.bin» получена с платы LPC55s69-EVK с использованием raspberry-pi 4 model b.
Если вы хотите отправлять запросы больше 4 КБ, используйте этот замечательный скрипт, созданный Horac на Raspi, и запустите PoC с измененным wlength на 65535 (0xffff).
Цель 2: Kinetis K82
Уязвимость чтения за пределами буфера наблюдается при запросе GET Status-Other от встроенного USB-хоста. Злоумышленник может запросить до 64 КБ данных ответа, сформировав USB-запрос на отправку GET status-Other, изменив значение «wlength» на 65535 байт. USB-устройство K82 успешно отправляет 64 КБ данных.
Детали устройства:
Целевая плата: FRDM-K82F USB-хост: ноутбук с Ubuntu или Raspberry-pi
sudo python3 K82_USB.py
Примечание 1: Чтение за пределами буфера объемом 4 КБ может быть запрошено в системе Ubuntu из-за ограничения Libusb «MAX_CTRL_BUFFER_LENGTH». Это можно изменить в Raspberry-pi, и можно запросить 64 КБ.
Примечание 2: уязвимость в K82 воспроизводится только тогда, когда USB-запросы на GET status-Device, Interface, Endpoint и другие происходят последовательно, чтобы вызвать уязвимость. Это можно достичь путем запуска разработанных PoC-скриптов после нескольких сбросов ISP.
Если вы хотите отправлять запросы больше 4 КБ, используйте этот замечательный скрипт, созданный Horac на Raspi, и запустите PoC с измененным wlength на 65535 (0xffff).