Android Verified Boot 2.0简要

摘要:
公钥被编译到bootloader中以验证vbmeta数据。vbmeta。img包含应该由公钥验证的签名。与avb1.0中的veritykey类似,此公钥用于验证系统、供应商分区和引导分区。当引导加载程序启动时,它将验证两个分区。一种是使用OEM密钥验证vbmeta。img,另一个是使用vbmeta。img中包含的公钥验证启动分区,而系统/供应商分区由init/fs_Mgr确定。A/B系统AVB1.0后备箱。img=内核+ramdisk+签名,使用OEM密钥验证引导img的签名有效性。主vbmeta分区将启动分区的哈希存储在哈希描述符中。对于系统和供应商分区,哈希表位于文件系统后面,主vbmeta分区在哈希描述符中存储哈希表的根哈希、salt和偏移量。

AVB2.0被用于启动引导,此用法添加一个“vbmeta.img”镜像。public key被编译到bootloader中用于校验vbmeta数据,vbmeta.img包含应由此public key验证的签名。

vbmeta.img包含用于验证的public key,但只有bootloader验证过vbmeta.img才会可信,就好比认证一样,包含可信public key和签名。

Android Verified Boot 2.0简要第1张Android Verified Boot 2.0简要第2张

因此,我们在AVB中有两个重要key,一个验证vbmeta.img的OEM key,一个验证其他分区(boot/system/vendor)的verity key。当然可以使用OEM key作为verity key。

我们知道OEM key用于在bootloader阶段验证vbmeta.img。这还不够,我们必须验证其他分区,vbmeta.img包含的public key用于此目的。就像avb1.0中verity key一样,此public key用于验证system、vendor分区和boot分区。这里有些不同之处,avb1.0使用OEM key验证boot分区,使用verity key验证system/vendor分区,但avb2.0使用OEM key验证vbmeta.img,并使用其中包含的public key验证其他分区(system/vendor/boot等)。

Non-A/B system

AVB1.0

Android Verified Boot 2.0简要第3张

AVB2.0

正如我们上面所说,avb2.0使用OEM key来验证vbmeta.img,并使用其中所包含的public key验证其他分区。启动时bootloader将验证两个分区,一个是使用OEM key验证vbmeta.img,一个是使用vbmeta.img所包含的public key验证boot分区,而system/vendor分区由init/fs_mgr来验证(使用vbmeta.img所包含的public key)。

A/B system

AVB1.0

Android Verified Boot 2.0简要第4张

boot.img=kernel + ramdisk + signature,使用OEM key验证boot.img的signature合法性。

AVB2.0

Android Verified Boot 2.0简要第5张

VBMeta结构

AVB中使用的中心数据结构是VBMeta结构,此数据结构包含多个描述符(和其他元数据),并且所有这些数据都被加密签名。描述符用于image哈希、image哈希表元数据和所谓的链式分区。

Android Verified Boot 2.0简要第6张

其中主vbmeta分区在哈希描述符中保存boot分区的哈希,对于system和vendor分区,哈希表在文件系统之后,主vbmeta分区在哈希表描述符中保存哈希表的root hash、salt和offset。因为vbmeta分区中的vbmeta结构是以密码方式签名的,所以bootloader可以检测签名,并验证它是有key0的所有者(例如,通过嵌入key0的公共部分)创建的,从而信任于boot、system和vendor。

链式分区描述符用于委托权限——它包含委托权限的分区名称以及该特定分区上的签名所信任的public key。

Android Verified Boot 2.0简要第7张

在这个设置中,xyz分区有一个完整性检查的哈希表,在哈希表后面是一个vbmeta结构,它包含带有哈希表元数据(root has、salt和offset等),这个结构用key1签名的。最后,在此分区的末尾是一个页脚,它具有vbmeta结构的offset。

此设置允许bootloader使用链分区描述符来查找分区末尾的页脚(使用链分区描述符中的名称),有助于帮助找到xyz分区的vbmeta结构并验证是否由key1签名的(保存在链式分区描述符中的key1 public key)。至关重要的是,因为有一个带offset的页脚,所以可以更新zyz分区,而不需要vbmeta分区进行任何更改。

参考:https://android.googlesource.com/platform/external/avb/+/master/README.md#The-VBMeta-struct

免责声明:文章转载自《Android Verified Boot 2.0简要》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇ios基础笔试题-集锦二Burpsuite内部的cookie处理机制下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

快速编译system.img和boot.img的方法

快速编译system.img,可以使用这个命令: #make systemimage  快速编译boot.img,可以使用以下命令: #make bootimage  快速编译userdata.img,可以使用以下命令: # make userdataimage-nodeps 但是,对于bootimage, 在不改变内存布局的情况下,可以使用以下命令: #...

[转]C# 将类的内容写成JSON格式的字符串

将类的内容写入到JSON格式的字符串中 本例中建立了Person类,赋值后将类中内容写入到字符串中 运行本代码需要添加引用动态库Newtonsoft.Json 程序代码: using System; using System.Collections.Generic; using System.Linq; using System.Text; using S...

C# 禁止windows程序重复运行的两种基本方法

一般的如果运行一个软件、让他处于运行状态,然后我们再去打开这个程序时就会提示我们“程序已启动或者不能重复启动此程序”,比如QQ对战平台 ,就限制一台机子启动两个QQ对战平台,那么他在C#中是如何实现的呢? 一般有两种方法,我是用的是第一种 方法1: 在项目的第一个窗体的启动事件中 如form1_load() 中添加如下语句=================...

系统禁用执行FIPS政策导致程序发生“调用的目标发生了异常”

工具是使用AES-256-CBC加密算法  问题 最近有客户反映, 在使用我们工具时候,会出现“调用的目标发生了异常”错误, 接到反馈之后, 我们进行了很多测试,甚至得到客户系统信息和framework版本, 但是都没有得到复现。测试,debug,log打印各种尝试,无果。 **报错信息显示:**  导致错误信息 : 调用的目标发生了异常。 导致错误的方法...

C# 与 SQLite的操作

1、通过Add References引用SQLite ADO .NET安装目录的bin目录下的System.Data.SQLite.DLL。 2、创建数据库文件:因为始终是个0字节文件,应该利用IO也可以(?!)。 System.Data.SQLite.SQLiteConnection.CreateFile(datasource);3、连接数据库 Syst...

Python基础:映射(字典)

一、概述 映射类型(Mapping Types)是一种关联式的容器类型,它存储了对象与对象之间的映射关系。 字典(dict)是Python中唯一的映射类型,它是存储了一个个 键值对(由 键 映射到 值)的关联容器。其中,键(key)必须是可哈希的Python对象,而 值(value)可以是任何Python对象。在功能上,Python中的字典类似于C++中...