验证方法

本页概述了一种方法(具有最高置信度),可确保您可以在 Pixel 设备上运行合法版本的 Pixel 映像。这涉及将出厂映像下载到计算机上,并在将下载的工件刷写到设备之前对其执行日志包含证明

如何验证 Pixel 出厂映像

验证的前提条件

在继续验证您刚刚下载的原始映像是否符合我们的声明之前,您需要通过连接到网络的计算机执行以下操作。

Go 语言

该验证工具是用 Go 编写的。如需构建该工具,请从 Go 网站安装 Go 1.17 或更高版本。

wget 或 curl

wgetcurl 是可用于从互联网检索或下载文件的工具。请务必在您的系统上安装这两种工具中的任一工具,因为本指南的其余部分和我们提供的脚本都需要其中一种工具。

avbtool

avbtool 用于计算出厂映像的 VBMeta 摘要并验证二进制文件。

您可以使用以下命令从 AOSP 代码库下载该模块,并在关联的文档中找到更多详细信息。

computer:~$ git clone https://android.googlesource.com/platform/external/avb

克隆该代码库后,您可以在克隆的 avb 代码库目录中找到 avbtool.py。此外,您还应将此目录添加到 $PATH 环境变量中。

computer:~$ PATH=$PATH:DIRECTORY_CONTAINING_AVBTOOL

包含证明验证器

包含证明验证器是一个 Go 模块,用于查询 Pixel Factory 图片透明度日志,并输出图片是否包含在日志中。

克隆上述 AVB 代码库后,您会在 tools/transparency/verify/ 中找到验证程序的源代码

Fbpacktool

fbpacktool 是一个 Python 脚本,用于解压缩 Pixel 的 bootloader.img 中的各个组件。此工具对于允许 avbtool.py 发现用于验证的所需图片至关重要。

如需使用此工具,您应将以下三个 Python 脚本下载到 avbtool.py 所在的目录,使 fbpacktool.py 可执行,并为 fbpacktool.py 创建一个名为 fbpacktool 的符号链接以方便使用。

如果您有 wget,可以发出以下命令来下载这三个脚本:

computer:dir_to_avbtool$ wget https://source.android.com/devices/bootloader/tools/pixel/fw_unpack/fbpacktool.py \
https://source.android.com/devices/bootloader/tools/pixel/fw_unpack/fbpack.py \
https://source.android.com/devices/bootloader/tools/pixel/fw_unpack/packedstruct.py
computer:dir_to_avbtool$ chmod +x fbpacktool.py
computer:dir_to_avbtool$ ln -s fbpacktool.py fbpacktool

如果您有 curl,可以发出以下命令来下载这三个脚本:

computer:dir_to_avbtool$ curl -O https://source.android.com/devices/bootloader/tools/pixel/fw_unpack/fbpacktool.py
computer:dir_to_avbtool$ curl -O https://source.android.com/devices/bootloader/tools/pixel/fw_unpack/fbpack.py
computer:dir_to_avbtool$ curl -O https://source.android.com/devices/bootloader/tools/pixel/fw_unpack/packedstruct.py
computer:dir_to_avbtool$ chmod +x fbpacktool.py
computer:dir_to_avbtool$ ln -s fbpacktool.py fbpacktool

OpenSSL

您还需要一个名为 openssl 的工具,以便在验证工作流中使用终端执行各种加密操作。确保它已安装在您的系统上。您可以在终端上通过发出以下命令进行检查,并确保返回的结果不为空。例如:

computer:~$ which openssl
/usr/bin/openssl

构建要验证的载荷

如需验证您设备上的映像或从 Pixel 工厂映像网站下载的映像,您必须先根据 build 指纹和 VBMeta 摘要构建与该映像对应的载荷。有两种选项,即手动或自动,如下所述。

  • build 指纹:工厂映像的字符串标识符
    • 示例:google/oriole/oriole:12/SD1A.210817.015.A4/7697517:user/release-keys
  • VBMeta 摘要:一种 SHA-256 加密摘要,用于将出厂映像的不同部分联系在一起
    • 示例:4d5e41b7c675a821de81f7d2c744623fe808c8c2d3e19a83e894dab5d0829dbe

手动构建载荷

如需手动生成要验证的载荷,您需要创建一个文本文件 payload.txt,其中包含一行 build 指纹,然后在下一行包含 VBMeta 摘要,并在两行之间添加一个空行(如需了解确切格式,请参阅“日志内容”部分)。

按照工厂映像网站中的步骤操作后,payload.txt 文件的内容应如下所示:

google/oriole/oriole:12/SD1A.210817.015.A4/7697517:user/release-keys
4d5e41b7c675a821de81f7d2c744623fe808c8c2d3e19a83e894dab5d0829dbe
从 Pixel 出厂映像网站中提取 VBMeta 摘要和 build 指纹

Pixel 出厂映像网站下载出厂映像后,您需要解压缩下载的文件,系统会在原地创建另一个文件夹。前往新创建的文件夹,然后解压缩关联的 image-*.zip 文件以获取各个 *.img 文件。这些二进制文件是分区映像。确保 img 文件中存在 vbmeta.img 文件。您应该会看到与以下类似的内容:

computer:oriole-sd1a.210817.015.a4$ unzip image-oriole-sd1a.210817.015.a4.zip
Archive:  image-oriole-sd1a.210817.015.a4.zip
  inflating: android-info.txt
  inflating: boot.img
  inflating: vendor_boot.img
  inflating: system.img
  inflating: vendor.img
  inflating: product.img
  inflating: system_ext.img
  inflating: system_other.img
  inflating: dtbo.img
  inflating: vbmeta_system.img
  inflating: vbmeta.img
  inflating: super_empty.img

您可以从所有下载的文件中提取 build 指纹并计算 VBMeta 摘要。

avbtool.py 提供给 $PATH 后,您可以从终端发出以下命令,以提取 build 指纹并计算您刚刚下载的原始映像的 VBMeta 摘要:

computer:dir_containing_unzipped_factory_image~$ grep -a 'ro\..*build\.fingerprint=google/.*/release-keys' system.img | cut -f2 -d'='
google/oriole/oriole:12/SD1A.210817.015.A4/7697517:user/release-keys
computer:dir_containing_unzipped_factory_image$ avbtool.py calculate_vbmeta_digest --image vbmeta.img
4d5e41b7c675a821de81f7d2c744623fe808c8c2d3e19a83e894dab5d0829dbe
手动验证下载的出厂映像

为了正确验证下载的工厂映像,您需要下载 fbpacktool.py 及其依赖的另外两个 Python 文件(fbpack.pypackedstruct.py),以解压缩 bootloader.img 中的组件,因为它们在 VBMeta 结构体中分别进行了描述。有了解压缩程序后,您就可以使用 fbpacktool.py 解压缩引导加载程序映像。例如:

computer:dir_containing_unzipped_images$ python3 fbpacktool.py unpack bootloader-oriole-slider-1.0-7683913.img

您应该会在该目录中看到其他 .img 文件。 现在,您可以继续使用 avbtool.py 手动验证各个分区的签名是否匹配。

computer:dir_containing_unzipped_images$ avbtool.py verify_image --image vbmeta.img --follow_chain_partitions
Verifying image vbmeta.img using embedded public key
vbmeta: Successfully verified SHA256_RSA4096 vbmeta struct in vbmeta.img
vbmeta_system: Chained but ROLLBACK_SLOT (which is 1) and KEY (which has sha1 df529646b7225015196a714006346f0768b87fcf) not specified
--
Verifying image vbmeta_system.img using embedded public key
vbmeta: Successfully verified SHA256_RSA4096 vbmeta struct in vbmeta_system.img
product: Successfully verified sha256 hashtree of product.img for image of 2700468224 bytes
system: Successfully verified sha256 hashtree of system.img for image of 878493696 bytes
system_ext: Successfully verified sha256 hashtree of system_ext.img for image of 251334656 bytes
vbmeta_vendor: Chained but ROLLBACK_SLOT (which is 3) and KEY (which has sha1 85322346680a860c091fa14a64cef1fe4a3ffe31) not specified
--
Verifying image vbmeta_vendor.img using embedded public key
vbmeta: Successfully verified SHA256_RSA4096 vbmeta struct in vbmeta_vendor.img
vendor: Successfully verified sha256 hashtree of vendor.img for image of 472940544 bytes
boot: Chained but ROLLBACK_SLOT (which is 2) and KEY (which has sha1 85322346680a860c091fa14a64cef1fe4a3ffe31) not specified
--
Verifying image boot.img using embedded public key
vbmeta: Successfully verified footer and SHA256_RSA4096 vbmeta struct in boot.img
boot: Successfully verified sha256 hash of boot.img for image of 24481792 bytes
abl: Successfully verified sha256 hash of abl.img for image of 1744896 bytes
bl1: Successfully verified sha256 hash of bl1.img for image of 12288 bytes
bl2: Successfully verified sha256 hash of bl2.img for image of 544768 bytes
bl31: Successfully verified sha256 hash of bl31.img for image of 86016 bytes
dtbo: Successfully verified sha256 hash of dtbo.img for image of 2152234 bytes
gsa: Successfully verified sha256 hash of gsa.img for image of 262144 bytes
ldfw: Successfully verified sha256 hash of ldfw.img for image of 4096000 bytes
pbl: Successfully verified sha256 hash of pbl.img for image of 49152 bytes
tzsw: Successfully verified sha256 hash of tzsw.img for image of 4304896 bytes
vendor_boot: Successfully verified sha256 hash of vendor_boot.img for image of 25718784 bytes
vendor_dlkm: Successfully verified sha256 hashtree of vendor_dlkm.img for image of 54505472 bytes

如果您没有看到任何错误或失败消息,则表示下载的映像的 VBMeta 现已成功验证。

自动构建载荷

为方便起见,我们还提供了一个可供您使用的 Python 脚本。借助此工具,您只需指定出厂映像的网址,而无需手动提取和解压缩文件。

computer:dir_to_avb_repo/tools/transparency$ python3 ./pixel_factory_image_verify.py https://dl.google.com/dl/android/aosp/oriole-sd1a.210817.015.a4-factory-074b7f51.zip
Fetching file from: https://dl.google.com/dl/android/aosp/oriole-sd1a.210817.015.a4-factory-074b7f51.zip
Successfully downloaded file.
Successfully unpacked factory image.
Successfully unpacked factory image partitions.
Successfully unpacked bootloader image.
Successfully verified VBmeta.
Successfully extracted build fingerprint.
Successfully calculated VBMeta Digest.
The build fingerprint for factory image is: google/oriole/oriole:12/SD1A.210817.015.A4/7697517:user/release-keys
The VBMeta Digest for factory image is: 4d5e41b7c675a821de81f7d2c744623fe808c8c2d3e19a83e894dab5d0829dbe

A corresponding "payload.txt" file has been created.

执行上述命令将下载出厂映像软件包、解压缩软件包,并验证已签名分区的签名。验证成功后,它将创建一个名为 payload.txt 的新文件,其内容应如下所示:

google/oriole/oriole:12/SD1A.210817.015.A4/7697517:user/release-keys
4d5e41b7c675a821de81f7d2c744623fe808c8c2d3e19a83e894dab5d0829dbe

成功创建 payload.txt 后,您可以开始验证图片包含情况步骤。

验证图片包含情况(包含证明)

构建好载荷后,设置一个 shell 变量(例如 $PAYLOAD_PATH),使其指向载荷的路径。

包含证明工具已发布到 Android 开源项目内的 avb 代码库。如需运行该测试,请执行以下操作:

computer:external/avb/tools/transparency/verify$ PAYLOAD_PATH=../payload.txt
computer:external/avb/tools/transparency/verify$ go build cmd/verifier/verifier.go
computer:external/avb/tools/transparency/verify$ ./verifier --payload_path=${PAYLOAD_PATH} --log_type=pixel

验证程序使用检查点和日志内容(位于功能块目录中)检查您的图片载荷是否在透明度日志中,即是否由 Google 发布。

该命令的输出会写入 stdout:

  • OK. inclusion check success!(如果日志中包含图片)
  • FAILURE