AVB源码学习(二):Uboot阶段AVB2.0校验流程

简介: AVB源码学习(二):Uboot阶段AVB2.0校验流程


1、avb正确启动流程

因为google对UBOOT或者UEFI阶段的AVB校验是没有标准的,各厂家都可以进行定制。虽然没有标准,但是google给出了建议的启动流程,各芯片厂家一般都会向这个靠齐。google建议的启动流程图如下:

(终于学会去水印了)

没怎么搞过AVB的同学,看到这张图,估计也不大清楚google想表示啥。我琢磨过一阵子,撸过相关的code,这里就给大家讲一下我的理解,一步步来分解一下。(感激)

1、Device Lock设备上锁

第一个遇到的是“Is Device Locked”,判断设备是否为locked上锁状态,意思是出厂的手机最好建议是上过锁的,如果没有上锁就warning告知一下用户。

那什么是上锁? 上锁有什么用? 是怎么上锁的?

一般OEM厂商最后产线出去的手机,可能会对设备进行上锁操作。上锁后,这台设备后续基本不大可能会被刷机了(概率词语),刷机工具会去判断这条设备是否上过锁,如果是上锁的状态,对不起请先解锁。

那怎么解锁类,OEM厂商的操作方式不一定一样,比如维修的时候提供fastboot功能等进行解锁,我这里只是说了一种可能性,实际上各家的方法不一定一样。

那这个上锁是怎么操作的?

一般是采用将数据写入到EMMC或者UFS中的RPMB分区(这里我曾写过,可以看一下),上锁的流程又有可能是通过TEE侧去操作的,REE侧是不知道怎么上锁的(这个我也写了哦)。

这样就把实现的细节全部屏蔽掉了,烧录工具烧录时判断是否上锁以及解决,也是走这个通路。

如果没有上锁,google建议界面显示橙色,提示用户当前设备没有上锁,可能不够安全,但一般不影响继续启到kernel阶段。

好了,Device Lock就介绍到这。

2、Valid Os found

accept verification errors and any of trust,这个是图中的括号里的,咋一看不知道这个在讲什么。

其实也比较简单,就是检察vbmeta.img是否合法,检查vbmeta的header信息中是否有“AVB0”开头,是否有预置public key等,就是check这些内容,如果没有通过,设置了verify flag的话就直接启动失败。

3、Was the root of trust set by the user

这个又是啥玩意,怎么跟user用户有关了? 其实这是google提供的很好的方法,就是我这台google设备并不是最终产线出去的,但我又想用这个AVB验证功能,所以就提供了另一种方法,可以让用户自己设置key。但是如果使用的是用户设置的key,建议给个黄色的界面进行warning提醒,毕竟不是OEM厂商签名发出的版本嘛。

4、Update rollback

什么是rollback,其实就是回滚。这里的意思是更新回滚,为什么要更新回滚?是因为android版本也会有漏洞,google会定期的发布安全补丁。

如果有人想使坏,使用没有打安全补丁的版本,然后想偷偷摸摸干点事情,嘿嘿,肯定是不好的对吧。

需要把这条路给它堵上。google就提供了rollball防回滚的机制。

比如我们发布的版本带有安全补丁,我们就把rollback index值加1,编译版本镜像->烧录->启动,启动的时候会去从设备的特殊分区中读取原来的rollback index值,如果发现设备中的index值小于vbmeta中的,就把vbmeta中的index更新到设备的特殊分区中。

这里的特殊分区可以是RPMB分区,也可以是其他不容易访问到的分区都是可以的。

如果这个时间,“某个坏人”通过OTA或者其他途径 刚好把有缺陷的镜像烧录成功到设备中了,启动的时候会遇到失败,因为有缺陷的版本rollback index值会小于特殊分区中的,启动失败,这样就达到了防止回滚了的目标了。

那么从代码层面上如何实现上面提到的这个点呢?就需要先移植libavb库到UBOOT或者UEFI中,然后实现avb_ops.c中的几个接口就可以了,我这里不方便贴代码,请见谅。

需要实现的接口在avb_ops.h中,如下几个需要实现,另外几个可选择性实现。

AvbIOResult (*read_from_partition)(AvbOps* ops,
                                     const char *partition,
                                     int64_t offset,
                                     size_t num_bytes,
                                     void* buffer,
                                     size_t* out_num_read);
  AvbIOResult (*read_rollback_index)(AvbOps* ops,
                                     size_t rollback_index_location,
                                     uint64_t* out_rollback_index);
  AvbIOResult (*write_rollback_index)(AvbOps* ops,
                                      size_t rollback_index_location,
                                      uint64_t rollback_index);  
  AvbIOResult (*validate_vbmeta_public_key)(AvbOps* ops,
                                            const uint8_t* public_key_data,
                                            size_t public_key_length,
                                            const uint8_t* public_key_metadata,
                                            size_t public_key_metadata_length,
                                            bool* out_is_trusted);

以上就是UBOOT阶段AVB2.0的校验流程

2、avb非正常启动模块

ing

目录
相关文章
|
1月前
|
存储 缓存 物联网
uboot 启动流程详细分析参考
uboot 启动流程详细分析参考
135 1
|
1月前
|
安全 Linux Android开发
Android安全启动学习(一):AVB校验是什么?
Android安全启动学习(一):AVB校验是什么?
165 0
|
1月前
|
安全 Linux Android开发
AVB源码学习(七):AVB2.0-Super动态分区介绍
AVB源码学习(七):AVB2.0-Super动态分区介绍
219 0
|
1月前
|
存储 安全 算法
AVB源码学习(一):AVB2.0工作原理及编译配置
AVB源码学习(一):AVB2.0工作原理及编译配置
376 0
|
1月前
|
算法 Android开发
AVB源码学习(四):AVB2.0-libavb库介绍1
AVB源码学习(四):AVB2.0-libavb库介绍1
126 0
|
1月前
|
安全 Android开发
AVB源码学习(三):AVB2.0 Init阶段安全启动流程
AVB源码学习(三):AVB2.0 Init阶段安全启动流程
149 0
|
1月前
|
存储 安全 Android开发
Android安全启动学习(三):AVB校验的内容、怎么校验、AVB的作用
Android安全启动学习(三):AVB校验的内容、怎么校验、AVB的作用
264 0
|
1月前
|
安全 Android开发
Android AVB的校验宏观的两个阶段
Android AVB的校验宏观的两个阶段
78 0
|
1月前
|
Android开发
Android源码学习(五):AVB2.0-libavb库介绍2
Android源码学习(五):AVB2.0-libavb库介绍2
167 0
|
1月前
|
安全 Android开发
AVB(一):提前装载分区
AVB(一):提前装载分区
86 0

热门文章

最新文章