
Эксплойт-кит для bootROM Exynos 9830, который обеспечивает обход подписанной загрузки, инъекцию пользовательских ключей и дамп памяти на устройствах Samsung SM-G985F.
[!CAUTION] Текущий набор ключей и сгенерированные файлы поддерживают операцию fusing. После того как устройство прошло fusing, изменение eFuse необратимо, и устройство должно продолжать использовать загрузочные образы и ключевой материал, соответствующие запрограммированному ключу. Использование этих файлов или процедур осуществляется на ваш собственный риск из-за особенностей fusing; все последствия остаются на ответственности пользователя, выполняющего их. Проверьте файл eFuse, закрытые ключи, подписанный FWBL1, образы LK /
sboot.binи целевое устройство перед запуском любой процедуры fusing.
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 для процедуры кастомного ключа:
При применении 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
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
При этом подписываются:
Пакетный подписант передаёт десятичное значение 23 для каждого образа и не использует повторно
более старое значение отката, уже присутствующее в существующем футере.
epbl.img при необходимости сначала повторно шифруется, а затем подписывается по финальным байтам.
Для ldfw.img и tzsw.img по-прежнему требуется внешняя процедура AVB, если их содержимое AVB
должно быть обновлено.
Команда только для FWBL1:
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
Краткая форма, когда sign_tool.py, fwbl1.img и файлы crecker_* находятся в текущем каталоге:
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
Выполняйте команды из корня репозитория, если не указано иное.
Наблюдаемая процедура загрузки Exynos 9830:
Примечание: полезную нагрузку дампа mem.bin можно использовать только в том случае, если рабочий sboot не установлен.
Отправьте uh.bin в загрузчик через Heimdall:
heimdall flash --BOOTLOADER uh.bin
Запустите процедуру дампа:
python3 exploit/exploit.py --dump
Просмотрите сгенерированный дамп exynos990.bootrom.bin.
Части инструментов восстановления на Python в этом репозитории были адаптированы из halal-beef/hubble.
Этот первоисточник опубликован под лицензией GNU GPL v2.0, и данный репозиторий сохраняет лицензию GPL-2.0 для совместимости. См. LICENSE и NOTICE.md.
Полезная нагрузка с кастомным ключом Exynos990 в external/payloads/exynos990_boot_custom_key/ основана на
скелете полезной нагрузки boot-custom-key и идее управления потоком из
VDavid003/exynos-usbdl, форка
frederic/exynos-usbdl. Она была существенно переписана и
адаптирована для цепочки GET_CONFIGURATION Exynos9830 / Exynos990 и не является дословной копией исходной
полезной нагрузки. Поскольку упомянутый первоисточник лицензирован под GNU GPL v3.0, эта полезная нагрузка
распространяется только под GPL-3.0; см. external/payloads/exynos990_boot_custom_key/LICENSE.
| Путь | Назначение |
|---|
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. |
| Команда 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 |
| Полезная нагрузка | Путь вывода | Назначение |
|---|
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. |
| Образ | Используемый ключевой материал | Версия отката |
|---|
fwbl1.img | Закрытый ключ BL1 + открытые ключи Stage2 TEE/REE | 23 |
epbl.img | Закрытый ключ Stage2 TEE | 23 |
bl2.img | Закрытый ключ Stage2 REE | 23 |
lk.bin | Закрытый ключ Stage2 REE | 23 |
el3_mon.img | Закрытый ключ Stage2 TEE | 23 |
ldfw.img | Закрытый ключ Stage2 TEE, внутренний + внешний | 23 |
tzsw.img | Закрытый ключ Stage2 TEE, внутренний + внешний | 23 |
| Команда | Режим | Полезная нагрузка по умолчанию | Примечания |
|---|
python3 exploit/exploit.py --ufs | Путь UFS | loader.bin | Запускает процедуру с полезной нагрузкой UFS. |
python3 exploit/exploit.py --signed | Подписанная цепочка загрузки | Exynos990_boot_custom_key.bin | Повторно подписывает набор образов SBoot и отправляет образы. |
python3 exploit/exploit.py --dump | Дамп Boot ROM | mem.bin | Принимает 0x20000 байт в exynos990.bootrom.bin. |
| Шаг | Примечание |
|---|
| 1 | Войдите в режим загрузки (download mode). |
| 2 | При необходимости создайте или обновите sboot.bin с помощью exploit/merge.py. |
| 3 | Используйте подписанную процедуру кастомного ключа, чтобы попасть в режим Crecker — режим в стиле ODIN, принимающий процедуру целевого образа. |
| 4 | Отправьте новый sboot.bin через ODIN, Heimdall или другой совместимый отправитель. |
| 5 | Запустите полезную нагрузку UFS. |
| 6 | Необязательно: установите CreckerRom для рабочих процессов One UI 7 и Strong Integrity. |
| 7 | Необязательно: заблокируйте загрузчик после завершения настройки целевого устройства. |
| Шаг | Стадия | Примечания |
|---|
| 1 | BootROM | Начальное выполнение ROM. |
| 2 | BL1 | Полная передача управления от BootROM. |
| 3 | EPBL | Полная передача управления от BL1. |
| 4 | EPBL | Настраивает минимальный обработчик SMC. |
| 5 | BL2 | EPBL загружает BL2. |
| 6 | BL2 | Частичная передача управления BL2. |
| 7 | LK | BL2 использует EPBL для загрузки LK, но LK не выполняется сразу. |
| 8 | EL3 Monitor | BL2 использует EPBL для загрузки EL3 Monitor. |
| 9 | EL3 Monitor | EPBL расшифровывает EL3 Monitor. |
| 10 | EL3 Monitor | Полная передача управления EL3 Monitor. |
| 11 | EL3 Monitor | Инициализирует и настраивает расширенный обработчик SMC. |
| 12 | LK | Выполнение переходит к LK. |
| 13 | LK / EL3 Monitor | LK вызывает обработчик SMC EL3 Monitor для загрузки частей TrustZone. |
| 14 | ODIN / пользовательская цель | Загрузка продолжается до ODIN или настроенной цели. |
| Часть | Начало | Конец |
|---|
fwbl1.img | 0x0 | 0x3000 |
epbl.img | 0x3000 | 0x16000 |
bl2.img | 0x16000 | 0x82000 |
lk.bin | 0xDB000 | 0x35B000 |
el3_mon.img | 0x35B000 | 0x39B000 |
| Стадия | Адрес загрузки |
|---|
BL1 | 0x02022000 |
EPBL | 0x02026000 |
BL2 | 0x15600000 |
LK | 0xE8000000 |
EL3_MONITOR | 0xBFE80000 |
Идентификатор источника _boot_device | Путь источника загрузки |
|---|
1 | Путь UFS, общая процедура загрузки UFS. |
2 | Путь инициализации eMMC/SDMMC, процедура mmc_card_detect_and_init. |
3 | Устройство SDMMC/MMC 0, mmc_read_blocks(0, ...). |
4 | Путь загрузки USB. |
5 | Устройство SDMMC/MMC 1, mmc_read_blocks(1, ...). |
6 | Альтернативный режим UFS, та же базовая процедура UFS, что и 1, но с другим флагом режима. |
7 | Путь чтения через сырой контроллер, отличный от MMC/UFS/USB. |
0xB / 11 | Резервный путь USB, затем тот же обработчик USB, что и 4. |
| Идентификатор источника | Значение | Смысл |
|---|
1 | 0x20 | UFS |
2 | 0x14 | eMMC |
3 | 0x00 | SDMMC_CH2 |
4 / 0xB | 0x40 | USB |
| Автор | Вклад |
|---|
| Chimera Tool | Первое обнаружение эксплойта примерно в 2021–2022 годах. Chimera предоставляет расширенные возможности обслуживания Exynos на многих устройствах, включая возможности, основанные на этом эксплойте. |
| CVE-2024-56426 | CVE, на котором основан этот проект. |
| Christopher Wade | Сообщил о CVE-2024-56426 в Samsung. |
| kethily-daniel | Предоставил доступ к инструменту, использовавшемуся для трассировки USB-пакетов и извлечения образцов. |
| BotchedRPR | Помог с первоначальными исследованиями и созданием carte2. |
| VDavid003 | Помог с обратной разработкой PoC по дампам пакетов и лично тестировал на устройствах. |
| halal-beef / hubble | Предоставил первоначальные дампы USB-пакетов и анализ PoC в ходе исследовательского цикла, внутренний код, используемый скриптом эксплойта, и компоновки SoC, используемые скриптами разделения и объединения. |
| VDavid003 / exynos-usbdl | Предоставил скелет полезной нагрузки с кастомным ключом под лицензией GPLv3 и эталонную процедуру загрузки Exynos через USB, использовавшиеся как основа для полезной нагрузки с кастомным ключом Exynos990. |
| R0rt1z2 | Помог с созданием полезной нагрузки; часть работы была основана на его проекте kaeru. |
| AntiEngineer | Делился знаниями об ARM, подсказками и оказывал исследовательскую поддержку. |
| AA | Вдохновение для уязвимости и первое использование за пределами Chimera. |