
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:
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:
Lista completa de suporte: SupportList
| Componente | Descrição |
|---|---|
| Placa RP2350 | ex.: Raspberry Pi Pico 2 |
| Cabo USB Host | OTG ou modificação de hardware para USB Host RP2350 |
| Dispositivo SPD Alvo | splloader apagado, entra automaticamente no modo BootROM DL ao ligar |
| Pino | Função |
|---|---|
| USB D+/D- | Conecte ao dispositivo SPD alvo |
| GP4 (TX) | Saída de debug UART |
| GP5 (RX) | Entrada de debug UART |
A porta USB é usada para comunicação Host. Logs de debug via UART1 (GP4/GP5, 115200bps).
cd spd_flasher
mkdir build && cd build
cmake .. -DTARGET_CHIP=rp2350
make -j$(nproc)
Saída: spd_flasher.uf2 (arrastar e soltar via BOOTSEL) / spd_flasher.bin (programador)
spd_flasher.uf2 no 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
Este projeto é apenas para fins de pesquisa em segurança e educação. Os usuários devem cumprir todas as leis e regulamentos aplicáveis. O autor não assume nenhuma responsabilidade por quaisquer danos diretos ou indiretos resultantes do uso desta ferramenta.
Este projeto está licenciado sob a GNU General Public License v3.0.
| 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 |
| Plataforma | Endereço de Execução | Referência |
|---|
| UDX710 | 0x3F28 | Este projeto (padrão) |
| UMS312 / UMS512 | 0x3EE8 | exec_addr_v2 |
| UMS9230 | 0x65017F08 | exec_addr_v2 |
| SC9820E / SC9832E | 0x4F18 / 0x4EE8 | CVE-2022-38694 |
| PC + spd_dump | RP2350 Reforçado |
|---|
| Tamanho | Requer PC | Um único MCU |
| Operação | Comandos manuais | Ligar = funcionando |
| Contínuo | Manual por dispositivo | Reset automático |
| Implantação | Inconveniente | Pronto para produção |
| Custo | — | ~$3 |