
CVE-2024-56426 Exynos9830 Bootrom 익스플로잇 - SM-G985F
[!CAUTION] 현재 키 번들 및 생성된 파일은 퓨징(fusing)이 가능합니다. 일단 디바이스가 퓨징되면 eFuse 변경은 되돌릴 수 없으며, 디바이스는 퓨징된 키와 일치하는 부트 이미지 및 키 자료를 계속 사용해야 합니다. 퓨징 동작으로 인해 이러한 파일이나 플로우를 사용하는 것은 사용자 자신의 책임입니다; 모든 결과에 대한 책임은 이를 실행하는 사용자에게 있습니다. 퓨징 플로우를 실행하기 전에 eFuse 파일, 개인 키, 서명된 FWBL1, LK /
sboot.bin이미지 및 대상 디바이스를 확인하십시오.
| 경로 | 용도 |
|---|---|
bootLoaderFiles/ | 부트로더 바이너리, 분할된 부트로더 파트, 원본 이미지, 복호화된 이미지 및 덤프 산출물. |
bootromNotes/ | 부트 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에서 BootROM USB 디바이스 04e8:1234는 PyUSB가 열기 전에 WinUSB/libusb 호환
드라이버를 사용해야 합니다. exploit/windows/README.md를 참조하십시오.
저장소에는 exploit/windows/Exynos_USB_Device.inf에 WinUSB 드라이버 패키지가 포함되어 있으며,
동일한 디렉터리에 해당 카탈로그 및 인증서 가져오기 파일도 함께 있습니다.
sboot.bin 분할python3 exploit/split.py bootLoaderFiles/originalSboot_K/sboot.bin -o exploit/extra/images
분할 스크립트는 이미지 파트와 split_manifest.json 파일을 출력 디렉터리에 기록합니다.
LK 이미지는 커스텀 키 플로우를 위해 ROM 시큐어 부트 키 2 명령 ID를 사용해야 합니다:
Ghidra 프로젝트 내에서 LK 패치 TSV를 적용할 때 헬퍼는 다음과 같이 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 키를 기본 키 대신 오프셋 0x205008의 lk.bin에 임베드합니다:
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가 실행하는 사전 점검 단계는 각 서명 실행 전에
exploit/extra/images/의 SBoot 이미지 세트를 제자리에서 다시 서명합니다. 별도의 서명된
출력은 유지되지 않습니다. 서명 단계는 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가 설치되지 않은 경우에만 사용할 수 있습니다.
Heimdall을 통해 uh.bin을 부트로더로 전송합니다:
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를 참조하십시오.
external/payloads/exynos990_boot_custom_key/ 아래의 Exynos990 커스텀 키 페이로드는
frederic/exynos-usbdl의 포크인
VDavid003/exynos-usbdl의
부트 커스텀 키 페이로드 스켈레톤 및 제어 흐름 아이디어를 기반으로 합니다. 이는
Exynos9830 / Exynos990 GET_CONFIGURATION 체인에 맞게 상당히 재작성 및
적용되었으며, 업스트림 페이로드의 축어적 복사본이 아닙니다. 참조된 업스트림 프로젝트가 GNU GPL v3.0으로
라이선스되었기 때문에 이 페이로드는 GPL-3.0-only로 유지됩니다; external/payloads/exynos990_boot_custom_key/LICENSE를 참조하십시오.
| 키 1 명령 | 값 | 키 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 | 부트 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 | 부트 ROM 덤프 | mem.bin | 0x20000바이트를 exynos990.bootrom.bin으로 수신합니다. |
| 단계 | 참고 사항 |
|---|
| 1 | 다운로드 모드에 진입합니다. |
| 2 | 필요 시 exploit/merge.py로 sboot.bin을 생성하거나 업데이트합니다. |
| 3 | 서명된 커스텀 키 플로우를 사용하여 대상 이미지 플로우를 수용하는 ODIN 스타일 모드인 Crecker 모드에 도달합니다. |
| 4 | ODIN, Heimdall 또는 기타 호환 전송 도구를 통해 새 sboot.bin을 전송합니다. |
| 5 | UFS 페이로드를 실행합니다. |
| 6 | 선택 사항: One UI 7 및 Strong Integrity 워크플로우를 위해 CreckerRom을 설치합니다. |
| 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는 TrustZone 파트를 로드하기 위해 EL3 Monitor SMC 핸들러를 호출합니다. |
| 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 소스 ID | 부트 소스 경로 |
|---|
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 대체 모드, 다른 모드 플래그를 가진 1과 동일한 핵심 UFS 플로우. |
7 | MMC/UFS/USB가 아닌 원시 컨트롤러 읽기 경로. |
0xB / 11 | USB 폴백 경로, 이후 4와 동일한 USB 핸들러. |
| 소스 ID | 값 | 의미 |
|---|
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 | 연구 수명 주기 동안 PoC의 초기 USB 패킷 덤프 및 분석, 익스플로잇 스크립트가 사용하는 백엔드 코드, 분할 및 병합 스크립트가 사용하는 SoC 레이아웃 제공. |
| VDavid003 / exynos-usbdl | Exynos990 커스텀 키 페이로드의 기반으로 사용된 GPLv3 커스텀 키 페이로드 스켈레톤 및 Exynos USB 다운로드 참조 플로우 제공. |
| R0rt1z2 | 페이로드 제작에 도움; 일부 작업은 그의 프로젝트인 kaeru를 기반으로 함. |
| AntiEngineer | ARM 지식, 힌트 및 연구 지원 공유. |
| AA | 취약점 영감 및 Chimera 외부에서의 첫 사용. |