
LPC55S69およびK82シリーズで発見されたBootROMの脆弱性をテストするためのPoC
LPC55S69 および K82 シリーズ Revision A2 で発見された BootROM の脆弱性をテストするための PoC です。この脆弱性は、LPC55S69 の新しい Revision 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) モードを提供します。USB ISP モードは、NXP の文書化された更新コマンドを介してファームウェアを更新するための組み込みホストを提供します。
ISP は LPC55S69 および K82 の BootROM の一部であり、特定のレジスタビット、ISP ピン、イメージヘッダ定義の値に応じてトリガされます。LPC55S69 では、USB HID クラスを使用して USB0/1 ポートのイメージをダウンロードします。同様に、K82 では ROM 内の Kinetis ブートローダーが USB HID クラスとして USB ペリフェラルを介したフラッシュへのデータロードをサポートします。
LPC55S69 および K82 シリーズの IC の USB ISP は、以下の 3 つのエンドポイントを使用します:
バッファオーバーリードの脆弱性は、USB ホスト列挙に使用される USB Control エンドポイント 0 で観察されました。
ターゲット 1: LPC55S69
バッファオーバーリードの脆弱性は、組み込み USB ホストからの GET Descriptor Configuration リクエストで観察されます。攻撃者は、GET Descriptor Configuration を送信する USB リクエストを作成する際に、「wlength」の値を 65535 バイトに変更することで、最大 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: バッファオーバーリードの 4KB は、Libusb の「MAX_CTRL_BUFFER_LENGTH」の制限により Ubuntu システムで要求できます。これは Raspberry-pi システムでは変更可能であり、16KB を要求できます。添付のファームウェア「LPC.bin」は、raspberry-pi 4 model b を使用して LPC55s69-EVK ボードから取得したものです。
4KB を超えるリクエストを発行したい場合は、Horac が作成したこの素晴らしいスクリプトを Raspi で使用し、wlength を 65535(0xffff) に変更して PoC を実行してください。
ターゲット 2: Kinetis K82
バッファオーバーリードの脆弱性は、組み込み USB ホストからの GET Status-Other リクエストで観察されます。攻撃者は、GET status-Other を送信する USB リクエストを作成する際に、「wlength」の値を 65535 バイトに変更することで、最大 64KB の応答データを要求できます。K82 USB デバイスは 64KB のデータを正常に送信します。
デバイスの詳細:
ターゲット開発ボード: FRDM-K82F USB ホスト: Ubuntu ラップトップまたは Raspberry-pi
sudo python3 K82_USB.py
注記 1: バッファオーバーリードの 4KB は、Libusb の「MAX_CTRL_BUFFER_LENGTH」の制限により Ubuntu システムで要求できます。これは Raspberry-pi では変更可能であり、64KB を要求できます。
注記 2: K82 の脆弱性は、USB リクエストが GET status-Device、Interface、Endpoint、その他の順に続けて発生した場合にのみ再現され、脆弱性がトリガされます。これは、複数回の ISP リセット後に開発した PoC スクリプトを実行することで実現できます。
4KB を超えるリクエストを発行したい場合は、Horac が作成したこの素晴らしいスクリプトを Raspi で使用し、wlength を 65535(0xffff) に変更して PoC を実行してください。