
CVE-2022-38694 Exploit reforzado - Autoflasher USB Host RP2350 para dispositivos Unisoc
Explotando la vulnerabilidad CVE-2022-38694 del BootROM de Unisoc mediante un Raspberry Pi RP2350 como USB Host para enviar automáticamente el SPL Loader al arrancar e iniciar un u-boot arbitrario.
Traslada la cadena del exploit — originalmente requería un PC + spd_dump — a un microcontrolador RP2350. Conecta el dispositivo, flashea automáticamente y admite flasheo continuo.
CVE-2022-38694 es un bypass de verificación de firma de un solo uso en el BootROM de Unisoc. Al enviar un exec stub a una dirección de memoria específica, se sobrescribe la dirección de retorno, se omiten las comprobaciones de firma y se permite que BootROM acepte y ejecute un FDL1 arbitrario.
Dato clave: FDL1 y SPL Loader comparten la misma dirección de carga (0x28007000), por lo que se puede enviar un SPL Loader parcheado en lugar de FDL1, arrancando un u-boot arbitrario.
La configuración inicial requiere 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 │
└──────────────────────────────────────────────────────────────────────────┘
Pasos:
spl-unlock.bin e iniciar el dispositivofdl2-dl.bin parcheado (FDL2 sin verificación de arranque seguro)Con el splloader borrado, el dispositivo entra en modo de descarga BootROM cada vez que se enciende. El RP2350 USB Host gestiona automáticamente la cadena del 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. │
└──────────────────────────────────────────────────────────────────────────┘
¿Por qué borrar splloader?
┌─────────────┐ ┌──────────────────┐ ┌───────────────────┐ ┌──────────────┐
│ BootROM │ │ Exec Stub │ │ SPL Loader │ │ U-Boot │
│ Handshake │ ──► │ @0x3F28 (136B) │ ──► │ @0x28007000 │ ──► │ Boot OK │
│ CHECK_BAUD │ │ Bypass sig chk │ │ Replaces FDL1 │ │ │
└─────────────┘ └──────────────────┘ └───────────────────┘ └──────────────┘
CHECK_BAUD + CONNECT, establece la comunicación BSL0x3F28, explota CVE-2022-38694 para sobrescribir la dirección de retorno y omitir la verificación de firma0x28007000, la firma ya está omitidaEste proyecto no incluye firmware parcheado universal. Debes parchear el firmware de tu dispositivo tú mismo.
Consulta la wiki de TomKing062:
xxd -i spl-unlock.bin > fdl1_data.h
Actualiza el nombre del array y las macros en fdl1_data.h para que coincidan con las referencias del código.
Este proyecto utiliza actualmente el exec stub UDX710 (custom_exec_3f28.bin).
Para adaptarlo a otros chips, reemplaza el exec stub y la dirección de carga en custom_exec_data.h:
Lista de soporte completa: SupportList
| Componente | Descripción |
|---|---|
| Placa RP2350 | p. ej., Raspberry Pi Pico 2 |
| Cable USB Host | OTG o modificación de hardware para el USB Host del RP2350 |
| Dispositivo SPD objetivo | con splloader borrado, entra automáticamente en modo DL de BootROM al encenderse |
| Pin | Función |
|---|---|
| USB D+/D- | Conectar al dispositivo SPD objetivo |
| GP4 (TX) | Salida de depuración UART |
| GP5 (RX) | Entrada de depuración UART |
El puerto USB se utiliza para la comunicación Host. Los logs de depuración se emiten por UART1 (GP4/GP5, 115200 bps).
cd spd_flasher
mkdir build && cd build
cmake .. -DTARGET_CHIP=rp2350
make -j$(nproc)
Salida: spd_flasher.uf2 (arrastrar y soltar vía BOOTSEL) / spd_flasher.bin (programador)
spd_flasher.uf2 en el 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 proyecto es únicamente para investigación de seguridad y fines educativos. Los usuarios deben cumplir todas las leyes y normativas aplicables. El autor no asume ninguna responsabilidad por los daños directos o indirectos derivados del uso de esta herramienta.
Este proyecto está licenciado bajo la GNU General Public License v3.0.
| Firmware | Parche | Salida | Propósito |
|---|
| FDL2 (u-boot/lk) | NOP en las comprobaciones de escritura de particiones seguras | fdl2-dl.bin | Etapa 1: se envía mediante spd_dump para escribir particiones |
| U-Boot | Parchear do_cboot() para eliminar el arranque seguro | uboot modificado | Etapa 1: se escribe en el dispositivo y reemplaza el uboot de serie |
| SPL Loader | NOP en signcheck() y en las comprobaciones de resultado | spl-unlock.bin | Etapas 1 y 2: se envía mediante CVE-2022-38694 |
| Plataforma | Dirección de ejecución | Referencia |
|---|
| UDX710 | 0x3F28 | Este proyecto (por defecto) |
| UMS312 / UMS512 | 0x3EE8 | exec_addr_v2 |
| UMS9230 | 0x65017F08 | exec_addr_v2 |
| SC9820E / SC9832E | 0x4F18 / 0x4EE8 | CVE-2022-38694 |
| PC + spd_dump | RP2350 Endurecido |
|---|
| Tamaño | Requiere PC | Un solo MCU |
| Operación | Comandos manuales | Encender = ejecutar |
| Continuidad | Manual por dispositivo | Reinicio automático |
| Despliegue | Incómodo | Listo para producción |
| Coste | — | ~$3 |