
Kit d'exploitation pour le bootROM Exynos 9830 qui fournit un contournement du démarrage signé, une injection de clés personnalisées et des charges utiles de dump mémoire pour les appareils Samsung SM-G985F.
[!CAUTION] Le lot de clés actuel et les fichiers générés peuvent être fusionnés. Une fois qu'un appareil a été fusionné, la modification de l'eFuse est irréversible et l'appareil doit continuer à utiliser des images de démarrage et un matériel de clés correspondant à la clé fusionnée. L'utilisation de ces fichiers ou procédures se fait à vos propres risques en raison du comportement de fusion ; toutes les conséquences restent de la responsabilité de l'utilisateur qui les exécute. Vérifiez le fichier eFuse, les clés privées, les images FWBL1 signées, LK /
sboot.bin, et l'appareil cible avant d'exécuter toute procédure de fusion.
sudo apt-get update
sudo apt-get install -y gcc-aarch64-linux-gnu binutils-aarch64-linux-gnu
brew tap messense/macos-cross-toolchains
brew install aarch64-unknown-linux-gnu
python3 -m pip install -r requirements.txt
requirements.txt inclut coloredlogs, cryptography, hexdump, libusb, pyusb et pycryptodome.
Sous Windows, le périphérique USB BootROM 04e8:1234 doit utiliser un pilote compatible WinUSB/libusb
avant que PyUSB puisse l'ouvrir. Voir exploit/windows/README.md.
Le dépôt inclut un package de pilote WinUSB dans
exploit/windows/Exynos_USB_Device.inf, avec son catalogue correspondant et le fichier
d'import de certificat dans le même répertoire.
sboot.binpython3 exploit/split.py bootLoaderFiles/originalSboot_K/sboot.bin -o exploit/extra/images
Le script de découpage écrit les parties d'image et un fichier split_manifest.json dans le répertoire de sortie.
L'image LK doit utiliser les identifiants de commande de la clé 2 de démarrage sécurisé ROM pour la procédure de clé personnalisée :
Lors de l'application du TSV de correctif LK dans le projet Ghidra, l'assistant a été appelé via Ghidra headless comme ceci :
GHIDRA=/path/to/ghidra_12.0.4_PUBLIC
REPO=$(pwd)
"$GHIDRA/support/analyzeHeadless" "$REPO/exynos990reverseEng" exynos990 \
-process lk.bin \
-noanalysis \
-scriptPath "$REPO/external/ghidra" \
-postScript ApplyLkPatches.java "$REPO/external/ghidra/lk_985_selected_patches.tsv"
Intégrez la clé eFuse de 32 octets dans lk.bin à l'offset 0x205008, en remplaçant la clé d'origine :
dd if=external/keys/exynos9830_crecker/crecker.efuse of=exploit/extra/images/lk.bin bs=1 seek=$((0x205008)) count=32 conv=notrunc
xxd -g1 -s $((0x205008)) -l 32 exploit/extra/images/lk.bin
python3 exploit/merge.py exploit/extra/images Exynos9830
Le script de fusion écrit sboot.bin dans le répertoire de travail actuel.
Construisez les projets de payload dans external/payloads/ et copiez les binaires obtenus dans exploit/extra/payloads/ :
./exploit/build_payloads.sh
Le chargeur UFS et le payload à clé personnalisée intègrent un fichier efuse de 32 octets lors de la construction.
Par défaut, le Makefile lit external/keys/exynos9830_crecker/crecker.efuse ;
remplacez-le avec CUSTOM_KEY_EFUSE=/path/to/crecker.efuse si nécessaire.
L'étape de vérification préalable exécutée par exploit/exploit.py re-signe sur place le jeu d'images SBoot dans
exploit/extra/images/ avant chaque exécution signée. Aucune sortie signée
séparée n'est conservée. L'étape de signature utilise le lot de clés partagé délibérément suivi
sous external/keys/exynos9830_crecker/.
Commande équivalente à exécuter à la racine du dépôt pour le jeu d'images complet :
python3 external/tools/sign_sboot_images.py \
--images-dir exploit/extra/images \
--keys-dir external/keys/exynos9830_crecker
Cette commande signe :
Le signataire par lot transmet la valeur décimale 23 pour chaque image et ne réutilise pas une
ancienne valeur de rollback déjà présente dans un pied de page existant.
epbl.img est d'abord ré-chiffré si nécessaire, puis signé sur les octets finaux.
ldfw.img et tzsw.img nécessitent toujours la procédure AVB externe si leur contenu AVB
doit être actualisé.
La commande limitée à FWBL1 est :
python3 external/tools/sign_tool.py \
-i exploit/extra/images/fwbl1.img \
-o exploit/extra/images/fwbl1.img \
-k external/keys/exynos9830_crecker/crecker_private.pem \
-H external/keys/exynos9830_crecker/crecker.hmac \
-s 0x3000 \
-r 23 \
-ma 0x9830 \
-m 0x142 \
-e 11 \
-t external/keys/exynos9830_crecker/crecker_stage2_tee_pubkey.bin \
-re external/keys/exynos9830_crecker/crecker_stage2_ree_pubkey.bin
Forme abrégée lorsque sign_tool.py, fwbl1.img et les fichiers crecker_* se trouvent dans le répertoire courant :
python3 sign_tool.py -i fwbl1.img -o fwbl1.img -k crecker_private.pem -H crecker.hmac -s 0x3000 -r 23 -ma 0x9830 -m 0x142 -e 11 -t crecker_stage2_tee_pubkey.bin -re crecker_stage2_ree_pubkey.bin
Exécutez les commandes depuis la racine du dépôt sauf indication contraire.
La procédure de démarrage Exynos 9830 observée est la suivante :
Remarque : le payload de dump mem.bin ne peut être utilisé que lorsqu'aucun sboot fonctionnel n'est installé.
Envoyez uh.bin via Heimdall au bootloader :
heimdall flash --BOOTLOADER uh.bin
Exécutez la procédure de dump :
python3 exploit/exploit.py --dump
Examinez le dump exynos990.bootrom.bin généré.
Certaines parties de l'outillage de récupération Python de ce dépôt ont été adaptées de halal-beef/hubble.
Ce projet amont est publié sous la GNU GPL v2.0, et ce dépôt conserve une licence GPL-2.0 par compatibilité. Voir LICENSE et NOTICE.md.
Le payload à clé personnalisée Exynos990 sous external/payloads/exynos990_boot_custom_key/ est basé sur le
squelette de payload boot-custom-key et l'idée de flux de contrôle de
VDavid003/exynos-usbdl, un fork de
frederic/exynos-usbdl. Il a été considérablement réécrit et
adapté pour la chaîne GET_CONFIGURATION Exynos9830 / Exynos990, et n'est pas une copie textuelle du payload
amont. Comme le projet amont référencé est sous licence GNU GPL v3.0, ce payload est conservé
sous GPL-3.0-only ; voir external/payloads/exynos990_boot_custom_key/LICENSE.
| Chemin | Description |
|---|
bootLoaderFiles/ | Binaires du bootloader, parties de bootloader découpées, images d'origine, images déchiffrées et artefacts de dump. |
bootromNotes/ | Notes sur la ROM de démarrage, organigrammes et offsets de contexte USB. |
exploit/ | Outillage Python, exécuteur d'exploit, scripts de découpage/fusion, assistant de construction de payload et données SoC. |
exploit/extra/images/ | Images de bootloader fonctionnelles utilisées par les procédures d'exploit. |
exploit/extra/payloads/ | Binaires de payload construits, copiés depuis external/payloads/. |
external/ | Sources de payload, Makefile de construction, notes décompilées, matériel de clés partagé et outils auxiliaires. |
external/keys/exynos9830_crecker/ | Lot de clés personnalisées Exynos9830 / Exynos990 partagé utilisé par la procédure de chargeur signé. |
exynos990reverseEng/ | Fichiers du projet de rétro-ingénierie Exynos 990. |
| Commande clé 1 | Valeur | Commande clé 2 | Valeur |
|---|
CMD_W_ROM_SEC_BOOT_KEY1 | 0x001 | CMD_W_ROM_SEC_BOOT_KEY2 | 0x016 |
CMD_W_USE_ROM_SEC_BOOT_KEY1 | 0x002 | CMD_W_USE_ROM_SEC_BOOT_KEY2 | 0x017 |
CMD_C_ROM_SEC_BOOT_KEY1 | 0x100 | CMD_C_ROM_SEC_BOOT_KEY2 | 0x114 |
CMD_R_USE_ROM_SEC_BOOT_KEY1 | 0x101 | CMD_R_USE_ROM_SEC_BOOT_KEY2 | 0x115 |
| Payload | Chemin de sortie | Objectif |
|---|
mem.bin | exploit/extra/payloads/mem.bin | Payload de dump mémoire de la ROM de démarrage. |
loader.bin | exploit/extra/payloads/loader.bin | Payload de la voie UFS utilisé par --ufs. |
Exynos990_boot_custom_key.bin | exploit/extra/payloads/Exynos990_boot_custom_key.bin | Payload de chargeur signé à clé personnalisée utilisé par --signed. |
| Image | Matériel de clés utilisé | Révision de rollback |
|---|
fwbl1.img | Clé privée BL1 + clés publiques Stage2 TEE/REE | 23 |
epbl.img | Clé privée Stage2 TEE | 23 |
bl2.img | Clé privée Stage2 REE | 23 |
lk.bin | Clé privée Stage2 REE | 23 |
el3_mon.img | Clé privée Stage2 TEE | 23 |
ldfw.img | Clé privée Stage2 TEE, interne + externe | 23 |
tzsw.img | Clé privée Stage2 TEE, interne + externe | 23 |
| Commande | Mode | Payload par défaut | Notes |
|---|
python3 exploit/exploit.py --ufs | Voie UFS | loader.bin | Démarre la procédure de payload UFS. |
python3 exploit/exploit.py --signed | Chaîne de démarrage signée | Exynos990_boot_custom_key.bin | Re-signe le jeu d'images SBoot, envoie les images. |
python3 exploit/exploit.py --dump | Dump de la ROM de démarrage | mem.bin | Reçoit 0x20000 octets dans exynos990.bootrom.bin. |
| N° | Note |
|---|
| 1 | Entrez en mode download. |
| 2 | Créez ou mettez à jour sboot.bin avec exploit/merge.py si nécessaire. |
| 3 | Utilisez la procédure signée à clé personnalisée pour atteindre le mode Crecker, un mode de type ODIN qui accepte la procédure d'image cible. |
| 4 | Envoyez le nouveau sboot.bin via ODIN, Heimdall, ou un autre outil d'envoi compatible. |
| 5 | Exécutez le payload UFS. |
| 6 | Facultatif : installez CreckerRom pour les procédures One UI 7 et Strong Integrity. |
| 7 | Facultatif : verrouillez le bootloader une fois la configuration cible terminée. |
| N° | Étape | Notes |
|---|
| 1 | BootROM | Exécution ROM initiale. |
| 2 | BL1 | Transfert complet depuis le BootROM. |
| 3 | EPBL | Transfert complet depuis BL1. |
| 4 | EPBL | Met en place un gestionnaire SMC minimal. |
| 5 | BL2 | EPBL charge BL2. |
| 6 | BL2 | Transfert partiel vers BL2. |
| 7 | LK | BL2 utilise EPBL pour charger LK, mais LK ne s'exécute pas immédiatement. |
| 8 | EL3 Monitor | BL2 utilise EPBL pour charger l'EL3 Monitor. |
| 9 | EL3 Monitor | EPBL déchiffre l'EL3 Monitor. |
| 10 | EL3 Monitor | Transfert complet vers l'EL3 Monitor. |
| 11 | EL3 Monitor | Initialise et configure le gestionnaire SMC étendu. |
| 12 | LK | L'exécution saute vers LK. |
| 13 | LK / EL3 Monitor | LK appelle le gestionnaire SMC de l'EL3 Monitor pour charger les parties TrustZone. |
| 14 | ODIN / cible personnalisée | Le démarrage continue vers ODIN ou la cible configurée. |
| Partie | Début | Fin |
|---|
fwbl1.img | 0x0 | 0x3000 |
epbl.img | 0x3000 | 0x16000 |
bl2.img | 0x16000 | 0x82000 |
lk.bin | 0xDB000 | 0x35B000 |
el3_mon.img | 0x35B000 | 0x39B000 |
| Étape | Adresse de chargement |
|---|
BL1 | 0x02022000 |
EPBL | 0x02026000 |
BL2 | 0x15600000 |
LK | 0xE8000000 |
EL3_MONITOR | 0xBFE80000 |
ID de source _boot_device | Voie de source de démarrage |
|---|
1 | Voie UFS, procédure de chargement UFS partagée. |
2 | Voie d'initialisation eMMC/SDMMC, procédure mmc_card_detect_and_init. |
3 | Périphérique SDMMC/MMC 0, mmc_read_blocks(0, ...). |
4 | Voie de chargement USB. |
5 | Périphérique SDMMC/MMC 1, mmc_read_blocks(1, ...). |
6 | Mode UFS alternatif, même procédure UFS de base que 1 avec un indicateur de mode différent. |
7 | Voie de lecture du contrôleur brut non-MMC/UFS/USB. |
0xB / 11 | Voie de secours USB, puis même gestionnaire USB que 4. |
| ID de source | Valeur | Signification |
|---|
1 | 0x20 | UFS |
2 | 0x14 | eMMC |
3 | 0x00 | SDMMC_CH2 |
4 / 0xB | 0x40 | USB |
| Crédit | Contribution |
|---|
| Chimera Tool | Première découverte de l'exploit vers 2021-2022. Chimera fournit des capacités avancées de maintenance Exynos sur de nombreux appareils, y compris des capacités basées sur cet exploit. |
| CVE-2024-56426 | La CVE sur laquelle ce projet est basé. |
| Christopher Wade | A signalé la CVE-2024-56426 à Samsung. |
| kethily-daniel | A fourni l'accès à l'outil utilisé pour le traçage des paquets USB et l'extraction d'échantillons. |
| BotchedRPR | A aidé pour la recherche initiale et la création de carte2. |
| VDavid003 | A aidé à rétro-ingénierer la PoC à partir de dumps de paquets et a personnellement testé sur des appareils. |
| halal-beef / hubble | A fourni les dumps de paquets USB initiaux et l'analyse de la PoC pendant le cycle de recherche, le code backend utilisé par le script d'exploit, et les dispositions SoC utilisées par les scripts de découpage et de fusion. |
| VDavid003 / exynos-usbdl | A fourni le squelette de payload à clé personnalisée GPLv3 et la procédure de référence de téléchargement USB Exynos utilisée comme base du payload à clé personnalisée Exynos990. |
| R0rt1z2 | A aidé à la création du payload ; une partie du travail était basée sur son projet, kaeru. |
| AntiEngineer | A partagé ses connaissances ARM, des astuces et un soutien à la recherche. |
| AA | Inspiration de la vulnérabilité et première utilisation en dehors de Chimera. |