利用 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。
首次需要在 PC 上使用 spd_dump 完成解锁和固化:
┌──────────────────────────────────────────────────────────────────────────┐
│ 阶段一:PC 端首次解锁 │
├──────────────────────────────────────────────────────────────────────────┤
│ │
│ Step 1: 利用漏洞启动修改过的 SPL │
│ ┌────────────┐ ┌────────────┐ ┌─────────────────┐ │
│ │ Exec Stub │───►│ spl-unlock │───►│ 设备启动成功 │ │
│ │ @0x3F28 │ │ @0x28007000│ │ 进入下载模式 │ │
│ └────────────┘ └────────────┘ └────────┬────────┘ │
│ │ │
│ Step 2: 通过 spd_dump 发送 patched FDL2,刷入去除安全启动的 u-boot │
│ │ │
│ ┌─────────────────┐ ┌──────────────────────▼───────────┐ │
│ │ 发送 fdl2-dl │───►│ 用 fdl2 写入去除安全启动的 uboot │ │
│ │ (patched FDL2) │ │ + 擦除 splloader 分区 │ │
│ └─────────────────┘ └──────────────────────────────────┘ │
│ │
│ ★ 擦除 splloader 后,设备每次开机都会自动进入 BootROM 下载模式 │
└──────────────────────────────────────────────────────────────────────────┘
操作步骤:
spl-unlock.bin 启动设备fdl2-dl.bin(仅去除安全启动验证的 FDL2)splloader 被擦除后,设备每次上电都会进入 BootROM 下载模式。RP2350 USB Host 自动完成以下流程:
┌──────────────────────────────────────────────────────────────────────────┐
│ 阶段二:RP2350 自动固化启动 │
├──────────────────────────────────────────────────────────────────────────┤
│ │
│ 设备上电 → splloader 不存在 → 自动进入 BootROM 下载模式 │
│ │
│ ┌─────────┐ ┌────────────┐ ┌─────────────┐ ┌──────────────┐ │
│ │ BootROM │───►│ Exec Stub │───►│ spl-unlock │───►│ 去除安全启动 │ │
│ │ 握手 │ │ 绕过签名 │ │ 替代 FDL1 │ │ 的 u-boot │ │
│ └─────────┘ └────────────┘ └─────────────┘ │ 正常启动 ✓ │ │
│ └──────────────┘ │
│ │
│ ★ 全程自动,无需人工干预。拔掉设备后自动重置,等待下一台。 │
└──────────────────────────────────────────────────────────────────────────┘
为什么需要擦除 splloader?
┌─────────────┐ ┌──────────────────┐ ┌───────────────────┐ ┌──────────────┐
│ BootROM │ │ Exec Stub │ │ SPL Loader │ │ 任意 U-Boot │
│ 握手连接 │ ──► │ @0x3F28 (136B) │ ──► │ @0x28007000 │ ──► │ 启动成功 │
│ CHECK_BAUD │ │ 绕过签名验证 │ │ 替代 FDL1 发送 │ │ │
└─────────────┘ └──────────────────┘ └───────────────────┘ └──────────────┘
CHECK_BAUD + CONNECT,建立 BSL 通信0x3F28,利用 CVE-2022-38694 覆写返回地址,绕过签名验证0x28007000,签名验证已绕过本项目不包含通用的 patch 固件,你需要根据自己设备的固件自行 patch。
请参考 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 开发板 | 如 Raspberry Pi Pico 2 |
| USB Host 线 | OTG 或硬件改线,使 RP2350 作为 USB Host |
| 目标 SPD 设备 | splloader 已擦除,上电自动进入 BootROM 下载模式 |
| 引脚 | 功能 |
|---|---|
| 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 到 RP2350spd_flasher/
├── main.c # 主程序,USB Host 初始化与设备管理
├── spd_protocol.c # SPD BSL 协议(HDLC 帧、状态机)
├── spd_protocol.h # 协议定义
├── tusb_config.h # TinyUSB Host 配置
├── custom_exec_data.h # Exec Stub 数据 (136B @0x3F28)
├── fdl1_data.h # SPL Loader 数据 (spl-unlock.bin @0x28007000)
├── spl-unlock.bin # SPL Loader 原始二进制
├── CMakeLists.txt # CMake 构建配置
└── signing_key.pem / aes_key.bin / iv_salt.bin # RP2350 安全启动密钥
本项目仅供安全研究和学习用途。使用者应遵守当地法律法规,对使用本工具造成的任何后果自行承担全部责任。作者不对任何直接或间接损害承担责任。
本项目采用 GNU General Public License v3.0 许可证。
| 固件 | Patch 内容 | 产物 | 用途 |
|---|
| FDL2 (u-boot/lk) | NOP 安全分区写入检查 | fdl2-dl.bin | 阶段一:通过 spd_dump 发送,用于写入分区 |
| U-Boot | patch do_cboot() 去除安全启动验证 | 修改后的 uboot | 阶段一:写入设备,替代原始 uboot |
| SPL Loader | NOP 掉 signcheck() 及其结果校验 | spl-unlock.bin | 阶段一 & 二:CVE-2022-38694 发送 |
| 平台 | Exec 地址 | 参考 |
|---|
| UDX710 | 0x3F28 | 本项目默认 |
| UMS312 / UMS512 | 0x3EE8 | exec_addr_v2 |
| UMS9230 | 0x65017F08 | exec_addr_v2 |
| SC9820E / SC9832E | 0x4F18 / 0x4EE8 | CVE-2022-38694 |
| PC + spd_dump | RP2350 固化方案 |
|---|
| 体积 | 需要电脑 | 单个 MCU |
| 操作 | 手动运行命令 | 上电即运行 |
| 循环刷机 | 手动操作 | 自动重置 |
| 部署 | 不便 | 适合批量/产线 |
| 成本 | — | ~¥20 |