首页
社区
课程
招聘
[原创] 初探安卓隐藏Bootloader锁
发表于: 2023-8-17 12:08 24655

[原创] 初探安卓隐藏Bootloader锁

2023-8-17 12:08
24655

做完硬件断点记录器后就开始研究如何隐藏Android的Bootloader锁了,当然最近没啥兴趣继续研究了,把目前为止的思路发出来

首先想到的一个方向是要先spoof安卓Setting里的oemlock status

在aoxpxref网站上搜索

bootloader unlocked

看到一个可疑的文件

/frameworks/base/core/java/android/service/oemlock/OemLockManager.java

xref 找到

/frameworks/base/services/core/java/com/android/server/oemlock/OemLockService.java

看到函数

可以看到Setting检测的是系统属性 ro.boot.flash.locked 来判断Bootloader是否解锁

AOSP搜索ro.boot.flash.locked,发现/system/core/init/init.cpp 有初始化该属性值的代码

ro.boot.flash.locked 的值是受到 ro.boot.verifiedbootstate 的值影响

google搜了一下后面的这个属性,发现这个属性可能的值有red,orange,yellow,green

看到一个隐藏bl锁的github项目

https://github.com/topjohnwu/Magisk/blob/3c04dab47274e9bbbfb3ddd1fcf71c929c8ed0c0/native/jni/magiskhide/hide_policy.cpp#L12

看到替换表

可以确定green是bl未解锁,还有一个 ro.boot.vbmeta.device_state 要改成locked状态,实机看这个属性解锁bl状态下是unlocked,除了前三个之外其他属性解bl之后没变

还有 googleplay service 的验证

https://developer.android.com/training/safetynet/attestation

https://developer.android.com/google/play/integrity/overview

对应的解决方案是

https://github.com/kdrag0n/safetynet-fix

这个问题不大,国内又不用googleplay service

按照上述总结一下,隐藏bl锁需要修改以下属性

Java层最终会调用native_get方法获取Property的值

顺着native_get 找到函数__system_property_find 这个是用户层标准的获取property值的函数,来自libc.so,往下翻就是android property系统的实现了,可以看这篇文章

https://bbs.kanxue.com/thread-274100.htm

进用户层初始化property service的地方

/system/core/init/property_service.cpp

找到函数 PropertyInit 从名字猜测这是init进程初始化系统基本property值的地方,ProcessBootconfigProcessKernelCmdline最后是通过读取/proc/bootconfig/proc/cmdline调用_system_property_add来设置ro.boot.verifiedbootstatero.boot.vbmeta.device_state的值

cat一下这两个设备文件,确实有相关信息

我想到了三个思路

kernel版本 5.10.168 路径/common/fs/proc/bootconfig.c 中的proc_boot_config_init 函数初始化了/proc/bootconfig的输出,顺着全局变量 xbc_data 找到系统获取bootconfig的地方/common/init/main.c -> setup_bootconfig , 可以看到bootconfig是从initrd里拿的

将返回的data copy进全局变量,然后由驱动打印出来看到数据

尝试文本替换

实验发现替换 uuid 和 vbmeta.device_state 系统正常启动,一旦修改 verifiedbootstate 系统就无法启动了,第一个思路就结束在这里了

先说结果: 成功了!!!!!!

安卓的linker使用的是mmap映射的elf文件,hook do_mmap的返回处,判断pgoff和filepath就能拦截到init进程加载libc.so,在这个时机里对_system_property_add函数下execute hook,

hook回调里对参数进行简单处理

修改成功

成功 Spoof Setting

第三个方法暂时没试过,感兴趣的可以试试看

有空就把第二个思路用kprobe来实现hook,包装成驱动连带硬件断点记录器分别开源到github上

刚入坑安卓,如有不对的地方或者有其他方法检测bl锁请大佬们在评论区指出!!!

private static final String FLASH_LOCK_PROP = "ro.boot.flash.locked";
private static final String FLASH_LOCK_UNLOCKED = "0"
 
public boolean isDeviceOemUnlocked() {
    enforceOemUnlockReadPermission();
    String locked = SystemProperties.get(FLASH_LOCK_PROP);
    switch (locked) {
        case FLASH_LOCK_UNLOCKED:
            return true;
        default:
            return false;
    }
}
private static final String FLASH_LOCK_PROP = "ro.boot.flash.locked";
private static final String FLASH_LOCK_UNLOCKED = "0"
 
public boolean isDeviceOemUnlocked() {
    enforceOemUnlockReadPermission();
    String locked = SystemProperties.get(FLASH_LOCK_PROP);
    switch (locked) {
        case FLASH_LOCK_UNLOCKED:
            return true;
        default:
            return false;
    }
}
static void export_oem_lock_status() {
    if (!android::base::GetBoolProperty("ro.oem_unlock_supported", false)) {
        return;
    }
    SetProperty(
            "ro.boot.flash.locked",
            android::base::GetProperty("ro.boot.verifiedbootstate", "") == "orange" ? "0" : "1");
}
static void export_oem_lock_status() {
    if (!android::base::GetBoolProperty("ro.oem_unlock_supported", false)) {
        return;
    }
    SetProperty(
            "ro.boot.flash.locked",
            android::base::GetProperty("ro.boot.verifiedbootstate", "") == "orange" ? "0" : "1");
}
static const char *prop_key[] =
        { "ro.boot.vbmeta.device_state", "ro.boot.verifiedbootstate", "ro.boot.flash.locked",
          "ro.boot.veritymode", "ro.boot.warranty_bit", "ro.warranty_bit",
          "ro.debuggable", "ro.secure", "ro.build.type", "ro.build.tags",
          "ro.vendor.boot.warranty_bit", "ro.vendor.warranty_bit",
          "vendor.boot.vbmeta.device_state", nullptr };
 
static const char *prop_val[] =
        { "locked", "green", "1",
          "enforcing", "0", "0",
          "0", "1", "user", "release-keys",
          "0", "0",
          "locked", nullptr };
static const char *prop_key[] =
        { "ro.boot.vbmeta.device_state", "ro.boot.verifiedbootstate", "ro.boot.flash.locked",
          "ro.boot.veritymode", "ro.boot.warranty_bit", "ro.warranty_bit",
          "ro.debuggable", "ro.secure", "ro.build.type", "ro.build.tags",
          "ro.vendor.boot.warranty_bit", "ro.vendor.warranty_bit",
          "vendor.boot.vbmeta.device_state", nullptr };
 
static const char *prop_val[] =
        { "locked", "green", "1",
          "enforcing", "0", "0",
          "0", "1", "user", "release-keys",
          "0", "0",
          "locked", nullptr };
Property Value
ro.boot.flash.locked 1
ro.boot.verifiedbootstate green
ro.boot.vbmeta.device_state locked
adb shell su -c cat /proc/bootconfig
androidboot.hardware = "qcom"
androidboot.memcg = "1"
androidboot.usbcontroller = "a600000.dwc3"
androidboot.bootdevice = "1d84000.ufshc"
androidboot.boot_devices = "soc/1d84000.ufshc"
androidboot.prjname = "22803"
androidboot.startupmode = "pwrkey"
androidboot.mode = "normal"
androidboot.product.hardware.sku = "0"
androidboot.hw_region_id = "1"
androidboot.serialno = "xxxxxxx"
androidboot.baseband = "msm"
androidboot.dtbo_idx = "12"
androidboot.dtb_idx = "1"
androidboot.force_normal_boot = "0"
androidboot.fstab_suffix = "default"
androidboot.verifiedbootstate = "orange"
androidboot.keymaster = "1"
androidboot.vbmeta.device = "PARTUUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
androidboot.vbmeta.avb_version = "1.0"
androidboot.vbmeta.device_state = "unlocked"
androidboot.vbmeta.hash_alg = "sha256"
androidboot.vbmeta.size = "23232"
androidboot.vbmeta.digest = "xxxxx"
androidboot.vbmeta.invalidate_on_error = "yes"
androidboot.veritymode = "enforcing"
androidboot.slot_suffix = "_a"
adb shell su -c cat /proc/bootconfig
androidboot.hardware = "qcom"
androidboot.memcg = "1"
androidboot.usbcontroller = "a600000.dwc3"
androidboot.bootdevice = "1d84000.ufshc"
androidboot.boot_devices = "soc/1d84000.ufshc"
androidboot.prjname = "22803"
androidboot.startupmode = "pwrkey"
androidboot.mode = "normal"
androidboot.product.hardware.sku = "0"
androidboot.hw_region_id = "1"
androidboot.serialno = "xxxxxxx"
androidboot.baseband = "msm"
androidboot.dtbo_idx = "12"
androidboot.dtb_idx = "1"
androidboot.force_normal_boot = "0"
androidboot.fstab_suffix = "default"
androidboot.verifiedbootstate = "orange"
androidboot.keymaster = "1"
androidboot.vbmeta.device = "PARTUUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
androidboot.vbmeta.avb_version = "1.0"
androidboot.vbmeta.device_state = "unlocked"
androidboot.vbmeta.hash_alg = "sha256"
androidboot.vbmeta.size = "23232"

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

最后于 2023-8-17 23:40 被cslime编辑 ,原因: 修复图片
收藏
免费 9
支持
分享
最新回复 (31)
雪    币: 2714
活跃值: (1611)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
占坑,赞
2023-8-17 13:02
0
雪    币: 5330
活跃值: (5464)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
3
2023-8-17 13:46
0
雪    币: 2484
活跃值: (3256)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
4
密钥认证了解一下
https://github.com/vvb2060/KeyAttestation
2023-8-17 15:07
0
雪    币: 3129
活跃值: (3668)
能力值: ( LV8,RANK:158 )
在线值:
发帖
回帖
粉丝
5
Ylarod 密钥认证了解一下 https://github.com/vvb2060/KeyAttestation
这个确实难过的,TEE chip里的key很难拿出来
2023-8-17 15:27
0
雪    币: 1266
活跃值: (1307)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
mark
2023-8-17 15:39
0
雪    币: 4046
活跃值: (3432)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
7
Ylarod 密钥认证了解一下 https://github.com/vvb2060/KeyAttestation
https://github.com/PaperStrike/safetynet-fix
2023-8-17 20:49
0
雪    币: 3004
活跃值: (30866)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
感谢分享
2023-8-18 09:23
1
雪    币: 1671
活跃值: (215822)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
9
tql
2023-8-18 09:44
0
雪    币: 2141
活跃值: (4522)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
StriveMario https://github.com/PaperStrike/safetynet-fix
这是通过改成不支持认证的方式来绕过的
2023-8-18 11:45
0
雪    币: 3129
活跃值: (3668)
能力值: ( LV8,RANK:158 )
在线值:
发帖
回帖
粉丝
11
Ylarod 密钥认证了解一下 https://github.com/vvb2060/KeyAttestation

删除

最后于 2023-8-18 19:14 被cslime编辑 ,原因:
2023-8-18 12:01
0
雪    币: 2484
活跃值: (3256)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
12
cslime Ylarod 密钥认证了解一下 https://github.com/vvb2060/KeyAttestation 昨天在听歌的时候想到了一个 ...
绕不过的,会生成一对密钥,私钥保存在TEE里面拿不到
2023-8-18 16:23
1
雪    币: 3129
活跃值: (3668)
能力值: ( LV8,RANK:158 )
在线值:
发帖
回帖
粉丝
13
Ylarod 绕不过的,会生成一对密钥,私钥保存在TEE里面拿不到

删除

最后于 2023-8-18 19:14 被cslime编辑 ,原因:
2023-8-18 16:31
0
雪    币: 3129
活跃值: (3668)
能力值: ( LV8,RANK:158 )
在线值:
发帖
回帖
粉丝
14

删除

最后于 2023-8-18 19:11 被cslime编辑 ,原因:
2023-8-18 16:52
0
雪    币: 4046
活跃值: (3432)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
15
小黄鸭爱学习 这是通过改成不支持认证的方式来绕过的
雀实....
2023-8-18 18:23
0
雪    币: 3129
活跃值: (3668)
能力值: ( LV8,RANK:158 )
在线值:
发帖
回帖
粉丝
16
Ylarod 绕不过的,会生成一对密钥,私钥保存在TEE里面拿不到


或许可以这样?


App层用Hook劫持密钥认证的传输层,利用重放请求来绕过设备密钥认证,密钥认证返回的请求者APP数字签名信息是来自software层,root设备可以修改software层获取到的请求者数字签名绕过防重放,这样就可以利用通过一个CVE-2022-20409提权上去的设备来做重放请求的设备


但是TEE会返回kernel的patch版本,还是会产生一些检测方向,不太理想


最理想的是受害app出现了一个代码执行漏洞,在未解BL的设备上复现受害APP的代码执行漏洞来进行请求的重放


最后于 2023-8-21 11:34 被cslime编辑 ,原因:
2023-8-21 00:26
0
雪    币: 3355
活跃值: (14008)
能力值: ( LV9,RANK:230 )
在线值:
发帖
回帖
粉丝
17
现在都在用秘钥验证 。很少用你说的这些了 。
2023-8-21 14:04
0
雪    币: 3129
活跃值: (3668)
能力值: ( LV8,RANK:158 )
在线值:
发帖
回帖
粉丝
18
珍惜Any 现在都在用秘钥验证 。很少用你说的这些了 。
重放攻击了解一下,root后的设备可以控app执行密钥认证时机的传输层,再给你另外一台未解BL的设备上重放一次
看楼上
2023-8-21 14:19
0
雪    币: 6369
活跃值: (1683)
能力值: ( LV4,RANK:156 )
在线值:
发帖
回帖
粉丝
19
bootconfig里面的state这个试着通过在内核里面hook进行修改, 结论是有些机器是可以正常开机的, 有些会panic, 有可能是vendor的驱动搞鬼? 没细究, 不过KeyAttestation确实挺麻烦的, 不对症下药不知道有什么靠谱的办法
2023-8-21 14:53
0
雪    币: 3355
活跃值: (14008)
能力值: ( LV9,RANK:230 )
在线值:
发帖
回帖
粉丝
20
cslime 重放攻击了解一下,root后的设备可以控app执行密钥认证时机的传输层,再给你另外一台未解BL的设备上重放一次 看楼上
太复杂了 哈哈哈哈  ,我现在就是不知道怎么检测shamiko 
2023-8-21 15:41
0
雪    币: 859
活跃值: (915)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
珍惜Any 太复杂了 哈哈哈哈 ,我现在就是不知道怎么检测shamiko
哈哈哈哈哈哈哈哈哈     偷偷截屏ocr分析,手机launcher有shamiko就是有
2023-8-22 09:31
0
雪    币: 3355
活跃值: (14008)
能力值: ( LV9,RANK:230 )
在线值:
发帖
回帖
粉丝
22
TrumpWY 哈哈哈哈哈哈哈哈哈 偷偷截屏ocr分析,手机launcher有shamiko就是有
这是高手
2023-8-22 09:55
0
雪    币: 2484
活跃值: (3256)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
23
bl解锁 + 没找到ksu + 没找到root = shamiko,启动!
2023-8-22 10:39
0
雪    币: 20
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
24
TrumpWY 哈哈哈哈哈哈哈哈哈 偷偷截屏ocr分析,手机launcher有shamiko就是有
有没有一种可能 shamiko没有launcher
2023-9-14 13:06
0
雪    币: 164
活跃值: (378)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
感谢楼主的分享
2023-9-14 14:59
0
游客
登录 | 注册 方可回帖
返回
//