一,AVB简介
Android Verified Boot (AVB) 是一种用于确保Android设备软件完整性和安全性的机制。它通过在设备启动时验证操作系统及其组件的完整性,来防止恶意软件或未经授权的软件篡改。AVB在引导过程中依次验证每个分区,确保其未被篡改。以下是AVB机制的详细介绍:
1. AVB工作原理
a.引导加载程序阶段:
Bootloader:设备启动时,首先由引导加载程序(bootloader)运行。bootloader是设备上最早运行的软件,它负责加载并启动操作系统。AVB集成在bootloader中,bootloader在启动时会首先检查设备的完整性。
阶段1验证:bootloader验证自身的完整性,确保自己未被篡改。
阶段2验证:bootloader验证下一个要加载的组件,如boot分区、recovery分区等。验证通过后,才会继续引导。
b.分区验证:
分区签名:每个被保护的分区都包含一个签名。签名是由设备制造商使用私钥对分区内容进行签名生成的,只有拥有对应公钥的设备才能验证签名。
验证步骤:bootloader读取要加载分区的内容,并使用嵌入的公钥验证其签名。验证通过,则认为分区未被篡改,继续引导。验证失败,则引导过程终止或进入恢复模式。
c.公钥和证书:
公钥嵌入:AVB机制需要使用公钥验证分区的签名,这些公钥通常嵌入在bootloader中或存储在设备的安全存储区域。
证书链:AVB支持使用证书链来管理公钥,允许设备制造商定期更新密钥和证书。
2.AVB的实现
dm-verity:AVB常结合dm-verity(device-mapper verity)
使用,dm-verity是Linux内核模块,通过在块设备层面提供只读透明的校验来保护文件系统。
3. AVB版本:
AVB 1.0:提供基本的分区验证功能。
AVB 2.0:引入更多特性和改进,包括动态分区支持和增强的错误处理。
4. AVB的优势
防篡改:通过验证引导和分区的完整性,防止未经授权的修改和恶意软件的安装。
增强安全性:确保设备上运行的软件都是经过设备制造商认证的版本,提升设备的整体安全性。
保护用户数据:结合dm-verity,确保用户数据所在分区的完整性和不可篡改性。
二,AVB配置步骤
1. 内核打开avb配置
源码路径:longan/kernel/linux-4.9/arch/arm64/configs/sun50iw10p1smp_a100_android_defconfig
CONFIG_DM_VERITY_AVB=y
CONFIG_DM_ANDROID_VERITY_AT_MOST_ONCE_DEFAULT_ENABLED=y
2. dts去掉super和recovery
源码路径:longan/kernel/linux-4.9/arch/arm64/boot/dts/sunxi/sun50iw10p1.dtsi
diff --git a/longan/kernel/linux-4.9/arch/arm64/boot/dts/sunxi/sun50iw10p1.dtsi b/longan/kernel/linux-4.9/arch/arm64/boot/dts/sunxi/sun50iw10p1.dtsi
index ef4cbbac3a..a4b994aacb 100755
--- a/longan/kernel/linux-4.9/arch/arm64/boot/dts/sunxi/sun50iw10p1.dtsi
+++ b/longan/kernel/linux-4.9/arch/arm64/boot/dts/sunxi/sun50iw10p1.dtsi
@@ -113,7 +113,7 @@
vbmeta {
compatible = "android,vbmeta";
- parts = "vbmeta,vbmeta_system,vbmeta_vendor,boot,super,recovery";
+ parts = "vbmeta,vbmeta_system,vbmeta_vendor,boot";
};
};
optee {
3. 安卓方案fstab文件中添加avb配置
源码路径:android/devicesoftwinner/ceres-b6/fstab.sun50iw10p1
diff --git a/fstab.sun50iw9p1 b/fstab.sun50iw9p1
index 62f40bb..95bb2b0 100755
--- a/fstab.sun50iw10p1
+++ b/fstab.sun50iw10p1
@@ -2,7 +2,7 @@
# The filesystem that contains the filesystem checker binary (typically /system) cannot
# specify MF_CHECK, and must come before any filesystems that do specify MF_CHECK
#<src> <mnt_point> <type> <mnt_flags and options> <fs_mgr_flags>
-system /system ext4 ro,barrier=1 wait,first_stage_mount,logical,slotselect
+system /system ext4 ro,barrier=1 wait,first_stage_mount,logical,slotselect,avb=vbmeta,avb_keys=/avb/q-gsi.avbpubkey:/avb/r-gsi.avbpubkey:/avb/s-gsi.avbpubkey
vendor /vendor ext4 ro,barrier=1 wait,first_stage_mount,logical,slotselect
product /product ext4 ro,barrier=1 wait,first_stage_mount,logical,slotselect
/dev/block/by-name/UDISK /data f2fs noatime,nosuid,nodev,discard wait,check,formattable,quota,reservedsize=33554432
4. 验证信息
开启后编译烧录固件,可在debug串口看见uboot阶段打印如下: