
CVE-2022-38694 강화된 익스플로잇 - Unisoc 기기용 RP2350 USB 호스트 자동 플래셔
CVE-2022-38694 Unisoc BootROM 취약점을 Raspberry Pi RP2350 USB 호스트를 통해 악용하여 부팅 시 SPL 로더를 자동으로 전송하고 임의의 u-boot를 시작합니다.
원래 PC + spd_dump가 필요했던 익스플로잇 체인을 RP2350 마이크로컨트롤러로 옮깁니다. 장치를 연결하면 자동으로 플래싱되며, 연속 플래싱을 지원합니다.
CVE-2022-38694는 Unisoc BootROM의 일회성 서명 검증 우회입니다. 특정 메모리 주소로 exec 스텁을 전송하면 반환 주소가 덮어써져 서명 검사를 우회하고 BootROM이 임의의 FDL1을 수락하고 실행할 수 있게 됩니다.
핵심 포인트: FDL1과 SPL 로더는 동일한 로드 주소(0x28007000)를 공유하므로, 패치된 SPL 로더를 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 호스트가 익스플로잇 체인을 자동으로 처리합니다:
┌──────────────────────────────────────────────────────────────────────────┐
│ 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에 136바이트를 로드하고 CVE-2022-38694를 악용하여 반환 주소를 덮어쓴 뒤 서명 검증을 우회합니다0x28007000을 공유하며, 서명은 이미 우회되었습니다이 프로젝트는 범용 패치 펌웨어를 포함하지 않습니다. 장치의 펌웨어를 직접 패치해야 합니다.
TomKing062의 Wiki를 참조하세요:
xxd -i spl-unlock.bin > fdl1_data.h
fdl1_data.h의 배열 이름과 매크로가 코드 참조와 일치하도록 업데이트하세요.
이 프로젝트는 현재 UDX710 exec 스텁(custom_exec_3f28.bin)을 사용합니다.
다른 칩에 적용하려면 custom_exec_data.h에서 exec 스텁과 로드 주소를 교체하세요:
전체 지원 목록: SupportList
| 구성 요소 | 설명 |
|---|---|
| RP2350 보드 | 예: Raspberry Pi Pico 2 |
| USB 호스트 케이블 | RP2350 USB 호스트용 OTG 또는 하드웨어 개조 |
| 대상 SPD 장치 | splloader가 삭제되어 전원을 켜면 자동으로 BootROM DL 모드 진입 |
| 핀 | 기능 |
|---|---|
| USB D+/D- | 대상 SPD 장치에 연결 |
| GP4 (TX) | UART 디버그 출력 |
| GP5 (RX) | UART 디버그 입력 |
USB 포트는 호스트 통신에 사용됩니다. 디버그 로그는 **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 로더 | 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 |