
CVE-2022-38694 Усиленный эксплойт — автофлешер USB-хоста на базе RP2350 для устройств Unisoc
Использование уязвимости CVE-2022-38694 в BootROM Unisoc через Raspberry Pi RP2350 USB Host для автоматической отправки SPL Loader при загрузке и запуска произвольного u-boot.
Переносит цепочку эксплойта — изначально требовавшую ПК + spd_dump — на микроконтроллер RP2350. Подключи устройство — прошивка выполняется автоматически, поддерживается непрерывная прошивка.
CVE-2022-38694 — это одноразовый обход проверки подписи в BootROM Unisoc. Отправка exec-заглушки на определённый адрес памяти перезаписывает обратный адрес, обходя проверки подписи и позволяя BootROM принять и выполнить произвольный FDL1.
Ключевая идея: FDL1 и SPL Loader используют один и тот же адрес загрузки (0x28007000), поэтому вместо FDL1 можно отправить пропатченный SPL Loader, загрузив произвольный u-boot.
Для первоначальной настройки требуется ПК с 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 │
└──────────────────────────────────────────────────────────────────────────┘
Шаги:
spl-unlock.bin и загрузки устройстваfdl2-dl.bin (FDL2 с отключённой проверкой защищённой загрузки)После стирания splloader устройство при каждом включении входит в режим загрузки BootROM. USB Host RP2350 автоматически выполняет цепочку эксплойта:
┌──────────────────────────────────────────────────────────────────────────┐
│ 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, использование CVE-2022-38694 для перезаписи обратного адреса и обхода проверки подписи0x28007000, подпись уже обойденаЭтот проект не содержит универсальной пропатченной прошивки. Вы должны самостоятельно пропатчить прошивку своего устройства.
Обратитесь к вики TomKing062:
xxd -i spl-unlock.bin > fdl1_data.h
Обновите имя массива и макросы в fdl1_data.h, чтобы они соответствовали ссылкам в коде.
В этом проекте в настоящее время используется exec-заглушка UDX710 (custom_exec_3f28.bin).
Для адаптации к другим чипам замените exec-заглушку и адрес загрузки в custom_exec_data.h:
Полный список поддержки: SupportList
| Компонент | Описание |
|---|---|
| Плата RP2350 | например, Raspberry Pi Pico 2 |
| Кабель USB Host | OTG или аппаратная модификация для USB Host RP2350 |
| Целевое SPD-устройство | splloader стёрт, автоматически входит в режим BootROM DL при включении |
| Вывод | Назначение |
|---|---|
| USB D+/D- | Подключение к целевому SPD-устройству |
| GP4 (TX) | Вывод отладки UART |
| GP5 (RX) | Вход отладки UART |
Порт USB используется для связи с хостом. Логи отладки — через UART1 (GP4/GP5, 115200 бит/с).
cd spd_flasher
mkdir build && cd build
cmake .. -DTARGET_CHIP=rp2350
make -j$(nproc)
Результат: spd_flasher.uf2 (перетаскивание через BOOTSEL) / spd_flasher.bin (для программатора)
spd_flasher.uf2 в 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
Этот проект предназначен только для исследований в области безопасности и образовательных целей. Пользователи должны соблюдать все применимые законы и нормативные акты. Автор не несёт ответственности за любые прямые или косвенные убытки, возникшие в результате использования этого инструмента.
Этот проект лицензирован в соответствии с 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 Loader | NOP signcheck() и проверок результата | spl-unlock.bin | Этапы 1 и 2: отправляется через CVE-2022-38694 |
| Платформа | Адрес exec | Ссылка |
|---|
| UDX710 | 0x3F28 | Этот проект (по умолчанию) |
| UMS312 / UMS512 | 0x3EE8 | exec_addr_v2 |
| UMS9230 | 0x65017F08 | exec_addr_v2 |
| SC9820E / SC9832E | 0x4F18 / 0x4EE8 | CVE-2022-38694 |
| PC + spd_dump | RP2350 (укреплённый) |
|---|
| Размер | Требуется ПК | Один МК |
| Управление | Ручные команды | Включение = работа |
| Непрерывность | Вручную для каждого устройства | Автосброс |
| Развёртывание | Неудобно | Готов к производству |
| Стоимость | — | ~$3 |