通过 CVE-2022-38694 解锁 ZTE Blade V40 Vita(P606F02 / Unisoc UMS9230 / UFS)引导加载程序 - Linux 脚本、FBE 解锁后卡死修复,以及无人记录的两个陷阱
使用 CVE-2022-38694 进行解锁的 Linux 笔记和脚本。在我的 EEA_P606F02 上完成,运行 MyOS11.0.13_8045_EEA。
有两件事决定这是否可行,而这两件事都没有被记录在任何地方:
SEND fdl2-dl.bin → connection closed)。只按住 VOL_UP + VOL_DOWN。如果需要复位,轻按一次 POWER。misc 擦除 BCB 不起作用 — 此 bootloader 会忽略它。改为通过 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。错误的 loader 可能会清空手机 |
| 操作系统 / 分区 | 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 步显示全为零,请重新运行第 4 步。
第 3 步会使手机无法启动 Android(该 payload 并不是真正的 bootloader)——第 6 步会把你原厂的 uboot_bak.bin 恢复回去。不要在中途停下。
trustos 中的 FBE 密钥与锁定状态绑定,因此 /data 永远无法挂载。清除数据是必须的:
sudo /path/to/repo/scripts/fix-post-unlock-hang.sh
按住音量键,它会自动重新进入等待状态,直到捕获 BROM。擦除 userdata + metadata,
写入 BCB,然后重启。第三次尝试时捕获成功,耗时不到一分钟。
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 boot 镜像需要先对其 Magisk 输出重新签名,然后才能刷入。经过测试的 Windows 原厂刷机、AVB 签名和恢复流程见 docs/windows-flash-root.md。即使把 boot 镜像刷坏,BROM 仍然可用。分区映射见:docs/partition-table.md。
重新锁定: 可行(通过 BROM 将 miscdata 令牌清零),但对安全性毫无意义——
BootROM 漏洞是永久性的,任何人都可以用同样的步骤重新解锁。
致谢:CVE-2022-38694 由 NCC Group 发现。工具来自 TomKing062。 此处的脚本采用 MIT 许可。它会清空你的手机数据;后果由你自行承担。