
CVE-2022-38694 Exploit durci - Flasheur automatique USB Host RP2350 pour appareils Unisoc
Exploitation de la vulnérabilité BootROM Unisoc CVE-2022-38694 via l'hôte USB Raspberry Pi RP2350 pour envoyer automatiquement le SPL Loader au démarrage et lancer un u-boot arbitraire.
Déplace la chaîne d'exploitation — qui nécessitait à l'origine un PC + spd_dump — sur un microcontrôleur RP2350. Branchez l'appareil, flashez automatiquement, prend en charge le flashage en continu.
CVE-2022-38694 est un contournement ponctuel de la vérification de signature dans le BootROM Unisoc. En envoyant un exec stub à une adresse mémoire spécifique, l'adresse de retour est écrasée, contournant les contrôles de signature et permettant au BootROM d'accepter et d'exécuter un FDL1 arbitraire.
Point clé : FDL1 et SPL Loader partagent la même adresse de chargement (0x28007000), de sorte qu'un SPL Loader patché peut être envoyé à la place de FDL1, démarrant ainsi un u-boot arbitraire.
La configuration initiale nécessite un PC avec 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 │
└──────────────────────────────────────────────────────────────────────────┘
Étapes :
spl-unlock.bin et démarrer l'appareilfdl2-dl.bin patché (FDL2 dont la vérification du démarrage sécurisé est supprimée)Une fois la splloader effacée, l'appareil entre en mode de téléchargement BootROM à chaque mise sous tension. L'hôte USB RP2350 gère automatiquement la chaîne d'exploitation :
┌──────────────────────────────────────────────────────────────────────────┐
│ 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. │
└──────────────────────────────────────────────────────────────────────────┘
Pourquoi effacer splloader ?
┌─────────────┐ ┌──────────────────┐ ┌───────────────────┐ ┌──────────────┐
│ BootROM │ │ Exec Stub │ │ SPL Loader │ │ U-Boot │
│ Handshake │ ──► │ @0x3F28 (136B) │ ──► │ @0x28007000 │ ──► │ Boot OK │
│ CHECK_BAUD │ │ Bypass sig chk │ │ Replaces FDL1 │ │ │
└─────────────┘ └──────────────────┘ └───────────────────┘ └──────────────┘
CHECK_BAUD + CONNECT, établir la communication BSL0x3F28, exploiter CVE-2022-38694 pour écraser l'adresse de retour, contourner la vérification de signature0x28007000, signature déjà contournéeCe projet n'inclut pas de micrologiciel patché universel. Vous devez patcher vous-même le micrologiciel de votre appareil.
Référez-vous au wiki de TomKing062 :
xxd -i spl-unlock.bin > fdl1_data.h
Mettez à jour le nom du tableau et les macros dans fdl1_data.h pour correspondre aux références du code.
Ce projet utilise actuellement l'exec stub UDX710 (custom_exec_3f28.bin).
Pour adapter à d'autres puces, remplacez l'exec stub et l'adresse de chargement dans custom_exec_data.h :
Liste complète des supports : SupportList
| Composant | Description |
|---|---|
| Carte RP2350 | p. ex. Raspberry Pi Pico 2 |
| Câble USB Host | OTG ou modification matérielle pour l'hôte USB RP2350 |
| Appareil SPD cible | splloader effacée, entre automatiquement en mode BootROM DL à la mise sous tension |
| Broche | Fonction |
|---|---|
| USB D+/D- | Connecter à l'appareil SPD cible |
| GP4 (TX) | Sortie de débogage UART |
| GP5 (RX) | Entrée de débogage UART |
Le port USB est utilisé pour la communication hôte. Les journaux de débogage sont émis via UART1 (GP4/GP5, 115200 bps).
cd spd_flasher
mkdir build && cd build
cmake .. -DTARGET_CHIP=rp2350
make -j$(nproc)
Sortie : spd_flasher.uf2 (glisser-déposer via BOOTSEL) / spd_flasher.bin (programmateur)
spd_flasher.uf2 sur le 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
Ce projet est destiné uniquement à la recherche en sécurité et à des fins éducatives. Les utilisateurs doivent se conformer à toutes les lois et réglementations applicables. L'auteur décline toute responsabilité en cas de dommages directs ou indirects résultant de l'utilisation de cet outil.
Ce projet est sous licence GNU General Public License v3.0.
| Micrologiciel | Patch | Sortie | Objectif |
|---|
| FDL2 (u-boot/lk) | NOP les contrôles d'écriture de partition sécurisée | fdl2-dl.bin | Étape 1 : envoyé via spd_dump pour les écritures de partitions |
| U-Boot | Patcher do_cboot() pour supprimer le démarrage sécurisé | u-boot modifié | Étape 1 : écrit sur l'appareil, remplace l'uboot d'origine |
| SPL Loader | NOP signcheck() et contrôles de résultat | spl-unlock.bin | Étapes 1 et 2 : envoyé via CVE-2022-38694 |
| Plateforme | Adresse d'exécution | Référence |
|---|
| UDX710 | 0x3F28 | Ce projet (par défaut) |
| UMS312 / UMS512 | 0x3EE8 | exec_addr_v2 |
| UMS9230 | 0x65017F08 | exec_addr_v2 |
| SC9820E / SC9832E | 0x4F18 / 0x4EE8 | CVE-2022-38694 |
| PC + spd_dump | RP2350 durci |
|---|
| Taille | Nécessite un PC | Un seul microcontrôleur |
| Opération | Commandes manuelles | Allumage = exécution |
| Continu | Manuel par appareil | Réinitialisation auto |
| Déploiement | Peu pratique | Prêt pour la production |
| Coût | — | ~$3 |