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

参考资料

感谢前辈的blog,安全相关的资料可太少了,很详细很卓越
https://blog.csdn.net/jackone12347/article/details/116241676

(我是真的不习惯打1、2这种)

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

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

TrustZone_Hcoco

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值