
CVE-2022-38694 Exploit endurecido - Autoflasher USB Host para dispositivos Unisoc
Explorando a vulnerabilidade CVE-2022-38694 do BootROM Unisoc via Raspberry Pi RP2350 USB Host para enviar automaticamente o SPL Loader na inicialização e iniciar um u-boot arbitrário.
Move a cadeia de exploração — originalmente exigindo um PC + spd_dump — para um microcontrolador RP2350. Conecte o dispositivo, grave automaticamente, suporta gravação contínua.
CVE-2022-38694 é uma bypass de verificação de assinatura única no BootROM Unisoc. Ao enviar um exec stub para um endereço de memória específico, o endereço de retorno é sobrescrito, contornando as verificações de assinatura e permitindo que o BootROM aceite e execute FDL1 arbitrário.
Insight fundamental: FDL1 e SPL Loader compartilham o mesmo endereço de carga (0x28007000), portanto um SPL Loader corrigido pode ser enviado no lugar do FDL1, inicializando um u-boot arbitrário.
A configuração inicial requer um PC com 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 │
└──────────────────────────────────────────────────────────────────────────┘
Passos:
spl-unlock.bin e inicializar o dispositivofdl2-dl.bin corrigido (FDL2 com verificação de boot seguro removida)Com o splloader apagado, o dispositivo entra no modo de download BootROM em toda inicialização. O USB Host RP2350 lida automaticamente com a cadeia de exploração:
┌──────────────────────────────────────────────────────────────────────────┐
│ 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. │
└──────────────────────────────────────────────────────────────────────────┘
Por que apagar o splloader?
┌─────────────┐ ┌──────────────────┐ ┌───────────────────┐ ┌──────────────┐
│ BootROM │ │ Exec Stub │ │ SPL Loader │ │ U-Boot │
│ Handshake │ ──► │ @0x3F28 (136B) │ ──► │ @0x28007000 │ ──► │ Boot OK │
│ CHECK_BAUD │ │ Bypass sig chk │ │ Replaces FDL1 │ │ │
└─────────────┘ └──────────────────┘ └───────────────────┘ └──────────────┘
CHECK_BAUD + CONNECT, estabelecer comunicação BSL0x3F28, explorar CVE-2022-38694 para sobrescrever o endereço de retorno, contornar a verificação de assinatura0x28007000, assinatura já contornadaEste projeto não inclui firmware corrigido universal. Você deve patchear o firmware do seu dispositivo por conta própria.
Consulte a Wiki do TomKing062:
| Firmware | Patch | Saída | Objetivo |
|---|---|---|---|
| FDL2 (u-boot/lk) | NOP em verificações de escrita de partição segura | fdl2-dl.bin | Etapa 1: enviado via spd_dump para gravação de partições |
| U-Boot | Patch do_cboot() para remover o boot seguro | uboot modificado | Etapa 1: gravado no dispositivo, substitui o uboot de fábrica |
| SPL Loader | NOP em signcheck() e verificações de resultado | spl-unlock.bin | Etapas 1 e 2: enviado via CVE-2022-38694 |
xxd -i spl-unlock.bin > fdl1_data.h
Atualize o nome do array e as macros em fdl1_data.h para corresponder às referências do código.
Este projeto atualmente usa o exec stub UDX710 (custom_exec_3f28.bin).
Para adaptar a outros chips, substitua o exec stub e o endereço de carga em custom_exec_data.h: