
CVE-2022-38694 Gehärteter Exploit - RP2350 USB-Host-Auto-Flasher für Unisoc-Geräte
Nutzt die CVE-2022-38694-BootROM-Schwachstelle von Unisoc über einen Raspberry Pi RP2350-USB-Host aus, um beim Booten automatisch den SPL-Loader zu senden und einen beliebigen u-boot zu starten.
Verlegt die Exploit-Kette – ursprünglich benötigte sie einen PC + spd_dump – auf einen RP2350-Mikrocontroller. Gerät anschließen, automatisch flashen, unterstützt kontinuierliches Flashen.
CVE-2022-38694 ist eine einmalige Umgehung der Signaturprüfung im Unisoc-BootROM. Indem ein Exec-Stub an eine bestimmte Speicheradresse gesendet wird, wird die Rücksprungadresse überschrieben, die Signaturprüfungen werden umgangen und das BootROM kann beliebiges FDL1 akzeptieren und ausführen.
Wichtige Erkenntnis: FDL1 und SPL-Loader teilen sich dieselbe Ladeadresse (0x28007000), daher kann ein gepatchter SPL-Loader anstelle von FDL1 gesendet werden, wodurch ein beliebiger u-boot bootet.
Für die Ersteinrichtung wird ein PC mit spd_dump benötigt:
┌──────────────────────────────────────────────────────────────────────────┐
│ 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 │
└──────────────────────────────────────────────────────────────────────────┘
Schritte:
spl-unlock.bin zu senden und das Gerät zu bootenfdl2-dl.bin senden (FDL2 ohne Secure-Boot-Prüfung)Wenn der Splloader gelöscht ist, wechselt das Gerät bei jedem Einschalten in den BootROM-Download-Modus. Der RP2350-USB-Host übernimmt die Exploit-Kette automatisch:
┌──────────────────────────────────────────────────────────────────────────┐
│ 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. │
└──────────────────────────────────────────────────────────────────────────┘
Warum den Splloader löschen?
┌─────────────┐ ┌──────────────────┐ ┌───────────────────┐ ┌──────────────┐
│ BootROM │ │ Exec Stub │ │ SPL Loader │ │ U-Boot │
│ Handshake │ ──► │ @0x3F28 (136B) │ ──► │ @0x28007000 │ ──► │ Boot OK │
│ CHECK_BAUD │ │ Bypass sig chk │ │ Replaces FDL1 │ │ │
└─────────────┘ └──────────────────┘ └───────────────────┘ └──────────────┘
CHECK_BAUD + CONNECT, BSL-Kommunikation aufbauen0x3F28 laden, CVE-2022-38694 ausnutzen, um die Rücksprungadresse zu überschreiben und die Signaturprüfung zu umgehen0x28007000, Signatur ist bereits umgangenDieses Projekt enthält keine universelle gepatchte Firmware. Sie müssen die Firmware Ihres Geräts selbst patchen.
Siehe TomKing062s Wiki:
xxd -i spl-unlock.bin > fdl1_data.h
Aktualisieren Sie den Array-Namen und die Makros in fdl1_data.h, sodass sie mit den Codereferenzen übereinstimmen.
Dieses Projekt verwendet derzeit den UDX710-Exec-Stub (custom_exec_3f28.bin).
Um es an andere Chips anzupassen, ersetzen Sie den Exec-Stub und die Ladeadresse in custom_exec_data.h:
Vollständige Unterstützungsliste: SupportList
| Komponente | Beschreibung |
|---|---|
| RP2350-Board | z. B. Raspberry Pi Pico 2 |
| USB-Host-Kabel | OTG oder Hardware-Mod für den RP2350-USB-Host |
| Ziel-SPD-Gerät | Splloader gelöscht, wechselt beim Einschalten automatisch in den BootROM-DL-Modus |
| Pin | Funktion |
|---|---|
| USB D+/D- | Mit dem Ziel-SPD-Gerät verbinden |
| GP4 (TX) | UART-Debug-Ausgabe |
| GP5 (RX) | UART-Debug-Eingabe |
Der USB-Port wird für die Host-Kommunikation verwendet. Debug-Logs über UART1 (GP4/GP5, 115200bps).
cd spd_flasher
mkdir build && cd build
cmake .. -DTARGET_CHIP=rp2350
make -j$(nproc)
Ausgabe: spd_flasher.uf2 (per Drag-and-Drop über BOOTSEL) / spd_flasher.bin (Programmer)
spd_flasher.uf2 auf den 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
Dieses Projekt dient ausschließlich der Sicherheitsforschung und zu Bildungszwecken. Die Nutzer müssen alle geltenden Gesetze und Vorschriften einhalten. Der Autor übernimmt keine Haftung für direkte oder indirekte Schäden, die durch die Verwendung dieses Tools entstehen.
Dieses Projekt ist unter der GNU General Public License v3.0 lizenziert.
| Firmware | Patch | Ausgabe | Zweck |
|---|
| FDL2 (u-boot/lk) | Secure-Partitions-Schreibprüfungen per NOP überschreiben | fdl2-dl.bin | Stufe 1: wird per spd_dump für Partitionsschreibvorgänge gesendet |
| U-Boot | do_cboot() patchen, um Secure Boot zu entfernen | Modifizierter uboot | Stufe 1: wird auf das Gerät geschrieben, ersetzt Standard-uboot |
| SPL Loader | signcheck() und Ergebnisprüfungen per NOP überschreiben | spl-unlock.bin | Stufe 1 & 2: wird per CVE-2022-38694 gesendet |
| Plattform | Exec-Adresse | Referenz |
|---|
| UDX710 | 0x3F28 | Dieses Projekt (Standard) |
| UMS312 / UMS512 | 0x3EE8 | exec_addr_v2 |
| UMS9230 | 0x65017F08 | exec_addr_v2 |
| SC9820E / SC9832E | 0x4F18 / 0x4EE8 | CVE-2022-38694 |
| PC + spd_dump | RP2350 (gehärtet) |
|---|
| Größe | Benötigt PC | Einzelner MCU |
| Bedienung | Manuelle Befehle | Einschalten = läuft |
| Kontinuierlich | Manuell pro Gerät | Auto-Reset |
| Einsatz | Umständlich | Produktionsreif |
| Kosten | — | ~$3 |