Pixel 二进制透明度技术详情页面

Pixel 二进制透明度日志利用了透明度日志技术。

透明度日志的实用性已通过 证书透明度得到证明。证书透明度是一种互联网 协议,要求证书授权机构将颁发的证书发布到公共证书透明度日志中。此过程大大减少了证书的错误颁发,从而提高了互联网的安全性。transparency.dev

透明度日志通过 Merkle 树实现。本页面假定您对 Merkle 树和二进制透明度有一般了解。如需大致了解 Merkle 树,请参阅 可验证数据结构 ;如需大致了解二进制 透明度,请参阅 着陆页

日志实现

Pixel 二进制透明度日志以 基于图块的 Merkle 树实现。图块内容的根目录位于 https://developers.google.com/android/binary_transparency/tile。注意:这不是常规网页;其子目录中包含的日志条目应使用 Golang SumDB TLog 库以编程方式读取,而不是通过浏览器读取。

如需了解条目包含的内容,请参阅日志内容,其中 描述了条目包含的内容。

日志的 Merkle 树根哈希(包含在 检查点中)位于 https://developers.google.com/android/binary_transparency/checkpoint.txt。 它以 检查点格式呈现。 此 Merkle 树的叶子位于 https://developers.google.com/android/binary_transparency/image_info.txt。 检查点的签名可以使用以下公钥进行验证:

-----BEGIN CERTIFICATE-----
MIICPDCCAeOgAwIBAgIVAPooxISw/nFF/dPwmCUaV36Z4s3hMAoGCCqGSM49BAMCMHQxCzAJBgNV
BAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1Nb3VudGFpbiBWaWV3MRQwEgYD
VQQKEwtHb29nbGUgSW5jLjEQMA4GA1UECxMHQW5kcm9pZDEQMA4GA1UEAxMHQW5kcm9pZDAgFw0y
MTA3MTkyMjQxNDFaGA8yMDUxMDcxOTIyNDE0MVowdDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCkNh
bGlmb3JuaWExFjAUBgNVBAcTDU1vdW50YWluIFZpZXcxFDASBgNVBAoTC0dvb2dsZSBJbmMuMRAw
DgYDVQQLEwdBbmRyb2lkMRAwDgYDVQQDEwdBbmRyb2lkMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcD
QgAEU83uXNUiTYE53c2TfdWmqpW20bBXy4KEf5Ff8dV8GLKlVAXKHyjw3Lp9J3E0yCRJ/39XKeuA
AMF7KzSvhD248KNQME4wDAYDVR0TBAUwAwEB/zAdBgNVHQ4EFgQUHRpvuNkzjtBY213BWgUyWWHm
3VYwHwYDVR0jBBgwFoAUHRpvuNkzjtBY213BWgUyWWHm3VYwCgYIKoZIzj0EAwIDRwAwRAIgZsZb
CNBXRkCKLS+LG/41VWj1cTszt9QCdJQNuy7aT94CIDPgn7v5b1ykBVUTuLgRSofxAzHg9R4dg1oA
7tTFAuDg
-----END CERTIFICATE-----

验证过程会从日志中读取检查点和包含日志条目的图块。

验证流程

透明度日志通过由哈希组成的 Merkle 树实现。叶子节点包含数据,父节点包含其子节点的哈希。

系统会对 Merkle 树执行两项计算,以验证透明度日志的防篡改属性:包含证明和一致性证明。前者证明日志包含与映像版本对应的条目, 即日志条目包含 VBMeta 摘要( 表示操作系统映像的哈希,可以从设备返回)。后者证明,当向树中添加新条目时,新检查点与树的先前版本保持一致。

如需验证 Pixel 映像,请执行包含证明。执行一致性证明计算是可选的,因为第三方会不断执行此操作。

如果您想熟悉 Pixel 二进制透明度中的验证概念,可以按照以下说明使用在 Pixel 设备上运行的映像。如果您想以最高的 置信度运行 Pixel 固件,请参阅 Pixel 二进制透明度完整验证中的验证流程。

通过验证需要满足的前提条件

在继续验证工件(固件或 APK)是否符合声明之前,请确保网络连接的计算机上提供以下工具。 根据验证目标,您可能不需要所有这些工具。

Golang

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

Android 调试桥 (ADB)

ADB 是一种与 Android 设备通信以检查映像或 提取 APK 的工具,可在 Android SDK 平台工具 网站上找到。

包含证明验证程序

包含证明验证程序是一个 Go 模块,用于查询透明度日志并输出工件是否包含在日志中。 它发布在 android-binary-transparency GitHub 代码库中,网址为 https://github.com/android/android-binary-transparency/tree/main

如需克隆 AOSP avb 代码库,请执行以下操作:

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

如需克隆 android-binary-transparency GitHub 代码库,请执行以下操作:

computer:~$ git clone https://github.com/android/android-binary-transparency

AAPT2

AAPT2(Android 资源打包工具)是一种构建工具,用于编译和打包 Android 应用的资源。 您可以在 Android SDK Build Tools 26.0.2 及更高版本中找到作为独立工具提供的 AAPT2。

bundletool

bundletool 是一种用于构建 Android App Bundle (AAB) 的工具。它还可用于验证 APK 代码签名。 您可以从 GitHub 下载该工具。

wget 或 curl

wgetcurl 是可用于从互联网检索或下载文件的工具。 请务必安装其中一个工具,因为验证脚本可能依赖于它们。

Avbtool

avbtool 用于计算出厂映像的 VBMeta 摘要和验证 二进制文件。 克隆 avb 代码库后(如包含证明验证程序 部分所示),您可以在克隆的 avb 目录中找到 avbtool.py。 您应将此目录添加到 $PATH 环境变量中。

computer:~$ PATH=$PATH:DIRECTORY_CONTAINING_AVBTOOL

Fbpacktool

fbpacktool 是一个 Python 脚本,用于解压缩 Pixel 的 bootloader.img中的各个组件。 如果您要验证 APK,则不需要此脚本。 此工具非常重要,因为它可让 avbtool.py 发现验证所需的映像。

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

如果您有 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 所有者可以先提取相关的 元数据,然后将其重新计算的根哈希与 已发布的检查点中包含的根哈希 进行比较,以检查其映像是否在日志中。 如果它们匹配,则 Pixel 所有者可以确保获得一些保护 ,如 威胁模型中所述。

如需检查 Pixel 设备上的映像是否在透明度日志中, 请使用 adb 连接到该设备, 然后运行以下命令:

FINGERPRINT=$(adb shell getprop ro.build.fingerprint)
VBMETA_DIGEST=$(adb shell getprop ro.boot.vbmeta.digest)
LOG_ENTRY="${FINGERPRINT}\n${VBMETA_DIGEST}\n"
PAYLOAD_PATH="/tmp/log_payload.txt"
echo -e $LOG_ENTRY >> $PAYLOAD_PATH

cd avb/tools/transparency/verify/
go build cmd/verifier/verifier.go
./verifier --payload_path=$PAYLOAD_PATH

第一个节从 Pixel 设备检索元数据,格式为日志条目,并将其保存到 /tmp/log_payload.txt

第二个节运行 Android 启动时验证代码库中发布的包含证明验证程序。 此工具会计算候选日志条目的哈希,从日志中检索重新计算检查点所需的其他哈希,并将其与日志发布的检查点进行比较。

该命令的输出将写入 stdout:

  • 如果映像包含在日志中,则为 OK
  • 否则为 FAILURE

一致性证明(可选)

由于 Google 会定期发布新版本的 Pixel 出厂映像,因此透明度日志会不断增长。见证人会检查树的增长方式是否与其之前的叶子一致。 见证人会跟踪树根哈希,并通过从树中请求新的叶子哈希来计算下一个候选根哈希。为了使透明度日志具有防篡改性,必须不断检查其一致性。

透明度日志的仅追加行为会受到第三方的积极检查,因此大多数用户无需自行执行此操作,但任何人都可以监控日志的一致性。Google 已在此 GitHub 代码库中发布了见证人的开源 实现。您必须使用 特定于 Pixel 二进制透明度 (PixelBT) 日志的 配置