
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를 사용해야 합니다:
| 키 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 |
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
| 페이로드 | 출력 경로 | 용도 |
|---|---|---|
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에서 사용하는 커스텀 키 서명 로더 페이로드. |
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
다음 이미지가 서명됩니다:
| 이미지 | 사용된 키 자료 | 롤백 리비전 |
|---|---|---|
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 |
일괄 서명기는 모든 이미지에 십진수 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
별도의 언급이 없는 한 저장소 루트에서 명령을 실행하십시오.
| 명령 | 모드 | 기본 페이로드 | 비고 |
|---|---|---|---|
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으로 수신합니다. |