android8 avb检验,android avb(Android Verified Boot)验证-程序员宅基地

技术标签: android8 avb检验  

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

avb的作用

验证程序用来保护用户使用软件在设备上运行的完整性。它通常从设备固件的只读部分开始,该部分加载代码并仅在密码验证代码是真实的且没有任何已知的安全缺陷之后执行。AVB是经过验证的引导的一种实现。

The VBMeta struct

AVB中使用的中心数据结构是VBMeta struct,这个数据结构包含许多描述符(和其他元数据),所有这些数据都是加密签名的。描述符用于img哈希表、img哈希树元数据和所谓的链式分区。一个简单的例子是:

52ca990e3656a0451171b3883b65b176.png

vbmeta分区在哈希描述符中保存引导分区的哈希。对于system分区 vendor分区的hashtree遵循文件系统数据,vbmeta分区在哈希树描述符中保存哈希树的根哈希、salt和偏移量。因为VBMeta分区中的VBMeta结构是加密签名的,引导加载程序可以检查签名并验证它是由key0的所有者创建的(例如,通过嵌入key0的公共部分),从而信任用于boot, system, and vendor。

一个链式分区描述符用于授权-它包含授权所在分区的名称,以及这个特定分区上签名所信任的公钥。例如,考虑以下设置:

ea6046c1ab26de8366536eec77a021e7.png

在这个设置中,xyz分区有一个用于完整性检查的哈希树.在hashtree之后是一个VBMeta结构,它包含带有hashtree元数据的hashtree描述符(根散列、salt、偏移量等),这个结构使用key1签名。最后,在分区的末尾是一个页脚,它具有VBMeta结构的偏移量。

这个设置允许引导装载程序使用链式分区描述符找到页脚的分区(使用链中的分区描述符的名称),轮流帮助定位VBMeta结构,并验证它是由key1签署(使用存储在链key1_pub分区描述符)。至关重要的是,因为有一个带有偏移量的页脚,所以xyz分区可以在vbmeta分区不需要任何更改的情况下进行更新。

VBMeta结构足够灵活,可以允许任何分区的散列描述符和散列树描述符驻留在VBMeta分区、用于完整性检查的分区(通过链分区描述符)或任何其他分区(通过链分区描述符)中。这允许广泛的组织和信任关系

回滚的保护(Rollback Protection)

AVB包含回滚保护,用于防止已知的安全缺陷。每个VBMeta结构都有一个回滚索引,如下所示:

783127caf5dd8b42752551244d508179.png

这些数字称为rollback_index[n],随着安全缺陷的发现和修复,每个映像的值都会增加。此外,该设备存储最后看到的回滚索引在篡改明显的存储

dd7b188d735df67a759b2f5f56e42d9b.png

这些被称为stored_rollback_index[n]

回滚保护是让设备拒绝一个镜像,除非rollback_index[n] >= stored_rollback_index[n]针对所有n,并让设备随着时间增加stored_rollback_index[n]。更新存储的回滚索引一节将详细讨论如何实现这一点。

A/B Support

AVB被设计用于处理A/B,它要求在存储在描述符中的任何分区名称中永远不要使用A/B后缀。下面是一个有两个插槽的例子:

233c6475497af9c9f484285b675db1e3.png

注意回滚索引在插槽之间的差异——对于插槽A,回滚索引是[42,101],对于插槽B,它们是[43,103]。

在版本1.1或更高版本中,avbtool支持——do_not_use_ab用于add_hash_footer和add_hashtree_footer操作。这使得处理不使用a /B且不应该有前缀的分区成为可能。这对应于AVB_HASH[TREE]_DESCRIPTOR_FLAGS_DO_NOT_USE_AB标志。

The VBMeta Digest(VBMeta摘要)

VBMeta Digest是所有VBMeta结构的Digest,包括根结构(例如在VBMeta分区中)和链分区中的所有VBMeta结构。这个 Digest可以在构建时使用avbtool calculate_vbmeta_digest计算,也可以在运行时使用avb_slot_verify_data_calculate_vbmeta_digest()函数计算,它在内核命令行上也设置为androidboot.vbmeta。要了解详细信息,请参阅avb_slot_verify()文档。

这个Digest可以与libavb一起在加载的操作系统的用户空间中使用,以验证加载的vbmeta结构的真实性。对启动阶段的root-of-trust 和 / 或者 回滚索验证引非常有利。

此外,VBMeta digest 包含使用密钥认证验证硬件支持的密钥对(Verifying hardware-backed key pairs with Key Attestation)依赖方可以提取digest,并将其与已知良好操作系统的digest列表进行比较,如果找到这些digest,则可以对应用程序所运行的设备提供额外的保证。

工具和库

avbtool and libavb

avbtool的主要工作是创建vbmeta.img。此image被设计成进入vbmeta分区(如果使用A/B,则进入讨论插槽,例如vbmeta_a或vbmeta_b),并具有最小的尺寸(for out-of-band updates)。vbmeta映像是加密签名的,包含用于验证引导的验证数据(例如,cryptographic digests) 用于验证boot.img, system.img 和其他分区镜像

vbmeta映像还可以包含对存储验证数据的其他分区的引用,以及指示谁应该签署验证数据的公钥。这种间接性提供了授权,也就是说,它允许第三方通过在vbmeta.img中包含他们的公钥来控制给定分区上的内容,根据设计只需更新vbmeta就可以轻松撤销此权限。为有问题的分区提供了新的描述符。也就是说vbmeta.img 包含了其他分区的验证数据,只要更新vbmeta就能够解决验证问题。

通过avbtool工具能够完成各个imge的验证数据放到vbmeta中存储。

除了avbtool之外,还提供了一个库libavb。这个库在设备端执行所有验证,例如,它首先加载vbmeta分区,检查签名,然后boot partition分区进行验证,这个库用于bootloader还包括Android。它对系统依赖性(参见avb_Sysdeps.h)以及boot loader或OS预期要实现的操作(参见avb_Ops.h)有一个简单的抽象。验证的主要入口点是avb_slot_verify()。

文件和目录

libavb/

image 验证的实现。此代码被设计为高度可移植性,因此可以在尽可能多的上下文中使用。这段代码需要一个兼容c99的C编译器,此代码的一部分被认为是实现的内部代码,不应该在实现外部使用。例如,avb_rsa.[ch]和avb_sha.[ch]文件。平台预期提供的系统依赖项在avb_Sysdeps.h中定义。如果平台提供标准的C运行时avb_Sysdeps_Posix.c,则可以使用。

libavb_atx/

用于验证公钥元数据的android-things扩展

libavb_user/

包含适用于Android用户空间的AVBOPS实现。这在boot_control.avb和avbctl中使用

libavb_ab/

botoloader 中 A/B的实现。注意:此代码不推荐使用,您必须定义

AVB_AB_I_UNDERSTAND_LIBAVB_AB_IS_DEPRECATED使用。

boot_control/

Android引导控制HAL的一种实现,用于使用实验libavb_a b A/B堆栈的botolaoder。

contrib/

包含其他项目中与AVB互操作所需的补丁。例如,contrib/linux/4.4有linux ke

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_29091445/article/details/117627786

智能推荐

c#中@标志的作用 C#通过序列化实现深表复制 细说并发编程-TPL 大数据量下DataTable To List效率对比 【转载】C#工具类:实现文件操作File的工具类 异步多线程 As...-程序员宅基地

文章浏览阅读340次。c#中@标志的作用参考微软官方文档-特殊字符@,地址https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/tokens/verbatim1、在变量名前加@,可以告诉编译器,@后的就是变量名。主要用于变量名和C#关键字重复时使用。string[] @for = { "John"..._directory.exists(@"record/")) @作用

国内镜像下载python文件_urllib3下载-程序员宅基地

文章浏览阅读1.6k次。一、可以使用的库阿里云:http://mirrors.aliyun.com/pypi/simple/清华:https://pypi.tuna.tsinghua.edu.cn/simple/中国科技大学 https://pypi.mirrors.ustc.edu.cn/simple/华中理工大学:http://pypi.hustunique.com/山东理工大学:http://pypi.sdutlinux.org/豆瓣:http://pypi.douban.com/simple/..._urllib3下载

Oracle常用性能监控语句解析-程序员宅基地

文章浏览阅读64次。转:http://www.cnblogs.com/preftest/archive/2010/11/14/1876856.html1、监控等待事件select event,sum(decode(wait_time,0,0,1)) prev, sum(decode(wait_time,0,1,0)) curr,count(*)from v$session_waitgroup by event ..._oracle服务器监控读写各方面性能

RabbitMQ-C初探_-llibrabbitmq-程序员宅基地

文章浏览阅读1.1k次。http://blog.csdn.net/cnhome/article/details/9222833 RabbitMQ着实是个好东西,当然了也有对C语言client开发的支持。例子和文档少的可怜,只能去项目里去查看example来理解,简单整理了一些,以免走些弯路。主要是在版本对应上,这点就没Maven好了,只能对好类库和例子。接下来我们简单看看需要的东东。环境:Ubuntu_-llibrabbitmq

jquery日历多选日期插件-程序员宅基地

文章浏览阅读379次。jQuery日历插件支持自定义样式颜色多选单选日历告别切换状态重置。_jquery日历多选

使用秘钥对登录Linux系统-程序员宅基地

文章浏览阅读414次。一,用密码登录系统,可能由于密码的简单或者其他原因造成被其他人登录,这样服务器可是很不安全的,为此我们可以使用秘钥登录系统。二,1,设置密钥对前,我们需要下载一个工具https://the.earth.li/~sgtatham/putty/latest/x86/puttygen.exe 用pageant.exe 这个工具生成密钥对。单击Generate ,让其生成密钥对..._秘钥对怎么登陆

随便推点

Codeforces Round #664 (Div. 2)C. Boboniu and Bit Operations(思维+dp)-程序员宅基地

文章浏览阅读171次。题目链接点这里!!题目大意:对a中的每一个数在b中选一个数进行&运算得到c,最后将所有c|运算,要求尽量小。思路:第一次看到这个的时候能想到的就是dp了,因为每次选取的数即使大最后或运算后也可能小,所以贪心是肯定不行的。那么就开始考虑状态,影响我们做决策的是什么因素,就是上一个ai和哪个bj结合,那么我们能确定他要和哪个结合吗?不能,因为或运算的缘故我们不能保证无后效性。那么我们就要考虑将所有可能状态保存下来,考虑设计一个能判断某个数字存不存在的状态。很明显a和b最大2^9,最大也就是511_codeforces round #664 (div. 2)c

计算机组装备课比赛,全国新华杯青年教师素养大赛一等奖计算机组装与维护公开课教案.doc...-程序员宅基地

文章浏览阅读180次。理实一体化课程教学过程JWC001-3-2 第 PAGE 3页版本/状态:C/0理实一体化课程教案(首页)JWC001-3-1 课程名称模块名称计算机组装基础知识任教班级12信息班任务序号及名称计算机常见故障及排除教学场所组装室知..._教学能力大赛 计算机组装与维护硬件组装部分教案

【ybtoj高效进阶6-4-2】方案统计【卢卡斯定理】_组合数学 方案统计-程序员宅基地

文章浏览阅读118次。【ybtoj高效进阶6-4-2】方案统计题目大意:给定 n,m 求Cnm mod 10007C_{n}^{m}\bmod 10007Cnm​mod10007的值。思路:n,m的范围都比 10007 大,使用卢卡斯定理Cnm=Cn/pm/p∗Cn mod pm mod pC_{n}^{m}=C_{n/p}^{m/p}*C_{n\bmod p}^{m\bmod p}Cnm​=Cn/pm/p​∗Cnmodpmmodp​不会卢卡斯定理的 戳这里这是一道比模板题还模板题的题。代码:#include&_组合数学 方案统计

tensorflow c++推理,如何为input tensor赋值?-程序员宅基地

文章浏览阅读3.6k次。tensorflow是个强大的数值计算工具,同时也是强大的深度学习工具.当我们在用c++ api做推理的时候,如何将数据输入tensorflow, 有时候会感到迷惑,本文以图像分类为例子,做简单的说明:我们还是以tensorflow examples中的label_image为例子进行说明.在例子中,main.cc用了ReadTensorFromImageFile函数从jpeg文件中解码并赋值..._input tensor

指针数组作为函数参数的传递_指针数组作为参数在函数间传参-程序员宅基地

文章浏览阅读6.5k次,点赞3次,收藏12次。指针数组作为函数参数的传递想了解指针数组作为函数参数传递,就必须清楚指针数组的概念,指针数组是一个一维数组,存放的是(int、char、short、long、double、float)+*的内容,也即数组中的每个元素存放的是一个地址。了解了指针数组的本质后,想要将指针数组作为函数的参数进行传递就类似于一位普通数组的传递方法,将数组名作为数组的首元素地址进行实参传递,在形参接实参的时候要注意指针..._指针数组作为参数在函数间传参

利用SpringSecurity实现权限管理_使用springsecurity实现管理员和员工-程序员宅基地

文章浏览阅读3.4k次,点赞4次,收藏7次。1. 数据库中的表结构用户表(userinfo):角色表(role):用户和角色的关系表(user_role):2. 添加SpringSecurity的依赖包在项目的pom.xml中的properties标签中添加如下代码:<spring.security.version>5.0.1.RELEASE</spring.security.version>在..._使用springsecurity实现管理员和员工