patch_do_cboot‐SPL_zh - TomKing062/CVE-2022-38694_unlock_bootloader GitHub Wiki

SPL 仅能在 (没有触发按键,所有验证失败的)备用u2s下载模式中启动(人话:擦掉储存中的splloader)。


第 1 部分:修改 FDL1,将修改后的 fdl1 保存为 fdl1-dl.bin

按照程序顺序寻找,如图,从 _startreset 再到 main(sub_10218)

image

这里我们看到一系列函数注册,#4 是 data_exec(sub_10094),现在NOP(1F 20 03 D5)函数中的验证。 data_exec

第 2 部分:修改 FDL2(uboot/lk)

2.1 补丁 1:do_cboot()

set_lock_status()

搜索 VerifiedBoot-UNLOCK 以找到 set_lock_status

set_lock_status() 函数后面第一个函数就是 get_lock_status() 函数。

部分厂商(如:ZTE TECNO BBK)会修改 set_lock_status() / get_lock_status() 来禁止 bootloader 解锁

do_download()、dl_powerdown_device()、power_down_devices()、do_cboot()

无 autodloader 功能的 uboot/lk:搜索 do_download 找到 do_download,能够看到一系列函数注册,#0x17 是 dl_powerdown_device()

image

有 autodloader 功能的 uboot/lk:搜索 download mode 找到 download_handler,或搜索 reply exec act as Romcode 来查找 autodloader_handlerdownload_handlerautodloader_handler 都会调用 do_download_common,在 do_download_common 中能够看到一系列函数注册,#0x17 是 dl_powerdown_device()

image

在 dl_powerdown_device() 中找到 00 00 00 14 (即while 1),while 1 之前的函数是 power_down_devices()。

image

检查 power_down_devices() 的 被调用 列表,通常第一个调用 power_down_devices() 的函数就是 do_cboot(),记住 do_cboot() 中该代码块的地址。

image

补丁:

示例:a9/a10 和一些没有用 vab 布局的 a11(+)

image

示例:a11(+) 且使用 vab 布局:需要在 boot_env_check(检查#0x104参数的语句)之后进行修改

image

2.2 Patch 2:删除(NOP)安全分区的写入检查

搜索 sml,在搜索结果中,找到类似 LDR Xm, [Xn],#8 ; "sml"的代码,修补此函数,禁用检查,让这个函数任何情况都return 1

_check_secure_part

2.3 保存文件

将补丁 1 应用于原始 FDL2,另存为 fdl2-cboot.bin,将补丁 2 应用于原始 FDL2,另存为 fdl2-dl.bin。

第三部分:修改SPL,将修改后的spl保存为spl-unlock.bin

旧类型

nand_boot_1

spl加载镜像A B C D并验证,如果验证失败,则从A_bak B_bak C_bak D_bak重新加载A B C D并再次验证。

nand_boot_2

(修改BL secboot_initB loc_F230,0xF230是BL update_swVersion之后CMP W19, WZR的地址)

因此修补了nand_boot,读取分区后跳过验证,直接执行。

新类型

删除 signcheck() 和 signcheck() 的结果检查

image

nand_boot() 中通常有 4 个 signcheck()

最后一步:准备解锁命令

1.(正常下载)发送 fdl1-dl.bin,发送 fdl2-dl,将 fdl2-cboot 写入 uboot,擦除 splloader

2.(回退下载)发送 spl-unlock.bin

3.(回退下载)发送 fdl1-dl.bin,发送 fdl2-dl,写回官方uboot,写回官方splloader,擦除用户数据。