
Exploit-Kit für den Exynos-9830-bootROM, das Signed-Boot-Bypass, benutzerdefinierte Schlüsselinjektion und Memory-Dump-Payloads für Samsung-SM-G985F-Geräte liefert.
[!CAUTION] Das aktuelle Schlüsselpaket und die erzeugten Dateien sind fusing-fähig. Sobald ein Gerät gefused wurde, ist die eFuse-Änderung irreversibel und das Gerät muss weiterhin Boot-Images und Schlüsselmaterial verwenden, das zum gefused Schlüssel passt. Die Verwendung dieser Dateien oder Abläufe erfolgt wegen des Fusing-Verhaltens auf eigenes Risiko; alle Konsequenzen bleiben in der Verantwortung des Benutzers, der sie ausführt. Überprüfen Sie die eFuse-Datei, die privaten Schlüssel, die signierten FWBL1-, LK-/
sboot.bin-Images und das Zielgerät, bevor Sie einen Fusing-Ablauf ausführen.
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 enthält coloredlogs, cryptography, hexdump, libusb, pyusb und pycryptodome.
Unter Windows muss das BootROM-USB-Gerät 04e8:1234 einen WinUSB-/libusb-kompatiblen Treiber verwenden, bevor PyUSB es öffnen kann. Siehe exploit/windows/README.md.
Das Repository enthält ein WinUSB-Treiberpaket unter exploit/windows/Exynos_USB_Device.inf, zusammen mit dem zugehörigen Katalog und der Zertifikat-Importdatei im selben Verzeichnis.
sboot.bin aufteilenpython3 exploit/split.py bootLoaderFiles/originalSboot_K/sboot.bin -o exploit/extra/images
Das Split-Skript schreibt die Image-Teile und eine split_manifest.json-Datei in das Ausgabeverzeichnis.
Das LK-Image muss für den Custom-Key-Ablauf die Command-IDs des ROM Secure Boot Key 2 verwenden:
Beim Anwenden der LK-Patch-TSV im Ghidra-Projekt wurde der Helfer wie folgt über Ghidra Headless aufgerufen:
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"
Betten Sie den 32-Byte-eFuse-Schlüssel bei Offset 0x205008 in lk.bin ein und ersetzen Sie damit den werkseitigen Schlüssel:
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
Das Merge-Skript schreibt sboot.bin in das aktuelle Arbeitsverzeichnis.
Erstellen Sie die Payload-Projekte unter external/payloads/ und kopieren Sie die resultierenden Binärdateien in exploit/extra/payloads/:
./exploit/build_payloads.sh
Der UFS-Loader und das Custom-Key-Payload betten zur Build-Zeit eine 32-Byte-eFuse-Datei ein. Standardmäßig liest das Makefile external/keys/exynos9830_crecker/crecker.efuse; überschreiben Sie dies bei Bedarf mit CUSTOM_KEY_EFUSE=/path/to/crecker.efuse.
Der von exploit/exploit.py ausgeführte Preflight-Schritt signiert den SBoot-Image-Satz in exploit/extra/images/ vor jedem signierten Lauf direkt an Ort und Stelle neu. Es wird keine separate signierte Ausgabe aufbewahrt. Der Signierungsschritt verwendet das bewusst im Repository geführte gemeinsame Schlüsselpaket unter external/keys/exynos9830_crecker/.
Entsprechender Befehl im Repository-Stammverzeichnis für den vollständigen Image-Satz:
python3 external/tools/sign_sboot_images.py \
--images-dir exploit/extra/images \
--keys-dir external/keys/exynos9830_crecker
Dies signiert:
Der Batch-Signer übergibt für jedes Image den Dezimalwert 23 und verwendet keinen älteren Rollback-Wert wieder, der bereits in einem vorhandenen Footer enthalten ist.
epbl.img wird bei Bedarf zuerst erneut verschlüsselt und anschließend über die endgültigen Bytes signiert. ldfw.img und tzsw.img benötigen weiterhin den externen AVB-Ablauf, wenn ihr AVB-Inhalt aktualisiert werden soll.
Der Nur-FWBL1-Befehl lautet:
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
Kurzform, wenn sich sign_tool.py, fwbl1.img und die crecker_*-Dateien im aktuellen Verzeichnis befinden:
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
Führen Sie die Befehle aus dem Repository-Stammverzeichnis aus, sofern nicht anders angegeben.
Der beobachtete Boot-Ablauf des Exynos 9830 ist:
Hinweis: Das mem.bin-Dump-Payload kann nur verwendet werden, wenn kein funktionierendes sboot installiert ist.
Senden Sie uh.bin über Heimdall an den Bootloader:
heimdall flash --BOOTLOADER uh.bin
Führen Sie den Dump-Ablauf aus:
python3 exploit/exploit.py --dump
Prüfen Sie den erzeugten exynos990.bootrom.bin-Dump.
Teile der Python-Recovery-Werkzeuge in diesem Repository wurden von halal-beef/hubble übernommen und angepasst.
Dieses Upstream-Projekt ist unter der GNU GPL v2.0 veröffentlicht, und dieses Repository behält aus Kompatibilitätsgründen eine GPL-2.0-Lizenz bei. Siehe LICENSE und NOTICE.md.
Das Exynos990-Custom-Key-Payload unter external/payloads/exynos990_boot_custom_key/ basiert auf dem Boot-Custom-Key-Payload-Gerüst und der Kontrollfluss-Idee von VDavid003/exynos-usbdl, einem Fork von frederic/exynos-usbdl. Es wurde erheblich umgeschrieben und an die Exynos9830-/Exynos990-GET_CONFIGURATION-Kette angepasst und ist keine wörtliche Kopie des Upstream-Payloads. Da das referenzierte Upstream-Projekt unter der GNU GPL v3.0 lizenziert ist, wird dieses Payload unter GPL-3.0-only gehalten; siehe external/payloads/exynos990_boot_custom_key/LICENSE.
| Pfad | Zweck |
|---|
bootLoaderFiles/ | Bootloader-Binärdateien, aufgeteilte Bootloader-Teile, Original-Images, entschlüsselte Images und Dump-Artefakte. |
bootromNotes/ | Boot-ROM-Notizen, Flussdiagramme und USB-Kontext-Offsets. |
exploit/ | Python-Werkzeuge, Exploit-Runner, Split-/Merge-Skripte, Payload-Build-Helfer und SoC-Daten. |
exploit/extra/images/ | Verwendbare Bootloader-Images, die von den Exploit-Abläufen verwendet werden. |
exploit/extra/payloads/ | Erstellte Payload-Binärdateien, kopiert aus external/payloads/. |
external/ | Payload-Quellen, Build-Makefile, dekompilierte Notizen, gemeinsames Schlüsselmaterial und Hilfswerkzeuge. |
external/keys/exynos9830_crecker/ | Gemeinsames Exynos9830-/Exynos990-Custom-Key-Paket, das vom Signed-Loader-Ablauf verwendet wird. |
exynos990reverseEng/ | Projektdateien des Exynos-990-Reverse-Engineering-Projekts. |
| Schlüssel-1-Befehl | Wert | Schlüssel-2-Befehl | Wert |
|---|
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 | Ausgabepfad | Zweck |
|---|
mem.bin | exploit/extra/payloads/mem.bin | Payload für den Boot-ROM-Speicherdump. |
loader.bin | exploit/extra/payloads/loader.bin | UFS-Pfad-Payload, verwendet von --ufs. |
Exynos990_boot_custom_key.bin | exploit/extra/payloads/Exynos990_boot_custom_key.bin | Custom-Key-Signed-Loader-Payload, verwendet von --signed. |
| Image | Verwendetes Schlüsselmaterial | Rollback-Revision |
|---|
fwbl1.img | BL1-privater Schlüssel + Stage2-TEE-/REE-Public-Keys | 23 |
epbl.img | Stage2-TEE-privater Schlüssel | 23 |
bl2.img | Stage2-REE-privater Schlüssel | 23 |
lk.bin | Stage2-REE-privater Schlüssel | 23 |
el3_mon.img | Stage2-TEE-privater Schlüssel | 23 |
ldfw.img | Stage2-TEE-privater Schlüssel, inner + outer | 23 |
tzsw.img | Stage2-TEE-privater Schlüssel, inner + outer | 23 |
| Befehl | Modus | Standard-Payload | Hinweise |
|---|
python3 exploit/exploit.py --ufs | UFS-Pfad | loader.bin | Startet den UFS-Payload-Ablauf. |
python3 exploit/exploit.py --signed | Signierte Bootkette | Exynos990_boot_custom_key.bin | Signiert den SBoot-Image-Satz neu und sendet die Images. |
python3 exploit/exploit.py --dump | Boot-ROM-Dump | mem.bin | Empfängt 0x20000 Bytes in exynos990.bootrom.bin. |
| Schritt | Hinweis |
|---|
| 1 | Download-Modus aufrufen. |
| 2 | sboot.bin bei Bedarf mit exploit/merge.py erstellen oder aktualisieren. |
| 3 | Den signierten Custom-Key-Ablauf verwenden, um den Crecker-Modus zu erreichen, einen ODIN-artigen Modus, der den Ziel-Image-Ablauf akzeptiert. |
| 4 | Das neue sboot.bin über ODIN, Heimdall oder einen anderen kompatiblen Sender senden. |
| 5 | Das UFS-Payload ausführen. |
| 6 | Optional: CreckerRom für One-UI-7- und Strong-Integrity-Workflows installieren. |
| 7 | Optional: Den Bootloader sperren, nachdem das Ziel-Setup abgeschlossen ist. |
| Schritt | Stufe | Hinweise |
|---|
| 1 | BootROM | Anfängliche ROM-Ausführung. |
| 2 | BL1 | Vollständige Übergabe vom BootROM. |
| 3 | EPBL | Vollständige Übergabe von BL1. |
| 4 | EPBL | Richtet einen minimalen SMC-Handler ein. |
| 5 | BL2 | EPBL lädt BL2. |
| 6 | BL2 | Teilweise Übergabe an BL2. |
| 7 | LK | BL2 verwendet EPBL, um LK zu laden, aber LK wird nicht sofort ausgeführt. |
| 8 | EL3 Monitor | BL2 verwendet EPBL, um den EL3 Monitor zu laden. |
| 9 | EL3 Monitor | EPBL entschlüsselt den EL3 Monitor. |
| 10 | EL3 Monitor | Vollständige Übergabe an den EL3 Monitor. |
| 11 | EL3 Monitor | Initialisiert und richtet den erweiterten SMC-Handler ein. |
| 12 | LK | Die Ausführung springt zu LK. |
| 13 | LK / EL3 Monitor | LK ruft den SMC-Handler des EL3 Monitors auf, um TrustZone-Teile zu laden. |
| 14 | ODIN / Custom-Target | Der Bootvorgang fährt mit ODIN oder dem konfigurierten Ziel fort. |
| Teil | Start | Ende |
|---|
fwbl1.img | 0x0 | 0x3000 |
epbl.img | 0x3000 | 0x16000 |
bl2.img | 0x16000 | 0x82000 |
lk.bin | 0xDB000 | 0x35B000 |
el3_mon.img | 0x35B000 | 0x39B000 |
| Stufe | Ladeadresse |
|---|
BL1 | 0x02022000 |
EPBL | 0x02026000 |
BL2 | 0x15600000 |
LK | 0xE8000000 |
EL3_MONITOR | 0xBFE80000 |
_boot_device-Quell-ID | Boot-Quellpfad |
|---|
1 | UFS-Pfad, gemeinsamer UFS-Ladeablauf. |
2 | eMMC-/SDMMC-Init-Pfad, mmc_card_detect_and_init-Ablauf. |
3 | SDMMC-/MMC-Gerät 0, mmc_read_blocks(0, ...). |
4 | USB-Ladepfad. |
5 | SDMMC-/MMC-Gerät 1, mmc_read_blocks(1, ...). |
6 | UFS-Alternativmodus, derselbe UFS-Kernablauf wie 1 mit einem anderen Modus-Flag. |
7 | Roh-Controller-Lesepfad ohne MMC/UFS/USB. |
0xB / 11 | USB-Fallback-Pfad, danach derselbe USB-Handler wie 4. |
| Quell-ID | Wert | Bedeutung |
|---|
1 | 0x20 | UFS |
2 | 0x14 | eMMC |
3 | 0x00 | SDMMC_CH2 |
4 / 0xB | 0x40 | USB |
| Danksagung | Beitrag |
|---|
| Chimera Tool | Erste Entdeckung des Exploits circa 2021–2022. Chimera bietet erweiterte Exynos-Servicing-Funktionen für viele Geräte, einschließlich Fähigkeiten, die auf diesem Exploit basieren. |
| CVE-2024-56426 | Die CVE, auf der dieses Projekt basiert. |
| Christopher Wade | Hat CVE-2024-56426 an Samsung gemeldet. |
| kethily-daniel | Hat Zugang zu dem Werkzeug bereitgestellt, das für USB-Paket-Tracing und Proben-Extraktion verwendet wurde. |
| BotchedRPR | Hat bei der anfänglichen Recherche und der Erstellung von carte2 geholfen. |
| VDavid003 | Hat beim Reverse Engineering des PoC anhand von Paket-Dumps geholfen und persönlich auf Geräten getestet. |
| halal-beef / hubble | Hat während des Forschungszyklus erste USB-Paket-Dumps und Analysen des PoC bereitgestellt, den vom Exploit-Skript verwendeten Backend-Code sowie die von den Split- und Merge-Skripten verwendeten SoC-Layouts. |
| VDavid003 / exynos-usbdl | Hat das GPLv3-Custom-Key-Payload-Gerüst und den Exynos-USB-Download-Referenzablauf bereitgestellt, die als Grundlage für das Exynos990-Custom-Key-Payload dienen. |
| R0rt1z2 | Hat bei der Payload-Erstellung geholfen; einige Arbeiten basierten auf seinem Projekt kaeru. |
| AntiEngineer | Hat ARM-Wissen, Hinweise und Unterstützung bei der Recherche geteilt. |
| AA | Inspiration für die Schwachstelle und erste Verwendung außerhalb von Chimera. |