"安卓系统启动更安全!资深大师教你如何使用AVB" (qq.com)
Android Verified Boot,简称AVB,是Google推荐的适用于安卓操作系统的保证系统启动安全的最佳实现方式,本篇文章主要介绍AVB的使用以及注意事项。
01AVB使能
如果要在自己的安卓project上面使能AVB,请在对应的BoardConfig.mk中增加如下配置:
BOARD_AVB_ENABLE := true
BOARD_AVB_ALGORITHM := SHA512_RSA4096 BOARD_AVB_KEY_PATH := /path/to/rsa_key_4096bits.pem
同时,如果项目要过CTS/VTS认证,就会进行替换GSI进行测试,这个时间就要使能AVB的链式分区(chained partitions)功能,增加如下配置:
BOARD_AVB_VBMETA_SYSTEM := system system_ext BOARD_AVB_VBMETA_SYSTEM_KEY_PATH := external/avb/test/data/testkey_rsa2048.pem BOARD_AVB_VBMETA_SYSTEM_ALGORITHM := SHA256_RSA2048 BOARD_AVB_VBMETA_SYSTEM_ROLLBACK_INDEX_LOCATION := 1
如果增加防回滚机制,就额外增加如下配置:
BOARD_AVB_ROLLBACK_INDEX := 5
至此,AVB使能的安卓集成方面的配置都已经打开,正常进行source/lunch/make即可。
02avbtool
在使能配置之后,正常的安卓编译过程中,就会额外调用avbtool,来产生验证过程中的image info,主要是如下三个函数接口:
对于比较小的镜像,在bootloader阶段做一次hash校验,会调用add_hash_footer接口。
对于system,vendor等比较大的镜像,在运行时验证,调用add_hashtree_footer接口。
基于前面的编译出的带有footer的镜像,我们会调用make_vbmeta_image生成vbmeta.img,用于BootLoader在加载HLOS之前,进行校验。
03如何进行key客制化
前面我们的使能配置,都是使用原生的key进行签名和校验的,显然对于上市的产品是不可以的,必须使用客制化的key。
第一,通过OpenSSL 产生项目特有的key,更待BoardConfig.mk中的key路径配置。
第二,调用avbtool 的方法,生成private key对应的public key。
avbtool extract_public_key --key key.pem --output pkmd.bin
第三,将生成的pkmd.bin转化为数组,替换到BootLoader中。
avbtool extract_public_key --key testkey_rsa4096.pem --output avb_root_pub.binxxd -i avb_root_pub.bin | sed 's/unsigned char/const unsigned char/g' > OEMPublicKey.hcp avb_root_pub.h xxx/bootloader/xxx/avb_root_pub.h
04如何进行remount
对于AVB使能的设备,我们一般要做remount,就必须进行unlock设备的操作,但avbtool 里面也提供了方法,不用unlock设备,也可以进行remount动作。只需要在生成vbmeta镜像时增加--set_hashtree_disabled_flag参数即可。
05如何静态验证镜像
当AVB使能之后,我们也可以在服务器先行验证,验证成功之后再烧写到板子上面进行验证。
avbtool verify_image \ --image /path/to/vbmeta.img \ --key my_key.pem \ --expect_chained_partition foobar:8:foobar_vendor_key.avbpubkey