
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용은 약 1MB입니다. 잘못된 로더는 휴대폰을 초기화할 수 있습니다 |
| 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는 BROM이 아니라 휴대폰의 일반 USB입니다. 부트 루프에 빠진 휴대폰도 괜찮습니다. 리셋할 때마다 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는 이 기기에서 쓸모가 없습니다(모든 항목에 대해 빈 값을 반환함). 따라서 여기서 확인하려 하지 마세요.
이 기기는 recovery 파티션이 없는 VAB 기기입니다. 플래싱하기 전에 항상 활성 슬롯을 조회하세요:
adb shell getprop ro.boot.slot_suffix
순정 B06 부트 이미지는 플래싱 전에 Magisk 출력을 다시 서명해야 합니다. 테스트된 Windows 순정 플래시, AVB 서명 및 복구 절차는 docs/windows-flash-root.md에 있습니다. 부트 이미지를 벽돌로 만들어도 BROM은 여전히 작동합니다. 파티션 맵: docs/partition-table.md.
재잠금: 가능하지만(BROM을 통해 miscdata 토큰을 0으로 설정) 보안 측면에서는 무의미합니다 —
BootROM 버그는 영구적이므로 누구든 이와 동일한 단계로 다시 잠금 해제할 수 있습니다.
크레딧: CVE-2022-38694는 NCC Group의 것입니다. 도구는 TomKing062의 것입니다. 여기 있는 스크립트는 MIT 라이선스입니다. 이 스크립트는 휴대폰을 초기화합니다. 그 책임은 본인에게 있습니다.