Android Verified Boot浅知分享

展示

从开机的时候,看提示,进入验证启动认知:

图片发自App
图片发自App


流程:

图片发自App

目的

保护系统的安全性。

涉及的范围:从受硬件保护的信任根到引导加载程序,再到启动分区和其他已验证分区(包括 system、vendor 和可选的 oem 分区)的完整信任链。

实现的方式:

1.在设备启动过程中,无论是在哪个阶段,都会在进入下一个阶段之前先验证下一个阶段的完整性和真实性

2.检查是否存在内置了回滚保护的正确 Android 版本

3. Android 设备将其完整性状态传达给用户

理解框架

图片发自App

实战

前言

图片发自App

* Android P + kernel-4.4 or kernel-3.18

- download preloader with verified boot disabled which location is the same as scatter file //preloader__SBOOT_DIS.bin

- adb root

- adb disable-verity

- adb reboot

- adb root

- adb remount

* Android P + kernel-4.9 or after

- download preloader with verified boot disabled which location is the same as scatter file. //preloader__SBOOT_DIS.bin

- boot to Home Screen

- go to setting -> system -> Developer options -> OEM unlocking

- adb reboot bootloader

- fastboot flashing unlock

- press volume up key

- fastboot reboot

- adb root

- adb disable-verity

- adb reboot

- adb root

- adb remount

实例一:

效果展示:

图片发自App


代码分析:

图片发自App


快速验证方法:

图片发自App


adb shell验证:

getprop ro.oem_unlock_supported

1---代表打开

0---代表关闭

图片发自App

通过如下操作:

- adb reboot bootloader

- fastboot flashing unlock

- press volume up key

- fastboot reboot

之后:

adb shell

解锁成功后检查这两个属性会从

[ro.boot.flash.locked]: [1]

[ro.boot.verifiedbootstate]: [green]

变成

[ro.boot.flash.locked]: [0]

[ro.boot.verifiedbootstate]: [orange]

补充:

ro.boot.flash.locke在哪里进行改变的?

开机启动过程。具体为system/core/init/init.cpp

main(int argc, char** argv) {

·····

export_oem_lock_status();

·····

}

export_oem_lock_status(){

if (!android::base::GetBoolProperty("ro.oem_unlock_supported", false)) {

        return;

    }

    std::string value = GetProperty("ro.boot.verifiedbootstate", "");

    if (!value.empty()) {

        property_set("ro.boot.flash.locked", value == "orange" ? "0" : "1");

    }

}

实例二:

效果展示:

图片发自App

怎么让禁止解锁变成可以解锁的状态?

代码分析为什么变成禁止解锁状态?

图片发自App


具体方法:

1.直接操作/data/system/users/0.xml中的值:

UserManagerService.java中有对/data/system/users/0.xml进行处理

eg:

灰色的值:

   


正常的值:

   

即:

adb root

adb pull /data/system/users/0.xml 本地路径

修改0.xml中的值

adb push 本地修改之后的文件 /data/system/users/

adb reboot

就可以满足要求

2.代码实现的方式:

修改配置文件

UserManagerService.java的构建方法中:

UserManagerService(......)-->readUserListLP()--->fallbackToSingleUserLP()

详解:

fallbackToSingleUserLP(){

***********

Bundle restrictions = new Bundle();

        try {

            final String[] defaultFirstUserRestrictions = mContext.getResources().getStringArray(

                    com.android.internal.R.array.config_defaultFirstUserRestrictions);

            for (String userRestriction : defaultFirstUserRestrictions) {

                if (UserRestrictionsUtils.isValidRestriction(userRestriction)) {

                    restrictions.putBoolean(userRestriction, true);

                }

            }

        } catch (Resources.NotFoundException e) {

            Log.e(LOG_TAG, "Couldn't find resource: config_defaultFirstUserRestrictions", e);

        }

********

}

原生为:

frameworks/base/core/res/res/values/config.xml

   

gms包中overlay为:

gms_overlay/frameworks/base/core/res/res/values/config.xml

    "no_oem_unlock"

   

参考学习

https://source.android.com/security/verifiedboot/index.html

https://source.android.com/security/verifiedboot/verified-boot.html

https://source.android.com/security/verifiedboot/dm-verity.html

https://gitlab.com/cryptsetup/cryptsetup/wikis/DMVerity

https://blog.csdn.net/sinat_34606064/article/details/77920700

你可能感兴趣的:(Android Verified Boot浅知分享)