
CVE-2024-56426 Exploit de Bootrom Exynos9830 - SM-G985F
[!CAUTION] El conjunto de claves actual y los archivos generados son capaces de realizar fusing. Una vez que un dispositivo ha sido fusionado, el cambio de eFuse es irreversible y el dispositivo debe seguir usando imágenes de arranque y material de claves que coincidan con la clave fusionada. El uso de estos archivos o flujos es bajo su propio riesgo debido al comportamiento de fusing; todas las consecuencias siguen siendo responsabilidad del usuario que los ejecuta. Verifique el archivo eFuse, las claves privadas, el FWBL1 firmado, las imágenes LK /
sboot.biny el dispositivo de destino antes de ejecutar cualquier flujo de fusing.
| Ruta | Propósito |
|---|---|
bootLoaderFiles/ | Binarios del bootloader, partes divididas del bootloader, imágenes originales, imágenes descifradas y artefactos de volcado. |
bootromNotes/ | Notas de la ROM de arranque, diagramas de flujo y offsets de contexto USB. |
exploit/ | Herramientas Python, ejecutor del exploit, scripts de división/fusión, ayudante de compilación de payload y datos del SoC. |
exploit/extra/images/ | Imágenes del bootloader funcionales consumidas por los flujos del exploit. |
exploit/extra/payloads/ | Binarios de payload compilados copiados desde external/payloads/. |
external/ | Código fuente del payload, Makefile de compilación, notas descompiladas, material de claves compartido y herramientas auxiliares. |
external/keys/exynos9830_crecker/ | Paquete de claves personalizadas compartido Exynos9830 / Exynos990 utilizado por el flujo de cargador firmado. |
exynos990reverseEng/ | Archivos del proyecto de ingeniería inversa del 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
El archivo requirements.txt incluye coloredlogs, cryptography, hexdump, libusb, pyusb y pycryptodome.
En Windows, el dispositivo USB BootROM 04e8:1234 debe usar un controlador compatible con WinUSB/libusb
antes de que PyUSB pueda abrirlo. Ver exploit/windows/README.md.
El repositorio incluye un paquete de controladores WinUSB en
exploit/windows/Exynos_USB_Device.inf, con su catálogo correspondiente y archivo
de importación de certificados en el mismo directorio.
sboot.binpython3 exploit/split.py bootLoaderFiles/originalSboot_K/sboot.bin -o exploit/extra/images
El script de división escribe las partes de la imagen y un archivo split_manifest.json en el directorio de salida.
La imagen LK debe usar los IDs de comando de la clave 2 de arranque seguro de ROM para el flujo de clave personalizada:
| Comando clave 1 | Valor | Comando clave 2 | Valor |
|---|---|---|---|
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 |
Al aplicar el TSV de parches de LK dentro del proyecto Ghidra, el helper se invocó mediante Ghidra headless de esta manera:
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"
Incrusta la clave eFuse de 32 bytes en lk.bin en el offset 0x205008, reemplazando la clave de fábrica:
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
El script de fusión escribe sboot.bin en el directorio de trabajo actual.
Compila los proyectos de payload en external/payloads/ y copia los binarios resultantes en exploit/extra/payloads/:
./exploit/build_payloads.sh
| Payload | Ruta de salida | Propósito |
|---|---|---|
mem.bin | exploit/extra/payloads/mem.bin | Payload de volcado de memoria del Boot ROM. |
loader.bin | exploit/extra/payloads/loader.bin | Payload de la ruta UFS usado por --ufs. |
Exynos990_boot_custom_key.bin | exploit/extra/payloads/Exynos990_boot_custom_key.bin | Payload de cargador firmado con clave personalizada usado por --signed. |
El cargador UFS y el payload de clave personalizada incrustan un archivo eFuse de 32 bytes en tiempo de compilación.
De forma predeterminada, el Makefile lee external/keys/exynos9830_crecker/crecker.efuse;
sobreescríbelo con CUSTOM_KEY_EFUSE=/path/to/crecker.efuse cuando sea necesario.
El paso de preflight ejecutado por exploit/exploit.py vuelve a firmar el conjunto de imágenes SBoot en
exploit/extra/images/ in situ antes de cada ejecución firmada. No se conserva una salida
firmada separada. El paso de firma utiliza el paquete de claves compartidas, intencionadamente rastreado,
en external/keys/exynos9830_crecker/.
Comando equivalente desde la raíz del repositorio para el conjunto de imágenes completo:
python3 external/tools/sign_sboot_images.py \
--images-dir exploit/extra/images \
--keys-dir external/keys/exynos9830_crecker
Esto firma: