Android 1. Android verify boot (AVB)

前言

众所周知,安全问题现在越来越被大家所重视,目前运行Android系统的设备市场占有率很大,我们在这里就简单地分析下Android如何保证自己的系统运行安全的。

熟悉Android 系统的朋友们都知道,Android整个系统的的image有好多个。有bootloader、包含kernel的boot.img,还有system.img和vendor.img。
在芯片刚启动的时候会利用芯片中的OTP fuse的值对bootloader 镜像文件进行校验。bootloader启动后会根据Android verify boot 的规则去验证 kernel 也就是boot.img。kernel启动后会利用DM-verity 去验证system 和vendor的image。如果验证通过就正常运行。否则就会报错,运行失败。说起来有些繁琐,看下图,简单地描述这个部分的验证关系。其中AVB和DM-verity 我们将在接下来的章节里面介绍。

在这里插入图片描述
在进行安全验证的过程中离不开一个很重要的结构vbmeta struct.下一节我们首先介绍一下这个结构体。

1.VBmeta struct

标题1.1vbmeta struct 结构

在这里插入图片描述
在这一节我们介绍一个很重要的结构体:vbmeta struct。这个结构体是Android能够实现AVB功能的关键所在。
根据前面的图我们可以看到,在vbmeta 中包含了 数个descriptor ,每个descriptor 描述关于镜像文件的信息。例如 boot 镜像的hash值,dtbo 镜像的hash值。system和vendor分区比较大,因此在这里存放了这两个分区的Hashtree的数据。
在vbmeta的镜像文件中除了存放vbmeta struct,还有AVB 私钥(key0)对vbmeta image的签名数据,以及AVB 公钥的数据。
其结构具体如下:
在这里插入图片描述

1.2 AVB key

AVB key 是一对非对称密钥。私钥用来签名,公钥用来验证。如关系如图所示:
在这里插入图片描述
其中key在源代码中存放的位置如下:
私钥

${MY_ANDROID}/device/fsl/common/security/xxxx_private.pem

公钥

${MY_ANDROID}/device/fsl/common/security/xxxx_public.bin.

为了更直观地了解vbmeta struct deneirong,我们可以根据Android 提供的工具,分析下vbmeta文件镜像的内容。命令下下:

Vbmeta image can be parsed using avbtool in Android.
$ cd ${MY_ANDROID}/out/target/product/xxxx
$ ../../../../external/avb/avbtool info_image --image vbmeta.img > vbmeta.img.info
$ cat vbmeta.img.info

在这里我们的结果信息如下:
在这里插入图片描述

2. DM-verity

DM-verity 是Android 系统安全的另一重要部分,它能保证Android 的 vendor 和 system 镜像文件中的内容是真实可靠的。
那这个是怎么实现的呢,之前在vbmeta的镜像文件中有一个kernel cmdline descriptor 描述如何实现和system 相关的dm-verity。同时在vbmeta 中还包含system和vendor 镜像文件的hashtree的相关信息。

那么对于DM-verity 我们要对什么进行签名呢。答案是和hashtree 相对应的dm-verity table.。构建 dm-verity table,表会标明内核的块设备(或目标)以及哈希树的位置(是同一个值)。该映射表还会标明块的大小和 hash_start,即哈希树的起始位置(具体来说,就是哈希树在映像开头处的块编号)。

如需关于 Verity 目标映射表字段的详细说明,请参阅Google官方文档。在参考文档里面会有相关的链接【1】。

DM-verity 的私钥在source code的地址:

${MY_ANDROID}/build/target/product/security/verity_private_dev_key.

公钥所在地址:

${MY_ANDROID}/build/target/product/security/verity_key.

对dm-verity table 签名之后,公钥放在boot镜像文件所在的分区中。

总结

综上所述,在Android系统中,安全启动主要包括以下几部分。

1.在刚启动的时候芯片rom对bootloader,或者如果使能了TEE OS,还包括对TEE 镜像的验证。
2.bootloader  对boot.img(kernel) 进行验证.
3.kernel启动完成后,/system /vendor分区进行验证

补充一点:
我们自己利用openssl产生公钥私钥的方法:

$ openssl genrsa -out verity_private_dev_key_tem 2048
$ openssl pkcs8 -topk8 -inform PEM -in verity_private_dev_key_tem -outverity_private_dev_key -outform     PEM –nocrypt
$ pem2mincrypt verity_private_dev_key_tem verity_key

参考文档

【1】https://source.android.google.cn/security/verifiedboot/dm-verity?hl=zh-cn#mapping-table

### Android Verified Boot (AVB)介绍 Android Verified Boot (AVB) 是一种增强设备安全性的机制,旨在防止未经授权修改启动过程中的关键组件。通过构建一个信任链来确保从最底层硬件到操作系统各个部分均未被篡改。这一链条依次经过 ROM code、BootLoader、boot image 及至 System 和 Vendor 分区[^1]。 ### AVB工作原理 在启动流程里,每个阶段都会加载并验证下一个阶段的数据完整性与真实性: - **ROM Code**: 设备上不可更改的第一段执行代码负责初始化基本硬件设置,并引导进入 bootloader。 - **Bootloader**: 验证 `boot.img` 文件(内含 Kernel Image),此文件包含了用于后续分区验证所需的公钥——verity_key,该密钥存储于 ramdisk 中而后者被打包进了 boot.img 之内[^2]。 - **Boot Image & Hash Tree Verification**: 当到达系统和供应商分区间时,则利用之前由 bootloader 解析出来的 verity metadata 来检验这些区域内的 hash tree 结构,从而确认其内容无损且未经非法改动。 ```python def verify_partition(partition_data, partition_hash_tree): """ Verify the integrity of a given partition using its associated hash tree. :param bytes partition_data: Raw data from the partition to be checked. :param list partition_hash_tree: List representing the Merkle tree hashes for verification. :return bool: True if valid, False otherwise. """ calculated_hashes = compute_merkle_tree(partition_data) return all(a == b for a, b in zip(calculated_hashes, partition_hash_tree)) ``` 对于采用 A/B 更新模式的系统而言,在版本切换期间同样遵循上述原则以保障新旧状态间的平滑过渡以及安全性。 ### 实现方式 实际部署中,AVB 主要依赖如下几个方面来达成目标: - **vbmeta Partition**: 自 Android Pie 开始引入的新概念,它保存着关于其他受保护分区的信息摘要及其签名信息;这使得即使当 primary slot 的数据遭到破坏或更新失败时也能借助 secondary slot 完成恢复操作而不影响整个验证逻辑的有效性。 - **Public Key Infrastructure(PKI)**: 整个过程中涉及到多个层次上的加密算法应用,比如 RSA 或者 ECDSA 等非对称密码技术用来签署重要资料,保证只有持有对应私钥的一方才能创建有效的签名,进而维护了整体架构的安全等级。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值