
CVE-2022-38694를 통한 ZTE Blade V40 Vita(P606F02 / Unisoc UMS9230 / UFS) 부트로더 잠금 해제 - Linux 스크립트, FBE 잠금 해제 후 멈춤 수정, 그리고 아무도 문서화하지 않은 두 가지 함정
CVE-2022-38694를 이용한 언락을 위한 Linux 노트 및 스크립트. MyOS11.0.13_8045_EEA를 실행하는 내 EEA_P606F02에서 수행함.
이 작업의 성공 여부를 결정하는 두 가지가 있으며, 둘 다 어디에도 문서화되어 있지 않다:
SEND fdl2-dl.bin → connection closed). VOL_UP + VOL_DOWN만 누르고 있어라. 리셋이 필요하면 POWER를 한 번 톡 누른다.misc wipe BCB는 아무 효과가 없다 — 이 부트로더는 이를 무시한다. 대신 BROM을 통해 userdata + metadata를 지워라.| 모델 | ZTE Blade V40 Vita — ZTE 8045 / EEA_P606F02 |
| SoC / 저장소 | Unisoc UMS9230 / UFS |
| 패키지 | ums9230_universal_unlock_UFS. UFS fdl2-*.bin은 934088 바이트이고, eMMC용은 ~1 MB이다. 잘못된 로더는 휴대폰을 초기화할 수 있다 |
| OS / 슬롯 | Android 11, MyOS11.0.13 · 슬롯 _b |
git clone --recursive https://github.com/TomKing062/CVE-2022-38694_unlock_bootloader
cd CVE-2022-38694_unlock_bootloader
gcc chsize.c -o chsize
gcc gen_spl-unlock.c -o gen_spl-unlock
cd spreadtrum_flash && make # spd_dump
chsize, gen_spl-unlock, spd_dump와 UFS 패키지의 네 파일(fdl1-dl.bin, fdl2-dl.bin, fdl2-cboot.bin, misc-wipe.bin)을 하나의 작업 디렉터리에 넣어라. 아래 스크립트는 해당 디렉터리를 기준으로 실행된다.
휴대폰 전원 끔 → VOL_UP + VOL_DOWN 누름 → USB 연결 → 계속 누르고 있음. USB **1782:4d00**이 나타나야 한다:
for d in /sys/bus/usb/devices/*/; do
[ "$(cat $d/idVendor 2>/dev/null)" = 1782 ] && echo "BROM: $(basename $d)"
done
19d2:135x는 휴대폰의 일반 USB이며 BROM이 아니다. 부트 루프에 빠진 휴대폰도 괜찮다 — 리셋할 때마다 BootROM이 다시 실행되며, 리셋 시점에 키를 다시 샘플링한다.
한 번에 한 단계씩, 각 단계 전에 BROM에 다시 진입한다. 실행 중에는 볼륨 키를 계속 누르고 있어라.
cd /path/to/working-dir
sudo /path/to/repo/scripts/unlock.sh 1 # back up SPL + uboot_b, erase SPL (won't boot after this)
sudo /path/to/repo/scripts/unlock.sh 2 # prep images locally, phone not needed
sudo /path/to/repo/scripts/unlock.sh 3 # write fdl2-cboot.bin to uboot_b
sudo /path/to/repo/scripts/unlock.sh 4 # the unlock. ends in "connection closed" = success
sudo /path/to/repo/scripts/unlock.sh 5 # read miscdata @8192: 64 zeros = locked, string+2 hashes = unlocked
sudo /path/to/repo/scripts/unlock.sh 6 # restore uboot/SPL. never skip this
4단계는 EXEC FDL1 → 타임아웃 → connection closed로 끝난다. 이는 언락이 실패한 것이 아니라 작동한 것이다. 5단계에서 0이 표시되면 4단계를 다시 실행하라.
3단계를 거치면 휴대폰이 Android를 부팅할 수 없게 된다 (페이로드가 실제 부트로더가 아니기 때문) — 6단계에서 원래의 uboot_bak.bin을 복원한다. 중간에 멈추지 마라.
trustos의 FBE 키는 잠금 상태에 봉인되어 있어 /data가 절대 마운트될 수 없다. 와이핑은 필수이다:
sudo /path/to/repo/scripts/fix-post-unlock-hang.sh
볼륨 키를 누르고 있어라, BROM을 잡을 때까지 스스로 재시도한다. userdata + metadata를 지우고, BCB를 쓰고, 리셋한다. 세 번째 시도에서 잡혔고 1분 이내에 끝났다.
adb shell getprop ro.boot.flash.locked # 0
adb shell getprop ro.boot.verifiedbootstate # orange
adb shell getprop ro.boot.vbmeta.device_state # unlocked
이 기기에서는 fastboot getvar가 쓸모없다 (모든 항목에 대해 빈 값을 반환함), 그러니 여기서 확인을 찾지 마라.
VAB 기기, 슬롯 b, recovery 파티션 없음:
fastboot flash boot_b magisk_patched.img
부트 이미지를 잘못 플래싱해도 BROM으로 돌아갈 수 있으며, 여전히 작동한다. 파티션 맵: docs/partition-table.md.
재잠금: 가능하지만 (BROM을 통해 miscdata 토큰을 0으로 설정) 보안 측면에서는 무의미하다 — BootROM 버그는 영구적이며, 누구든 이 동일한 단계로 다시 언락할 수 있다.
크레딧: CVE-2022-38694는 NCC Group의 것이다. 도구는 TomKing062의 것이다. 여기 있는 스크립트는 MIT이다. 휴대폰을 초기화하며, 그 책임은 본인에게 있다.