
CVE-2024-56426 Exploit Bootrom Exynos9830 - SM-G985F
[!CAUTION] Il bundle di chiavi attuale e i file generati sono in grado di eseguire il fusing. Una volta eseguito il fusing su un dispositivo, la modifica dell'eFuse è irreversibile e il dispositivo deve continuare a utilizzare immagini di avvio e materiale chiave che corrispondano alla chiave fusa. L'utilizzo di questi file o flussi è a proprio rischio a causa del comportamento di fusing; tutte le conseguenze rimangono a carico dell'utente che li esegue. Verificare il file eFuse, le chiavi private, il FWBL1 firmato, le immagini LK /
sboot.bine il dispositivo di destinazione prima di eseguire qualsiasi flusso di fusing.
| Path | Purpose |
|---|---|
bootLoaderFiles/ | Binari del bootloader, parti del bootloader suddivise, immagini originali, immagini decrittate e artefatti di dump. |
bootromNotes/ | Note sulla Boot ROM, diagrammi di flusso e offset di contesto USB. |
exploit/ | Strumenti Python, esecutore dell'exploit, script di split/merge, helper di build dei payload e dati SoC. |
exploit/extra/images/ | Immagini del bootloader funzionanti utilizzate dai flussi dell'exploit. |
exploit/extra/payloads/ | Binari dei payload compilati copiati da external/payloads/. |
external/ | Sorgenti dei payload, Makefile di build, note decompilate, materiale chiave condiviso e strumenti helper. |
external/keys/exynos9830_crecker/ | Bundle Exynos9830 / Exynos990 a chiave personalizzata condiviso utilizzato dal flusso signed-loader. |
exynos990reverseEng/ | File del progetto di reverse engineering Exynos 990. |
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 include coloredlogs, cryptography, hexdump, libusb, pyusb e pycryptodome.
Su Windows, il dispositivo USB 04e8:1234 della BootROM deve utilizzare un driver compatibile WinUSB/libusb prima che PyUSB possa aprirlo. Vedere exploit/windows/README.md.
Il repository include un pacchetto di driver WinUSB in exploit/windows/Exynos_USB_Device.inf, con il relativo catalogo e il file di importazione del certificato nella stessa directory.
sboot.binpython3 exploit/split.py bootLoaderFiles/originalSboot_K/sboot.bin -o exploit/extra/images
Lo script di split scrive le parti delle immagini e un file split_manifest.json nella directory di output.
L'immagine LK deve utilizzare gli ID comando della chiave 2 di avvio sicuro della ROM per il flusso a chiave personalizzata:
| Comando chiave 1 | Valore | Comando chiave 2 | Valore |
|---|---|---|---|
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 |
Quando si applica il TSV di patch LK all'interno del progetto Ghidra, l'helper è stato richiamato tramite Ghidra headless in questo modo:
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"
Incorpora la chiave eFuse a 32 byte in lk.bin all'offset 0x205008, sostituendo la chiave di serie:
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
Lo script di merge scrive sboot.bin nella directory di lavoro corrente.
Compila i progetti dei payload in external/payloads/ e copia i binari risultanti in exploit/extra/payloads/:
./exploit/build_payloads.sh
| Payload | Output path | Purpose |
|---|---|---|
mem.bin | exploit/extra/payloads/mem.bin | Payload per il dump della memoria della Boot ROM. |
loader.bin | exploit/extra/payloads/loader.bin | Payload del percorso UFS utilizzato da --ufs. |
Exynos990_boot_custom_key.bin | exploit/extra/payloads/Exynos990_boot_custom_key.bin | Payload signed-loader a chiave personalizzata utilizzato da --signed. |
Il loader UFS e il payload a chiave personalizzata incorporano un file efuse a 32 byte al momento della build.
Per impostazione predefinita il Makefile legge external/keys/exynos9830_crecker/crecker.efuse;
sovrascrivi questo valore con CUSTOM_KEY_EFUSE=/path/to/crecker.efuse quando necessario.
La fase di preflight eseguita da exploit/exploit.py firma nuovamente il set di immagini SBoot in
exploit/extra/images/ sul posto prima di ogni esecuzione firmata. Non viene conservato alcun output
firmato separato. Il passaggio di firma utilizza il bundle di chiavi condivise volutamente tracciato in external/keys/exynos9830_crecker/.
Comando equivalente dalla radice del repository per il set completo di immagini:
python3 external/tools/sign_sboot_images.py \
--images-dir exploit/extra/images \
--keys-dir external/keys/exynos9830_crecker
Questo firma: