
CVE-2022-38694 Exploit irrobustito - Flasher automatico USB Host RP2350 per dispositivi Unisoc
Sfruttando la vulnerabilità CVE-2022-38694 del BootROM Unisoc tramite Raspberry Pi RP2350 USB Host per inviare automaticamente l'SPL Loader all'avvio e avviare un u-boot arbitrario.
Sposta la catena di exploit — originariamente richiedeva un PC + spd_dump — su un microcontrollore RP2350. Collega il dispositivo, flash automatico, supporta flash continuo.
CVE-2022-38694 è un bypass una tantum della verifica della firma nel BootROM Unisoc. Inviando un exec stub a uno specifico indirizzo di memoria, l'indirizzo di ritorno viene sovrascritto, aggirando i controlli di firma e consentendo al BootROM di accettare ed eseguire FDL1 arbitrario.
Concetto chiave: FDL1 e SPL Loader condividono lo stesso indirizzo di caricamento (0x28007000), quindi un SPL Loader patchato può essere inviato al posto di FDL1, avviando un u-boot arbitrario.
La configurazione iniziale richiede un PC con spd_dump:
┌──────────────────────────────────────────────────────────────────────────┐
│ 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 │
└──────────────────────────────────────────────────────────────────────────┘
Passaggi:
spl-unlock.bin e avviare il dispositivofdl2-dl.bin patchato (FDL2 con verifica del secure boot rimossa)Con splloader cancellato, il dispositivo entra in modalità download BootROM a ogni accensione. L'USB Host RP2350 gestisce automaticamente la catena di exploit:
┌──────────────────────────────────────────────────────────────────────────┐
│ 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. │
└──────────────────────────────────────────────────────────────────────────┘
Perché cancellare splloader?
┌─────────────┐ ┌──────────────────┐ ┌───────────────────┐ ┌──────────────┐
│ BootROM │ │ Exec Stub │ │ SPL Loader │ │ U-Boot │
│ Handshake │ ──► │ @0x3F28 (136B) │ ──► │ @0x28007000 │ ──► │ Boot OK │
│ CHECK_BAUD │ │ Bypass sig chk │ │ Replaces FDL1 │ │ │
└─────────────┘ └──────────────────┘ └───────────────────┘ └──────────────┘
CHECK_BAUD + CONNECT, stabilire la comunicazione BSL0x3F28, sfrutta CVE-2022-38694 per sovrascrivere l'indirizzo di ritorno, aggira la verifica della firma0x28007000, firma già aggirataQuesto progetto non include firmware patchato universale. Devi patchare tu stesso il firmware del tuo dispositivo.
Fai riferimento alla Wiki di TomKing062:
xxd -i spl-unlock.bin > fdl1_data.h
Aggiorna il nome dell'array e le macro in fdl1_data.h per corrispondere ai riferimenti nel codice.
Questo progetto attualmente usa l'exec stub UDX710 (custom_exec_3f28.bin).
Per adattarlo ad altri chip, sostituisci l'exec stub e l'indirizzo di caricamento in custom_exec_data.h:
Elenco completo del supporto: SupportList
| Componente | Descrizione |
|---|---|
| Scheda RP2350 | es. Raspberry Pi Pico 2 |
| Cavo USB Host | OTG o mod hardware per l'USB Host RP2350 |
| Dispositivo SPD Target | splloader cancellato, entra automaticamente in modalità DL BootROM all'accensione |
| Pin | Funzione |
|---|---|
| USB D+/D- | Collega al dispositivo SPD target |
| GP4 (TX) | Output di debug UART |
| GP5 (RX) | Input di debug UART |
La porta USB è usata per la comunicazione Host. Log di debug tramite UART1 (GP4/GP5, 115200 bps).
cd spd_flasher
mkdir build && cd build
cmake .. -DTARGET_CHIP=rp2350
make -j$(nproc)
Output: spd_flasher.uf2 (trascina e rilascia tramite BOOTSEL) / spd_flasher.bin (programmatore)
spd_flasher.uf2 su RP2350spd_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
Questo progetto è solo a scopo di ricerca sulla sicurezza e didattico. Gli utenti devono rispettare tutte le leggi e normative applicabili. L'autore non si assume alcuna responsabilità per danni diretti o indiretti derivanti dall'uso di questo strumento.
Questo progetto è concesso in licenza sotto la GNU General Public License v3.0.
| Firmware | Patch | Output | Scopo |
|---|
| FDL2 (u-boot/lk) | NOP sui controlli di scrittura delle partizioni secure | fdl2-dl.bin | Fase 1: inviato tramite spd_dump per la scrittura delle partizioni |
| U-Boot | Patch do_cboot() per rimuovere il secure boot | Uboot modificato | Fase 1: scritto sul dispositivo, sostituisce l'uboot originale |
| SPL Loader | NOP signcheck() e controlli dei risultati | spl-unlock.bin | Fase 1 e 2: inviato tramite CVE-2022-38694 |
| Piattaforma | Indirizzo Exec | Riferimento |
|---|
| UDX710 | 0x3F28 | Questo progetto (predefinito) |
| UMS312 / UMS512 | 0x3EE8 | exec_addr_v2 |
| UMS9230 | 0x65017F08 | exec_addr_v2 |
| SC9820E / SC9832E | 0x4F18 / 0x4EE8 | CVE-2022-38694 |
| PC + spd_dump | RP2350 Hardened |
|---|
| Dimensioni | Richiede un PC | Singolo MCU |
| Operazione | Comandi manuali | Accensione = esecuzione |
| Continuità | Manuale per dispositivo | Auto-reset |
| Distribuzione | Scomodo | Pronto per la produzione |
| Costo | — | ~$3 |