指引如何使用CVE-2022-38694漏洞在Unisoc T606 (UMS9230)芯片组上解锁Itel S23 (S665L)的引导加载程序。
| 属性 | 值 |
|---|---|
| 品牌 | Itel |
| 型号 | S665L (S23) |
| Android 版本 | 12 (SDK 31) |
| 构建版本 | S665L-F065OPRSUVApAqAr-S-GL-20250207V533 |
| 处理器 | Unisoc T606 (UMS9230) |
| CPU | 2x Cortex-A75 + 6x Cortex-A55 (ARMv8, 64位) |
| 存储 | UFS |
| 分区方案 | A/B |
adb 和 fastbootubl-itel-s23/
├── README.md
├── CLAUDE.md
├── recovery/
│ ├── TWRP_S665L.img # TWRP恢复镜像
│ └── OrangeFox_S665L.img # OrangeFox恢复镜像
└── tools/
└── spreadtrum_flash_linux/
├── spd_dump # BootROM通信工具
├── gen_spl-unlock # 解锁载荷生成器
├── unlock.sh # 自动解锁脚本
├── fdl1-dl.bin # 第一阶段加载器
├── fdl2-dl.bin # 第二阶段加载器
├── fdl2-cboot.bin # 用于解锁的修改版uboot
├── custom_exec_no_verify_65015f08.bin # CVE漏洞利用载荷
├── custom_exec_no_verify_65015f48.bin # CVE漏洞利用载荷(备用)
├── splloader.bin # SPL备份(过程中生成)
├── uboot.bin # uboot备份(过程中生成)
├── spl-unlock.bin # 解锁载荷(过程中生成)
└── ums9230/itel/ # Itel UMS9230的FDL二进制文件
该漏洞利用利用了Unisoc BootROM中的一个缺陷,允许在签名验证完成之前将数据写入内存区域。
正常流程: BootROM → 验证(FDL1) → 拒绝(未签名)
漏洞流程:BootROM → 覆盖 verify() → verify = 始终返回真
→ 接受(FDL1) → 接受 → 解锁引导加载程序
custom_exec_no_verify 载荷(96字节)覆盖了地址 0x65015f08 处的签名验证函数指针,导致BootROM接受任何FDL1而无需检查其签名。
sudo tee /etc/udev/rules.d/51-android.rules << 'EOF'
# Google/Android (ADB & Fastboot)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", MODE="0666", GROUP="plugdev"
# Spreadtrum/Unisoc
SUBSYSTEM=="usb", ATTR{idVendor}=="1782", MODE="0666", GROUP="plugdev"
EOF
sudo udevadm control --reload-rules && sudo udevadm trigger
cd tools/spreadtrum_flash_linux
cp ums9230/itel/fdl1-dl.bin ums9230/itel/fdl2-dl.bin ums9230/itel/fdl2-cboot.bin .
cp ums9230/custom_exec_no_verify_65015f08.bin ums9230/custom_exec_no_verify_65015f48.bin .
chmod +x spd_dump gen_spl-unlock
手机必须开机并通过USB连接。此步骤完成后,手机将无法启动,直到步骤6。
sudo ./spd_dump exec_addr 0x65015f48 fdl fdl1-dl.bin 0x65000800 \
fdl fdl2-dl.bin 0x9efffe00 exec \
r splloader r uboot e splloader e splloader_bak reset
将 splloader.bin 和 uboot.bin 备份到安全位置:
cp splloader.bin uboot.bin backup_spl/
./gen_spl-unlock splloader.bin 0xfd28
输出:spl-unlock.bin
偏移量
0xfd28特定于此固件。请检查splloader.bin的大小——偏移量应与文件大小匹配。
进入BROM模式:关闭手机,按住 音量减 键,然后插入USB。
sudo ./spd_dump exec_addr 0x65015f08 fdl fdl1-dl.bin 0x65000800 \
fdl fdl2-dl.bin 0x9efffe00 exec \
w uboot fdl2-cboot.bin reset
再次进入BROM模式,然后:
sudo ./spd_dump exec_addr 0x65015f08 fdl spl-unlock.bin 0x65000800
如果看到 device removed, exiting... 则表示成功。
再次进入BROM模式,然后:
sudo ./spd_dump exec_addr 0x65015f08 fdl fdl1-dl.bin 0x65000800 \
fdl fdl2-dl.bin 0x9efffe00 exec \
verbose 2 read_part miscdata 8192 64 m.bin reset
recv 64 zero = 仍处于锁定状态(失败)recv 32 string + hash data = 已解锁(成功)再次进入BROM模式,然后:
sudo ./spd_dump exec_addr 0x65015f08 fdl fdl1-dl.bin 0x65000800 \
fdl fdl2-dl.bin 0x9efffe00 exec \
w splloader splloader.bin w uboot uboot.bin reset
手机将重启。当Android恢复界面出现时,选择恢复出厂设置。
手机启动进入Android系统后:
adb shell getprop ro.boot.vbmeta.device_state
# 期望输出: unlocked
adb shell getprop ro.boot.flash.locked
# 期望输出: 0
splloader.bin 和 uboot.bin——如果出现问题,它们用于恢复0x65015f48,步骤3-6使用 0x65015f08spd_dump / CVE-2022-38694 解锁引导加载程序 由 TomKing062 / QuTick102 开发 https://github.com/TomKing062/CVE-2022-38694_unlock_bootloader
恢复镜像合集 & Spreadtrum Flash Tool (Linux) 由 Massatriof16 提供 https://massatriof16.github.io/recovery-collections/#alat
unisoc-unlock(Python替代工具) 由 patrislav1 开发 https://github.com/patrislav1/unisoc-unlock