利用 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 → verify(FDL1) → 拒绝(未签名)
漏洞利用:BootROM → overwrite verify() → verify = always_true
→ accept(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 工具(Linux) 作者 Massatriof16 https://massatriof16.github.io/recovery-collections/#alat
unisoc-unlock(Python 替代方案) 作者 patrislav1 https://github.com/patrislav1/unisoc-unlock