
CVE-2022-38694 強化エクスプロイト - Unisocデバイス向けRP2350 USBホスト自動フラッシャー
CVE-2022-38694 Unisoc BootROM の脆弱性を Raspberry Pi RP2350 USB Host 経由で悪用し、起動時に SPL Loader を自動送信して任意の u-boot を起動します。
従来 PC と spd_dump を必要としたエクスプロイトチェーンを、RP2350 マイクロコントローラ上に移行します。デバイスを接続するだけで自動書き込み、連続書き込みに対応します。
CVE-2022-38694 は、Unisoc BootROM における一回限りの署名検証バイパスです。exec stub を特定のメモリアドレスに送信することで、戻りアドレスが上書きされ、署名チェックがバイパスされて、BootROM が任意の FDL1 を受け入れて実行できるようになります。
重要なポイント: FDL1 と SPL Loader は同じロードアドレス(0x28007000)を共有しているため、パッチ適用済みの SPL Loader を FDL1 の代わりに送信することで、任意の u-boot を起動できます。
初回セットアップには、spd_dump が動作する PC が必要です:
┌──────────────────────────────────────────────────────────────────────────┐
│ Stage 1: PC-side Initial Unlock │
├──────────────────────────────────────────────────────────────────────────┤
│ │
│ Step 1: Exploit CVE-2022-38694 to boot patched SPL │
│ ┌────────────┐ ┌────────────┐ ┌─────────────────┐ │
│ │ Exec Stub │───►│ spl-unlock │───►│ Device boots │ │
│ │ @0x3F28 │ │ @0x28007000│ │ into DL mode │ │
│ └────────────┘ └────────────┘ └────────┬────────┘ │
│ │ │
│ Step 2: Send patched FDL2 via spd_dump, flash u-boot without │
│ secure boot, erase splloader │
│ │ │
│ ┌─────────────────┐ ┌──────────────────────▼───────────┐ │
│ │ Send fdl2-dl │───►│ Write u-boot (secure boot removed│ │
│ │ (patched FDL2) │ │ + Erase splloader partition) │ │
│ └─────────────────┘ └──────────────────────────────────┘ │
│ │
│ ★ After erasing splloader, device enters BootROM DL mode on every boot │
└──────────────────────────────────────────────────────────────────────────┘
手順:
spl-unlock.bin を送信し、デバイスを起動するfdl2-dl.bin(セキュアブート検証が除去された FDL2)を送信するsplloader が消去されると、デバイスは電源投入のたびに BootROM ダウンロードモードに入ります。RP2350 USB Host がエクスプロイトチェーンを自動的に処理します:
┌──────────────────────────────────────────────────────────────────────────┐
│ Stage 2: RP2350 Automated Boot │
├──────────────────────────────────────────────────────────────────────────┤
│ │
│ Power on → no splloader → BootROM download mode │
│ │
│ ┌─────────┐ ┌────────────┐ ┌─────────────┐ ┌──────────────┐ │
│ │ BootROM │───►│ Exec Stub │───►│ spl-unlock │───►│ U-Boot │ │
│ │ Handshk │ │ Bypass sig │ │ as FDL1 │ │ (no secboot) │ │
│ └─────────┘ └────────────┘ └─────────────┘ │ Boot OK ✓ │ │
│ └──────────────┘ │
│ │
│ ★ Fully automatic. Unplug → auto-reset → ready for next device. │
└──────────────────────────────────────────────────────────────────────────┘
なぜ splloader を消去するのか?
┌─────────────┐ ┌──────────────────┐ ┌───────────────────┐ ┌──────────────┐
│ BootROM │ │ Exec Stub │ │ SPL Loader │ │ U-Boot │
│ Handshake │ ──► │ @0x3F28 (136B) │ ──► │ @0x28007000 │ ──► │ Boot OK │
│ CHECK_BAUD │ │ Bypass sig chk │ │ Replaces FDL1 │ │ │
└─────────────┘ └──────────────────┘ └───────────────────┘ └──────────────┘
CHECK_BAUD + CONNECT で BSL 通信を確立0x3F28 にロードし、CVE-2022-38694 を悪用して戻りアドレスを上書きし、署名検証をバイパス0x28007000 を共有、署名はすでにバイパス済みこのプロジェクトには汎用のパッチ適用済みファームウェアは含まれていません。お使いのデバイスのファームウェアを自分でパッチする必要があります。
TomKing062 の Wiki を参照してください:
xxd -i spl-unlock.bin > fdl1_data.h
コード参照と一致するように、fdl1_data.h 内の配列名とマクロを更新します。
このプロジェクトは現在、UDX710 の exec stub(custom_exec_3f28.bin)を使用しています。
他のチップに対応するには、custom_exec_data.h 内の exec stub とロードアドレスを置き換えます:
完全なサポートリスト: SupportList
| コンポーネント | 説明 |
|---|---|
| RP2350 Board | 例: Raspberry Pi Pico 2 |
| USB Host Cable | RP2350 USB Host 用の OTG またはハードウェア改造 |
| Target SPD Device | splloader が消去済みで、電源投入時に BootROM DL モードへ自動移行 |
| ピン | 機能 |
|---|---|
| USB D+/D- | ターゲット SPD デバイスに接続 |
| GP4 (TX) | UART デバッグ出力 |
| GP5 (RX) | UART デバッグ入力 |
USB ポートは Host 通信に使用されます。デバッグログは UART1(GP4/GP5、115200bps) 経由で出力されます。
cd spd_flasher
mkdir build && cd build
cmake .. -DTARGET_CHIP=rp2350
make -j$(nproc)
出力: spd_flasher.uf2(BOOTSEL 経由でドラッグ&ドロップ)/ spd_flasher.bin(プログラマー用)
spd_flasher.uf2 を RP2350 に書き込むspd_flasher/
├── main.c # Main program, USB Host init & device management
├── spd_protocol.c # SPD BSL protocol (HDLC framing, state machine)
├── spd_protocol.h # Protocol definitions
├── tusb_config.h # TinyUSB Host configuration
├── custom_exec_data.h # Exec Stub data (136B @0x3F28)
├── fdl1_data.h # SPL Loader data (spl-unlock.bin @0x28007000)
├── spl-unlock.bin # SPL Loader raw binary
├── CMakeLists.txt # CMake build configuration
└── signing_key.pem / aes_key.bin / iv_salt.bin # RP2350 secure boot keys
このプロジェクトは、セキュリティ研究および教育目的のみを対象としています。利用者は、適用されるすべての法令を遵守する必要があります。作者は、このツールの使用によって生じたいかなる直接的または間接的な損害についても責任を負いません。
このプロジェクトは GNU General Public License v3.0 の下でライセンスされています。
| ファームウェア | パッチ | 出力 | 目的 |
|---|
| FDL2 (u-boot/lk) | セキュアパーティション書き込みチェックを NOP 化 | fdl2-dl.bin | ステージ1: spd_dump 経由で送信し、パーティション書き込みに使用 |
| U-Boot | do_cboot() をパッチしてセキュアブートを除去 | 変更済み uboot | ステージ1: デバイスに書き込まれ、ストック uboot を置き換え |
| SPL Loader | signcheck() と結果チェックを NOP 化 | spl-unlock.bin | ステージ1 & 2: CVE-2022-38694 経由で送信 |
| プラットフォーム | 実行アドレス | 参照 |
|---|
| UDX710 | 0x3F28 | このプロジェクト(デフォルト) |
| UMS312 / UMS512 | 0x3EE8 | exec_addr_v2 |
| UMS9230 | 0x65017F08 | exec_addr_v2 |
| SC9820E / SC9832E | 0x4F18 / 0x4EE8 | CVE-2022-38694 |
| PC + spd_dump | RP2350 堅牢化 |
|---|
| サイズ | PC が必要 | 単一 MCU |
| 操作 | 手動コマンド | 電源投入 = 実行 |
| 連続書き込み | デバイスごとに手動 | 自動リセット |
| 展開 | 不便 | 実運用可能 |
| コスト | — | ~$3 |