
CVE-2024-56426 Эксплойт Bootrom Exynos9830 - SM-G985F
[!CAUTION] Текущий набор ключей и сгенерированные файлы поддерживают операцию fusing. После того как устройство прошло fusing, изменение eFuse необратимо, и устройство должно продолжать использовать загрузочные образы и ключевой материал, соответствующие запрограммированному ключу. Использование этих файлов или процедур осуществляется на ваш собственный риск из-за особенностей fusing; все последствия остаются на ответственности пользователя, выполняющего их. Проверьте файл eFuse, закрытые ключи, подписанный FWBL1, образы LK /
sboot.binи целевое устройство перед запуском любой процедуры fusing.
| Путь | Назначение |
|---|---|
bootLoaderFiles/ | Бинарные файлы загрузчика, разделённые части загрузчика, исходные образы, расшифрованные образы и артефакты дампа. |
bootromNotes/ | Заметки о Boot ROM, блок-схемы и смещения USB-контекста. |
exploit/ | Инструменты на Python, исполнитель эксплойта, скрипты разделения/объединения, помощник сборки полезной нагрузки и данные SoC. |
exploit/extra/images/ | Рабочие образы загрузчика, используемые процедурами эксплойта. |
exploit/extra/payloads/ | Собранные бинарные файлы полезной нагрузки, скопированные из external/payloads/. |
external/ | Исходные коды полезной нагрузки, Makefile для сборки, заметки по декомпиляции, общий ключевой материал и вспомогательные инструменты. |
external/keys/exynos9830_crecker/ | Общий набор кастомных ключей Exynos9830 / Exynos990, используемый процедурой подписанного загрузчика. |
exynos990reverseEng/ | Файлы проекта по обратной разработке 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 включает coloredlogs, cryptography, hexdump, libusb, pyusb и pycryptodome.
В Windows USB-устройство BootROM 04e8:1234 должно использовать драйвер, совместимый с WinUSB/libusb,
прежде чем PyUSB сможет открыть его. См. exploit/windows/README.md.
Репозиторий включает пакет драйвера WinUSB в exploit/windows/Exynos_USB_Device.inf
вместе с соответствующим каталогом и файлом импорта сертификата в том же каталоге.
sboot.binpython3 exploit/split.py bootLoaderFiles/originalSboot_K/sboot.bin -o exploit/extra/images
Скрипт разделения записывает части образа и файл split_manifest.json в выходной каталог.
Образ LK должен использовать идентификаторы команд ROM secure boot key 2 для процедуры кастомного ключа:
| Команда Key 1 | Значение | Команда Key 2 | Значение |
|---|---|---|---|
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 |
При применении TSV-патча LK внутри проекта Ghidra вспомогательная функция вызывалась через Ghidra headless следующим образом:
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"
Встройте 32-байтовый ключ eFuse в lk.bin по смещению 0x205008, заменив штатный ключ:
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
Скрипт объединения записывает sboot.bin в текущий рабочий каталог.
Соберите проекты полезной нагрузки в external/payloads/ и скопируйте полученные бинарные файлы в exploit/extra/payloads/:
./exploit/build_payloads.sh
| Полезная нагрузка | Путь вывода | Назначение |
|---|---|---|
mem.bin | exploit/extra/payloads/mem.bin | Полезная нагрузка для дампа памяти Boot ROM. |
loader.bin | exploit/extra/payloads/loader.bin | Полезная нагрузка для пути UFS, используемая --ufs. |
Exynos990_boot_custom_key.bin | exploit/extra/payloads/Exynos990_boot_custom_key.bin | Полезная нагрузка подписанного загрузчика с кастомным ключом, используемая --signed. |
UFS-загрузчик и полезная нагрузка с кастомным ключом встраивают 32-байтовый файл efuse во время сборки.
По умолчанию Makefile читает external/keys/exynos9830_crecker/crecker.efuse;
при необходимости переопределите это значение с помощью CUSTOM_KEY_EFUSE=/path/to/crecker.efuse.
Предварительный этап, выполняемый exploit/exploit.py, повторно подписывает набор образов SBoot
в exploit/extra/images/ на месте перед каждым подписанным запуском. Отдельный подписанный
выходной файл не сохраняется. Этап подписи использует общий набор ключей в external/keys/exynos9830_crecker/,
который намеренно хранится в репозитории.
Эквивалентная команда из корня репозитория для полного набора образов:
python3 external/tools/sign_sboot_images.py \
--images-dir exploit/extra/images \
--keys-dir external/keys/exynos9830_crecker
При этом подписываются: