
LPC55S69 및 K82 시리즈에서 발견된 BootROM 취약점을 테스트하기 위한 POC
LPC55S69 및 K82 시리즈 개정 A2에서 발견된 BootROM 취약점을 테스트하기 위한 POC입니다. 이 취약점은 LPC55S69의 새로운 개정 A3가 적용된 최신 장치에서 수정되었습니다.
취약한 장치:
확인됨: LPC55S69 및 K82 시리즈 MCU
의심됨: 유사한 USB ISP 스택을 가진 다른 NXP 시리즈 MCU - Kinetis K 시리즈 및 RT 시리즈
NXP LPC55s69 및 Kinetis K82 마이크로컨트롤러 시리즈의 USB 시스템 내 프로그래밍(ISP) 모드에서 버퍼 오버 리드 취약점이 관찰되었습니다. 악용될 경우, 이 취약점을 통해 공격자는 보호된 플래시 메모리에서 16KB(LPC55S69) 및 64KB(K82)의 데이터를 읽을 수 있습니다.
NXP LPC55S69 및 K82 MCU는 USB, SPI, UART 및 I2C와 같은 주변 장치를 사용하여 MCU 펌웨어의 현장 업데이트를 위한 시스템 내 프로그래밍(ISP) 모드를 제공합니다. USP ISP 모드는 NXP의 문서화된 업데이트 명령을 통해 펌웨어를 업데이트할 수 있는 내장 호스트를 제공합니다.
ISP는 LPC55S69 및 K82 BootROM의 일부이며, 특정 레지스터 비트, ISP 핀 및 이미지 헤더 정의 값에 따라 트리거됩니다. LPC55S69의 경우 USB HID 클래스를 사용하여 USB0/1 포트의 이미지를 다운로드하고, 마찬가지로 K82의 경우 ROM의 Kinetis 부트로더가 USB HID 클래스로 USB 주변 장치를 통해 플래시에 데이터를 로드하는 것을 지원합니다.
LPC55S69 및 K82 시리즈 IC의 USB ISP는 모두 세 개의 엔드포인트를 사용하며, 아래에 나열되어 있습니다:
버퍼 오버 리드 취약점은 USB 호스트 열거에 사용되는 USB 제어 엔드포인트 0에서 관찰되었습니다.
대상 1: LPC55S69
버퍼 오버 리드 취약점은 내장 USB 호스트로부터의 GET Descriptor Configuration 요청에서 관찰됩니다. 공격자는 "wlength" 값을 65535바이트로 수정하여 GET Descriptor Configuration을 보내는 USB 요청을 조작함으로써 최대 16KB의 응답 데이터를 요청할 수 있습니다. LPC556S9는 16KB의 데이터가 USB TX 버퍼에 복사되어 호스트로 성공적으로 전송될 때 제한을 두고 리셋됩니다.
장치 세부 사항:
대상 개발 보드: LPC55S69 – EVK RevA2 USB 호스트: Ubuntu 20.04 또는 Raspberry-pi 4 Model B
취약점 재현 단계:
그림 1: Ubuntu dmesg 유틸리티가 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: Ubuntu 시스템에서는 Libusb “MAX_CTRL_BUFFER_LENGTH”의 제한으로 인해 4KB의 버퍼 오버 리드를 요청할 수 있습니다. 이는 Raspberry-pi 시스템에서 수정할 수 있으며 16KB를 요청할 수 있습니다. Raspberry-pi 4 모델 b를 사용하여 LPC55s69-EVK 보드에서 검색된 첨부 펌웨어 “LPC.bin”.
4KB보다 큰 요청을 발행하려면 Raspi에서 Horac이 만든 이 멋진 스크립트를 사용하고 wlength를 65535(0xffff)로 변경하여 POC를 실행하십시오.
대상 2: Kinetis K82
버퍼 오버 리드 취약점은 내장 USB 호스트로부터의 GET Status-Other 요청에서 관찰됩니다. 공격자는 "wlength" 값을 65535바이트로 수정하여 GET status-Other를 보내는 USB 요청을 조작함으로써 최대 64KB의 응답 데이터를 요청할 수 있습니다. K82 USB 장치는 64KB의 데이터를 성공적으로 전송합니다.
장치 세부 사항:
대상 개발 보드: FRDM-K82F USB 호스트: Ubuntu 노트북 또는 Raspberry-pi
sudo python3 K82_USB.py
참고 1: Ubuntu 시스템에서는 Libusb “MAX_CTRL_BUFFER_LENGTH”의 제한으로 인해 4KB의 버퍼 오버 리드를 요청할 수 있습니다. 이는 Raspberry-pi에서 수정할 수 있으며 64KB를 요청할 수 있습니다.
참고 2: K82의 취약점은 GET status-Device, Interface, Endpoint 및 기타에 대한 USB 요청이 취약점을 트리거하기 위해 순차적으로 발생해야만 재현됩니다. 이는 여러 번의 ISP 리셋 후에 개발된 PoC 스크립트를 실행하여 달성할 수 있습니다.
4KB보다 큰 요청을 발행하려면 Raspi에서 Horac이 만든 이 멋진 스크립트를 사용하고 wlength를 65535(0xffff)로 변경하여 POC를 실행하십시오.