AVB源码学习(一):AVB2.0工作原理及编译配置
參考資料
感謝前輩的blog,安全相關(guān)的資料可太少了,很詳細(xì)很卓越
https://blog.csdn.net/jackone12347/article/details/116241676
前言
在這個(gè)AVB源碼系列學(xué)習(xí)之前,還是重新看一下這個(gè)AVB到底是什么?AVB是為什么誕生?
1、設(shè)備中的系統(tǒng)分區(qū),可以通過(guò)fastboot和燒錄工具進(jìn)行替換掉,替換成功后,可以正常開(kāi)機(jī),這種能接受么? 2、在設(shè)備運(yùn)行過(guò)程中,破壞或者篡改一部分?jǐn)?shù)據(jù),系統(tǒng)能知道被篡改了么? 3、google發(fā)布了security patch安全補(bǔ)丁版本,明確告知某個(gè)版本有缺陷,OEM廠商仍然使用有缺陷的版本 或者被攻擊者使用了有缺陷的版本,系統(tǒng)能檢查的出來(lái)么? 4、boot鏡像的head頭和內(nèi)容被篡改了,系統(tǒng)能檢查的出來(lái)么? 5、uboot被替換,或者system被替換,系統(tǒng)能檢查的出來(lái)其中有一個(gè)被替換過(guò)么?這些問(wèn)題,可統(tǒng)歸為系統(tǒng)安全相關(guān)的問(wèn)題,從Android O版本開(kāi)始,google就設(shè)計(jì)出了AVB,用來(lái)解決這些問(wèn)題。
其實(shí)AVB校驗(yàn)的設(shè)計(jì)難點(diǎn),主要是在uboot中的AVB校驗(yàn),因?yàn)閡boot要校驗(yàn)vbmeta和boot分區(qū)要校驗(yàn)公鑰,以及l(fā)ock上鎖邏輯、防回滾邏輯、啟動(dòng)狀態(tài)的邏輯,以及這些邏輯的內(nèi)容存儲(chǔ)在分區(qū)中還是RPMB中等等。
(這里不一定是uboot去校驗(yàn)avb,這是與系統(tǒng)的啟動(dòng)流程。)
下面開(kāi)始android AVB2.0(一)工作原理及編譯配置
android AVB2.0(一)工作原理及編譯配置
android AVB2.0介紹,本篇主要介紹AVB2.0的概述和工作原理、配置和編譯。有關(guān)AVB2.0的其他子系統(tǒng)的介紹,請(qǐng)查看android AVB2.0學(xué)習(xí)總結(jié)。
AVB2.0概述
什么是AVB?
先看一段google官方的定義: “Verified boot is the process of assuring the end user of the integrity of the software running on a device. It typically starts with a read-only portion of the device firmware which loads code and executes it only after cryptographically verifying that the code is authentic and doesn’t have any known security flaws. AVB is one implementation of verified boot.”AVB是確保終端用戶運(yùn)行的設(shè)備安全的一整套流程。
通常從設(shè)備固件的只讀部分啟動(dòng),使用加密的方式驗(yàn)證代碼是真實(shí)的,且沒(méi)有任何已知的安全缺陷后才執(zhí)行它。AVB是驗(yàn)證啟動(dòng)的一種實(shí)現(xiàn)。
AVB是android的一個(gè)非常重要的安全功能,主要是防止啟動(dòng)鏡像被篡改,提高系統(tǒng)整體的抗攻擊的能力,在啟動(dòng)的過(guò)程實(shí)現(xiàn)一整套的校驗(yàn)鏈,確保各個(gè)啟動(dòng)階段是安全啟動(dòng)的。
AVB在系統(tǒng)啟動(dòng)的哪些階段工作?
AVB一般在bootloader階段和INIT的第一階段工作。AVB在這兩個(gè)階段做了哪些事情?
AVB主要在Bootloader中校驗(yàn)vbmeta/vbmeta_system/boot/vendor_boot等分區(qū),在init的第一階段校驗(yàn)vbmeta/system/vendor等分區(qū)。AVB工作原理大概是怎樣的?
- 1、在bootloader或者UEFI中對(duì)vbmeta分區(qū)做校驗(yàn),
- 2、通過(guò)vbmeta中的descriptor描述符信息,去校驗(yàn)boot/vendor_boot等分區(qū),同時(shí)獲取系統(tǒng)中的device_status(locked or unlocked 即上鎖或者未上鎖)、boot_status(啟動(dòng)狀態(tài))、vbmeta中的加密的digest/加密算法/vbmeta大小等信息,append到kernel cmdline中;
- 3、然后啟動(dòng)kernel,kernel加載ramdisk運(yùn)行init進(jìn)程,進(jìn)入init第一階段,進(jìn)行system/vendor分區(qū)的安全校驗(yàn),會(huì)利用kernel cmdline中的值,跳過(guò)boot分區(qū)的校驗(yàn);同時(shí),因?yàn)閟ystem/vendor分區(qū)比較大,對(duì)大分區(qū)會(huì)執(zhí)行hashtree的數(shù)據(jù)處理,將root digest等信息通過(guò)ioctl存到kernel中,后面訪問(wèn)數(shù)據(jù)時(shí)文件系統(tǒng)會(huì)執(zhí)行dm-verity校驗(yàn),執(zhí)行運(yùn)行時(shí)動(dòng)態(tài)安全校驗(yàn)。
AVB對(duì)分區(qū)的處理是怎樣的?
知道了其工作原理后,那google是如何設(shè)計(jì)框架的,對(duì)系統(tǒng)分區(qū)做了哪些設(shè)計(jì)呢?
首先,google想到了這樣的設(shè)計(jì):通過(guò)增加一個(gè)獨(dú)立的分區(qū),這個(gè)分區(qū)包括了其他分區(qū)的重要校驗(yàn)信息;只要保證這個(gè)vbmeta的足夠安全,那么vbmeta中包含的其他分區(qū)的信息也就足夠安全。
其次,這些安全的信息總不能用明文吧,所以得加密。用什么加密方式比較合適呢?google采用了RSA非對(duì)稱加密,對(duì)鏡像數(shù)據(jù)做RSA簽名,將來(lái)在啟動(dòng)加載鏡像分區(qū)時(shí)做公鑰驗(yàn)證簽名。一級(jí)級(jí)的保證各個(gè)分區(qū)的安全性。
好了,有了這些基本內(nèi)容后,我們接下就介紹vbmeta的設(shè)計(jì)細(xì)節(jié),以及它的設(shè)計(jì)用意。
AVB細(xì)節(jié)
一、vbmeta鏡像內(nèi)容說(shuō)明:
在整個(gè)AVB驗(yàn)證的過(guò)程中,需要借助于vbmeta分區(qū),需要增加vbmeta分區(qū)和vbmeta.img鏡像。
vbmeta.img鏡像,編譯出來(lái)的大小為4KB
可使用avbtool提供的工具查看編譯出來(lái)的vbmeta.img鏡像內(nèi)容:
./android/external/avb/avbtool info_image --image android/out/target/product/xxx/vbmeta.img The vbmeta image consists of three blocks:| Header data - fixed size 256 bytes rollback index | algorithm_type | signature offset | public_key offset| Authentication data - variable size hash of vbmeta.img | signature of vbmeta.img| Auxiliary data - variable size public key | public key metadata | descriptors of other include imagevbmeta分區(qū)描述內(nèi)容及vbmeta_system.img內(nèi)容 :
Vbmeta的Descriptor的分類:
Chain Descriptor: 鏈?zhǔn)?#xff0c;vbmeta等分區(qū)數(shù)據(jù)少的分區(qū)。 Hash Descriptor:hash哈希,boot等小分區(qū)。 Hashtree Descriptor: dm-verity校驗(yàn)的大分區(qū),像vendor在A/B版本中的vbmeta分區(qū)描述:
vbmeta鏡像的加解密過(guò)程簡(jiǎn)述:
● 加密過(guò)程
根據(jù)摘要信息生成private key(私鑰),利用私鑰extra生成public key(公鑰),同時(shí)利用私鑰對(duì)vbmeta鏡像進(jìn)行簽名(signature),并將公鑰和計(jì)算的hash寫(xiě)到vbmeta鏡像的header中。
● 解密過(guò)程
先驗(yàn)證公鑰是否平臺(tái)簽發(fā)的(公鑰比對(duì),防止vbmeta鏡像的公鑰和簽名都被篡改掉),然后利用公鑰進(jìn)行解密簽名。
AVB中鏡像的加密和解密過(guò)程,以boot.img鏡像為例
編譯制作boot.img時(shí)進(jìn)行簽名時(shí),先通過(guò)SHA-256算法得到一個(gè)散列值digest(十六進(jìn)制長(zhǎng)度為64),然后用帶RSA算法的私鑰加密這個(gè)digest,并生成簽名后和公鑰一起加在鏡像的footer尾部上,編譯時(shí)也會(huì)將這個(gè)digest存一份到vbmeta.img鏡像中。
在bootloader中加載boot鏡像時(shí),先從vbmeta.img鏡像分區(qū)中讀出boot descriptor的digest,然后利用boot鏡像中的公鑰進(jìn)行解密計(jì)算得到一個(gè)digest,和自己SHA-256計(jì)算得到的digest進(jìn)行比較;
digest相等則說(shuō)明boot.img是平臺(tái)編譯簽名的,如果不相等,則boot.img可能是被篡改過(guò)的,boot啟動(dòng)失敗。
最后再計(jì)算一次boot鏡像內(nèi)容的hash是否相等,hash不相等,啟動(dòng)也是失敗。
所以這里也說(shuō)保護(hù)這個(gè)vbmeta是很重要的。
私鑰簽名 公鑰驗(yàn)簽的python腳本舉例說(shuō)明,這個(gè)看起來(lái)就更明白些了吧?
私鑰簽名 def rsa_private_sign(data):private_key = get_key('rsa_private_key.pem')signer = PKCS1_signature.new(private_key)digest = SHA.new()digest.update(data.encode("utf8"))sign = signer.sign(digest)signature = base64.b64encode(sign)signature = signature.decode('utf-8')return signature ? ?公鑰驗(yàn)證簽名 def rsa_public_check_sign(text, sign):publick_key = get_key('rsa_public_key.pem')verifier = PKCS1_signature.new(publick_key)digest = SHA.new()digest.update(text.encode("utf8"))return verifier.verify(digest, base64.b64decode(sign)) ? ?調(diào)用 def test_sign():msg = ‘test content'sign = rsa_private_sign(msg)print(rsa_public_check_sign(msg, sign)) # True二、AVB2.0的配置和編譯
AVB2.0的配置,其實(shí)看完android/external/avb/README.md中的內(nèi)容,估計(jì)就了解的差不多了,耐著點(diǎn)心看完。
我簡(jiǎn)單點(diǎn)歸納一下,主要分下面三個(gè)部分來(lái)介紹。
- 1、AVB的配置總開(kāi)關(guān)
- 2、AVB key配置介紹
AVB使用的key的路徑和加密算法類型。這個(gè)key可自己使用openssl命令生成即可, 唯一需要注意的是使用-f4 4096參數(shù),算法類型保持不變。為什么要用4096而不用2048?這個(gè)長(zhǎng)度越長(zhǎng),越難被破解,vbmeta的public key驗(yàn)證時(shí)盡量用4096這個(gè)長(zhǎng)度。
- 3、AVB編譯鏡像
鏡像的編譯主要有vbmeta.img、boot.img、system/vendor.img、recovery.img等。
我們一個(gè)個(gè)來(lái)看。
vbmeta.img鏡像的編譯
vbmeta.img需要配置物理分區(qū)大小為64KB,這個(gè)是google推薦的,實(shí)際上數(shù)據(jù)只有4KB左右。
因?yàn)関bmeta.img里面要保存boot/dtbo/system/vendor等分區(qū)的校驗(yàn)信息,所以編譯時(shí)會(huì)依賴于這些鏡像的編譯。BOARD_AVB_KEY_PATH可自定義,如果沒(méi)有定義則使用avb默認(rèn)的test測(cè)試密鑰。
下面是build/core/Makefile中編譯vbmeta.img部分的腳本,其中BOARD_AVB_ALGORITHM和BOARD_AVB_KEY_PATH就是前面章節(jié)提到的需要自定義的算法和KEY路徑了。
ifdef BUILDING_VBMETA_IMAGE INSTALLED_VBMETAIMAGE_TARGET := $(BUILT_VBMETAIMAGE_TARGET) $(INSTALLED_VBMETAIMAGE_TARGET): PRIVATE_AVB_VBMETA_SIGNING_ARGS := \--algorithm $(BOARD_AVB_ALGORITHM) --key $(**BOARD_AVB_KEY_PATH**) #key是私鑰 $(INSTALLED_VBMETAIMAGE_TARGET): \$(AVBTOOL) \$(INSTALLED_BOOTIMAGE_TARGET) \$(INSTALLED_VENDOR_BOOTIMAGE_TARGET) \$(INSTALLED_SYSTEMIMAGE_TARGET) \$(INSTALLED_VENDORIMAGE_TARGET) \$(INSTALLED_PRODUCTIMAGE_TARGET) \$(INSTALLED_SYSTEM_EXTIMAGE_TARGET) \$(INSTALLED_ODMIMAGE_TARGET) \$(INSTALLED_DTBOIMAGE_TARGET) \$(INSTALLED_CUSTOMIMAGES_TARGET) \$(INSTALLED_RECOVERYIMAGE_TARGET) \$(INSTALLED_VBMETA_SYSTEMIMAGE_TARGET) \$(INSTALLED_VBMETA_VENDORIMAGE_TARGET) \$(BOARD_AVB_VBMETA_SYSTEM_KEY_PATH) \$(BOARD_AVB_VBMETA_VENDOR_KEY_PATH) \$(BOARD_AVB_KEY_PATH)$(build-vbmetaimage-target)這個(gè)會(huì)調(diào)用external/avb/avbtool.py腳本的make_vbmeta_image函數(shù),去完成對(duì)vbmeta.img鏡像的處理,后面會(huì)專門拿一個(gè)章節(jié)來(lái)介紹這些腳本函數(shù)。
define build-vbmetaimage-target$(call pretty,"Target vbmeta image: $(INSTALLED_VBMETAIMAGE_TARGET)")$(hide) mkdir -p $(AVB_CHAIN_KEY_DIR)$(call extract-avb-chain-public-keys, $(AVB_CHAIN_KEY_DIR)) #生成公鑰信息$(hide) $(AVBTOOL) make_vbmeta_image \$(INTERNAL_AVB_MAKE_VBMETA_IMAGE_ARGS) \ ##添加chain鏈?zhǔn)椒謪^(qū)信息和avbpubkey公鑰信息$(PRIVATE_AVB_VBMETA_SIGNING_ARGS) \ ##添加—algorithm和BOARD_AVB_KEY_PATH,在板卡mk中配置過(guò)的$(BOARD_AVB_MAKE_VBMETA_IMAGE_ARGS) \ ##設(shè)置padding_size/set_hashtree_disabled_flag/rollback_index等參數(shù)--output $@編譯出來(lái)的vbmeta.img鏡像,可用info_image命令進(jìn)行查看。
命令:
boot鏡像的編譯
在boot.img鏡像編譯的時(shí)候,會(huì)調(diào)用add_hash_footer函數(shù),也是調(diào)用的avbtool.py腳本的函數(shù),是為了在boot.img鏡像的尾部添加校驗(yàn)信息,為后面bootloader校驗(yàn)boot.img安全性做的功能,通過(guò)這個(gè)尾部的信息來(lái)判斷當(dāng)前啟動(dòng)的boot.img是否足夠安全。
編譯完成后,可以使用xxd命令查看鏡像中的內(nèi)容,看一下就大致明白是怎么回事了。
# xxd boot.img | head # xxd boot.img | tailsysmte/vendor鏡像的編譯
system/vendor鏡像處理是類似的,因?yàn)檫@兩個(gè)鏡像一般都比較大,不能采用和boot.img鏡像的add_hash_footer,如果在開(kāi)機(jī)的時(shí)候?qū)ystem/vendor整個(gè)內(nèi)容進(jìn)行hash計(jì)算,會(huì)比較耗時(shí),所以google設(shè)計(jì)采用了hashtree的方式,計(jì)算整體分區(qū)最后只保證root digest hash和salt,只校驗(yàn)這兩個(gè)值速度就比較快了。(而且這個(gè)過(guò)程好像是在后臺(tái)動(dòng)態(tài)運(yùn)行的,不影響流暢性。)
下面是腳本內(nèi)容
@build/core/Makefileifeq ($(BOARD_AVB_ENABLE),true)$(BUILT_SYSTEMIMAGE): $(BOARD_AVB_SYSTEM_KEY_PATH)endif$(BUILT_SYSTEMIMAGE): $(FULL_SYSTEMIMAGE_DEPS) $(INSTALLED_FILES_FILE)$(call build-systemimage-target,$@)$(INSTALLED_SYSTEMIMAGE_TARGET): $(BUILT_SYSTEMIMAGE)@echo "Install system fs image: $@"$(copy-file-to-target)$(hide) $(call assert-max-image-size,$@,$(BOARD_SYSTEMIMAGE_PARTITION_SIZE))ifeq ($(BOARD_AVB_ENABLE),true)PATH=$(INTERNAL_USERIMAGES_BINARY_PATHS):$$$$PATH \$(AVBTOOL) add_hashtree_footer \ ###主要是這個(gè)函數(shù)了--image $(3) \--key $(BOARD_AVB_$(call to-upper,$(2))_KEY_PATH) \--algorithm $(BOARD_AVB_$(call to-upper,$(2))_ALGORITHM) \--partition_size $(BOARD_AVB_$(call to-upper,$(2))_PARTITION_SIZE) \--partition_name $(2) \$(INTERNAL_AVB_CUSTOMIMAGES_SIGNING_ARGS) \$(BOARD_AVB_$(call to-upper,$(2))_ADD_HASHTREE_FOOTER_ARGS)endif至于avbtool腳本如何處理hashtree數(shù)據(jù),本篇就不介紹了,請(qǐng)自行看看這個(gè)函數(shù)。
好了朋友們,關(guān)于AVB2.0的工作原理和編譯配置本篇就介紹到這里了。
三、vbmeta和vbemta_system,以及vbmeta_system和system等分區(qū)的關(guān)系。
vbmeta_system.img
android/build/make/core/board_config.mk BUILDING_SYSTEM_IMAGE := true BUILDING_VBMETA_IMAGE := trueboardxx.mk 配置vbmeta_system.img的簽名需要的內(nèi)容
BOARD_AVB_VBMETA_SYSTEM := system system_ext product 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 := $(PLATFORM_SECURITY_PATCH_TIMESTAMP) BOARD_AVB_VBMETA_SYSTEM_ROLLBACK_INDEX_LOCATION := 2build/core/Makefile 制作vbmeta_system.img
define build-chained-vbmeta-image$(call pretty,"Target chained vbmeta image: $@")$(hide) $(AVBTOOL) make_vbmeta_image \$(INTERNAL_AVB_$(call to-upper,$(1))_SIGNING_ARGS) \$(BOARD_AVB_MAKE_$(call to-upper,$(1))_IMAGE_ARGS) \$(foreach image,$(BOARD_AVB_$(call to-upper,$(1))), \--include_descriptors_from_image $(call images-for-partitions,$(image))) \ ##遍歷遍歷BOARD_AVB_VBMETA_SYSTEM所有的分區(qū)描述符,并保存在vbmeta_system中--output $@ endefifdef BUILDING_SYSTEM_IMAGE ifdef BOARD_AVB_VBMETA_SYSTEM INSTALLED_VBMETA_SYSTEMIMAGE_TARGET := $(PRODUCT_OUT)/vbmeta_system.img $(INSTALLED_VBMETA_SYSTEMIMAGE_TARGET): \$(AVBTOOL) \$(call images-for-partitions,$(BOARD_AVB_VBMETA_SYSTEM)) \ ##遍歷BOARD_AVB_VBMETA_SYSTEM所有的分區(qū)鏡像,并將這些鏡像的信息存在vbmeta_system中$(BOARD_AVB_VBMETA_SYSTEM_KEY_PATH)$(call build-chained-vbmeta-image,vbmeta_system) endif endif # BUILDING_SYSTEM_IMAGEvbmeta.img
制作vbmeta.img,這里能看到有添加INSTALLED_VBMETA_SYSTEMIMAGE_TARGET這個(gè)vbmeta_system.img進(jìn)來(lái)
這樣vbmeta.img就包含vbmeta_system.img內(nèi)容了
define build-vbmetaimage-target$(call pretty,"Target vbmeta image: $(INSTALLED_VBMETAIMAGE_TARGET)")$(hide) mkdir -p $(AVB_CHAIN_KEY_DIR)$(call extract-avb-chain-public-keys, $(AVB_CHAIN_KEY_DIR)) ##分離抽取私鑰對(duì)應(yīng)的公鑰出來(lái),公鑰保存在鏡像頭部$(hide) $(AVBTOOL) make_vbmeta_image \$(INTERNAL_AVB_MAKE_VBMETA_IMAGE_ARGS) \$(PRIVATE_AVB_VBMETA_SIGNING_ARGS) \$(BOARD_AVB_MAKE_VBMETA_IMAGE_ARGS) \--output $@$(hide) rm -rf $(AVB_CHAIN_KEY_DIR) endefifdef BUILDING_VBMETA_IMAGE INSTALLED_VBMETAIMAGE_TARGET := $(BUILT_VBMETAIMAGE_TARGET) $(INSTALLED_VBMETAIMAGE_TARGET): PRIVATE_AVB_VBMETA_SIGNING_ARGS := \ ##vbmeta的key路徑和算法類型--algorithm $(BOARD_AVB_ALGORITHM) --key $(BOARD_AVB_KEY_PATH)$(INSTALLED_VBMETAIMAGE_TARGET): \ ...$(INSTALLED_VBMETA_SYSTEMIMAGE_TARGET) \vbmeta_system.img如何將這些分區(qū)鏡像的數(shù)據(jù)進(jìn)行存儲(chǔ)的
現(xiàn)在我們來(lái)分解一下vbmeta_system.img,看下是如何將這些分區(qū)鏡像的數(shù)據(jù)進(jìn)行存儲(chǔ)的。
執(zhí)行
vim vbmeta_system.img,然后輸入%!xxd,就可以看到如下內(nèi)容了:
00000000: 4156 4230 0000 0001 0000 0000 0000 0000 AVB0............ 00000010: 0000 0140 0000 0000 0000 0880 0000 0001 ...@............ 00000020: 0000 0000 0000 0000 0000 0000 0000 0020 ............... 00000030: 0000 0000 0000 0020 0000 0000 0000 0100 ....... ........ 00000040: 0000 0000 0000 0670 0000 0000 0000 0208 .......p........ 00000050: 0000 0000 0000 0878 0000 0000 0000 0000 .......x........ 00000060: 0000 0000 0000 0000 0000 0000 0000 0670 ...............p 00000070: 0000 0000 6156 4f80 0000 0000 0000 0000 ....aVO......... 00000080: 6176 6274 6f6f 6c20 312e 312e 3000 0000 avbtool 1.1.0... 00000090: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 000000a0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 000000b0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 000000c0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 000000d0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 000000e0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 000000f0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 我把這里分割一下,前面256字節(jié)內(nèi)容長(zhǎng)度是固定的,用來(lái)存儲(chǔ)vbmeta_system.img本身的內(nèi)容00000100: f471 409a 8786 ca2f 2d22 0f33 732c e431 .q@..../-".3s,.1 00000110: a164 95fb a21b e7dd 646e 8879 5a70 6943 .d......dn.yZpiC 00000120: af4a a9ca 55c2 7050 7201 10ca 8561 eb68 .J..U.pPr....a.h 00000130: 83b9 839b 0a80 42ac ee56 5855 720b f9be ......B..VXUr... 00000140: b37b c224 2292 9f99 a903 9c19 a423 38d0 .{.$"........#8. 00000150: d495 9f22 b7fa b7ee af00 3b46 5680 3130 ..."......;FV.10 00000160: 1d1e 84d3 241b 6366 0121 c7db 60e6 ad0b ....$.cf.!..`... 00000170: 9fa7 adbd 920e 1def 4a9b 5102 e359 2072 ........J.Q..Y r 00000180: dbac f867 42b9 5dd2 a7c5 5398 e6b9 5e3d ...gB.]...S...^= 00000190: 770f ede6 0df0 cb89 31e0 f1ac ad3c 6540 w.......1....<e@ 000001a0: f435 215d f298 d1d4 bbb4 91e9 6bc3 9174 .5!]........k..t 000001b0: 2377 dc5a 27e9 cc97 e5fb eb6f e6e6 9a13 #w.Z'......o.... 000001c0: 3428 c340 6f0a 3a71 788c 76fe 2b4d 9da4 4(.@o.:qx.v.+M.. 000001d0: ee5e 4ac4 7936 478a d9ef 10c6 2ffd 813c .^J.y6G...../..< 000001e0: 90d8 68af 31be 9ca9 0b8e b840 8fb3 877d ..h.1......@...} 000001f0: fcb1 cf2a d092 3c64 af9f 0d14 876a cdbc ...*..<d.....j.. 00000200: db84 c462 b32f cbc1 af4e 2be8 0c1b aa78 ...b./...N+....x 00000210: a359 263e f7a8 e3fe 1efb dcd7 7663 0206 .Y&>........vc.. 00000220: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000230: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 00000240: 0000 0000 0000 0000 0000 0000 0000 0088 ................ 說(shuō)明:到這里是576字節(jié) =256 +320 ,這里存的是Authentication簽名和hash數(shù)據(jù)了,加密混淆了。 Header Block: 256 bytes Authentication Block: 320 bytes... 00000a30: 5c3b 9436 c18f fec9 d25a 6aa0 46e1 a28b \;.6.....Zj.F... 00000a40: 2f51 6151 a336 9183 b4fb cda9 4034 4698 /QaQ.6......@4F. 00000a50: 8a1a 91df d92c 3abf 573a 4646 20f2 f0bc .....,:.W:FF ... 00000a60: 315e 29fe 5890 325c 6697 999a 8e15 23eb 1^).X.2\f.....#. 00000a70: a947 d363 c618 bb8e d220 9f78 af71 b32e .G.c..... .x.q.. 00000a80: 0889 a1f1 7db1 30a0 e61b bd6e c8f6 33e1 ....}.0....n..3. 00000a90: dab0 bd16 41fe 076f 6e97 8b6a 33d2 d780 ....A..on..j3... 00000aa0: 036a 4de7 0582 281f ef6a a975 7ee1 4ee2 .jM...(..j.u~.N. 00000ab0: 955b 4fe6 dc03 b981 0000 0000 0000 0000 .[O............. 這些數(shù)據(jù)就是輔助數(shù)據(jù)了,存的是vbmeta_system包含的system等分區(qū)的descriptor信息了 Auxiliary Block: 2176 bytesvbmeta鏡像中包含了vbmeta_system鏡像的信息
分析完了vbmeta_system.img,再回過(guò)頭來(lái)看vbmeta.img,可以看到vbmeta鏡像中包含了vbmeta_system鏡像的信息。
$ ./external/avb/avbtool.py info_image --image out/xxx/vbmeta.img Minimum libavb version: 1.0 Header Block: 256 bytes Authentication Block: 576 bytes Auxiliary Block: 3136 bytes Public key (sha1): 6fc544ec428a010fa304a398f3a8fe62c1xxxxxx Algorithm: SHA256_RSA4096 Rollback Index: 0 Flags: 0 Release String: 'avbtool 1.1.0' Descriptors:Chain Partition descriptor:Partition Name: vbmeta_systemRollback Index Location: 2Public key (sha1): cdbb77177f731920bbe0a0f94f84d9038axxxxxx ###公鑰的sha1值和前面vbmeta_system Public key (sha1)值是相同的Prop: com.android.build.boot.fingerprint -> xxx:userdebug/test-keys'Prop: com.android.build.boot.os_version -> '11'Hash descriptor:Image Size: 26800128 bytesHash Algorithm: sha256Partition Name: bootSalt: a55c2fa693f09b24bf261f2cae3c0290d37aad3a63a78f7ed673a2d656xxxxxxDigest: f352ae2862e12e85c921394448fc47585a01ec29a77c6d8dea8c6f9e33xxxxxxFlags: 0 ...一般android設(shè)備在uboot階段加載校驗(yàn)vbmeta本身和校驗(yàn)boot/vendor_boot/dtbo等分區(qū),在android init階段啟動(dòng)的時(shí)候,不再需要校驗(yàn)vbmeta本身了,但是會(huì)加載vbmeta整個(gè)分區(qū)(此接口libavb靜態(tài)庫(kù)中有實(shí)現(xiàn)),這樣能讀到vbmeta_system的信息。
所以,init啟動(dòng)AVB校驗(yàn)的第一個(gè)分區(qū)是system分區(qū)。
代碼處理在first_stage_mount.cpp中的SetUpDmVerity函數(shù)
SetUpDmVerity會(huì)讀fstab:
會(huì)先判斷fstab中是否有avb_keys=/avb/q-gsi.avbpubkey:/avb/r-gsi.avbpubkey:/avb/s-gsi.avbpubkey的flag
然后判斷fstab中是否有avb=vbmeta_system的flag
如果都沒(méi)有,則沒(méi)有開(kāi)啟AVB
那么fstab中為什么要添加avb_keys=/avb/q-gsi.avbpubkey公鑰的flag呢?這種設(shè)計(jì)是要解決什么問(wèn)題?
system分區(qū)的公鑰和簽名信息都在了vbmeta_system中了,為什么還需要在first_stage_ramdisk中保存一份avbpubkey呢?
我們看一下編譯產(chǎn)物:
再回過(guò)頭來(lái)看一下extract-avb-chain-public-keys的定義,從定義的內(nèi)容來(lái)看,應(yīng)該是各partition的公鑰了,形式為partition.avbpubkey
define extract-avb-chain-public-keys$(if $(BOARD_AVB_BOOT_KEY_PATH),\$(hide) $(AVBTOOL) extract_public_key --key $(BOARD_AVB_BOOT_KEY_PATH) \--output $(1)/boot.avbpubkey)$(if $(BOARD_AVB_VENDOR_BOOT_KEY_PATH),\$(AVBTOOL) extract_public_key --key $(BOARD_AVB_VENDOR_BOOT_KEY_PATH) \--output $(1)/vendor_boot.avbpubkey)$(if $(BOARD_AVB_SYSTEM_KEY_PATH),\$(hide) $(AVBTOOL) extract_public_key --key $(BOARD_AVB_SYSTEM_KEY_PATH) \--output $(1)/system.avbpubkey)而我們這里是r-gsi.avbpubkey,那r-gsi表示什么?搞過(guò)XTS的應(yīng)該知道是google搞的通用系統(tǒng)鏡像,是需要燒錄對(duì)應(yīng)的system.img的。
所以,在fstab中配置的avb_keys=/avb/xxx.avbpubkey,應(yīng)該是為了過(guò)GSI測(cè)試用的,在VTS測(cè)試時(shí),會(huì)往data分區(qū)push google簽名對(duì)應(yīng)的public key。
(這個(gè)末尾這點(diǎn)就是說(shuō)這個(gè)小尾巴的內(nèi)容是為了通過(guò)谷歌測(cè)試。)
(銷往海外的Android電視,若想使用Google的應(yīng)用程序和服務(wù),如YouTube、Gmail、Google Play Store等,必須通過(guò)此認(rèn)證,獲得Google授權(quán)。通過(guò)Google XTS TV認(rèn)證測(cè)試。)
總結(jié)
以上是生活随笔為你收集整理的AVB源码学习(一):AVB2.0工作原理及编译配置的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: IIS如何防ASP木马
- 下一篇: storyboard搭建项目_轻松搞定一