確認方法

このページでは、Google Pixel デバイスで正規バージョンの Google Pixel イメージを実行できるようにする方法(信頼度が最も高い方法)について説明します。これには、ファクトリー イメージをパソコンにダウンロードし、ダウンロードしたアーティファクトに対してログ包含証明を実行してから、デバイスに書き込む必要があります。

Google Pixel のファクトリ イメージを確認する方法

検証の前提条件

ダウンロードしたばかりのファクトリ イメージが Google の申し立てに沿っていることを確認する前に、ネットワークに接続されたパソコンから次の操作を行う必要があります。

Golang

検証ツールは Go で記述されています。ビルドするには、Go サイトから Go 1.17 以降をインストールします。

wget または curl

wgetcurl は、インターネットからファイルを取得またはダウンロードするために使用できるツールです。このガイドの残りの部分と提供されるスクリプトは、これらのツールのいずれかが存在することを前提としているため、これらのツールのいずれかをシステムにインストールしてください。

Avbtool

avbtool は、出荷時の画像の VBMeta ダイジェストの計算とバイナリの検証に使用されます。

以下のコマンドを使用して AOSP リポジトリからダウンロードできます。詳細については、リンク先のドキュメントをご覧ください。

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

そのリポジトリのクローンを作成すると、avbtool.py はクローンされた avb リポジトリ ディレクトリ内にあります。また、このディレクトリを $PATH 環境変数に追加する必要があります。

computer:~$ PATH=$PATH:DIRECTORY_CONTAINING_AVBTOOL

インクルージョン証明書の検証

包含証明書検証ツールは、Google Pixel Factory の画像透明性ログにクエリを実行し、画像がログに含まれているかどうかを出力する Go モジュールです。

上記の AVB リポジトリのクローンを作成すると、検証ツールのソースコードが tools/transparency/verify/ にあります。

Fbpacktool

fbpacktool は、Google Pixel の bootloader.img 内の個々のコンポーネントを解凍するために使用される Python スクリプトです。このツールは、avbtool.py が検証に必要な画像を見つけられるようにするために重要です。

このツールを使用するには、次の 3 つの Python スクリプトを avbtool.py が存在するディレクトリにダウンロードし、fbpacktool.py を実行可能にして、fbpacktool という名前のシンボリック リンクを fbpacktool.py に作成します。

wget がある場合は、次のコマンドを実行して 3 つのスクリプトをダウンロードできます。

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 がある場合は、次のコマンドを実行して 3 つのスクリプトをダウンロードできます。

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

検証用のペイロードを作成する

デバイス上にあるイメージまたは Google Pixel ファクトリー イメージのウェブサイトからダウンロードしたイメージを検証するには、まず、Build Fingerprint と VBMeta Digest からそのイメージに対応するペイロードを作成する必要があります。手動と自動の 2 つのオプションがあります。以下で説明します。

  • ビルドフィンガープリント: ファクトリー イメージの文字列 ID
    • 例: google/oriole/oriole:12/SD1A.210817.015.A4/7697517:user/release-keys
  • VBMeta ダイジェスト: ファームウェア イメージのさまざまな部分を結び付ける SHA-256 暗号ダイジェスト
    • 例: 4d5e41b7c675a821de81f7d2c744623fe808c8c2d3e19a83e894dab5d0829dbe

手動ペイロードの作成

検証用のペイロードを手動で生成するには、テキスト ファイル payload.txt を作成し、1 行目にビルド フィンガープリント、次の行に VBMeta ダイジェストを含めます。空の新しい行を追加します(正確な形式については、ログの内容のセクションをご覧ください)。

Factory Image ウェブサイトの手順に沿って操作すると、payload.txt ファイルの内容は次のようになります。

google/oriole/oriole:12/SD1A.210817.015.A4/7697517:user/release-keys
4d5e41b7c675a821de81f7d2c744623fe808c8c2d3e19a83e894dab5d0829dbe
Google Pixel のファクトリー イメージ ウェブサイトから VBMeta ダイジェストとビルド フィンガープリントを抽出する

Google 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

ダウンロードしたすべてのファイルからビルドフィンガープリントを抽出し、VBMeta ダイジェストを計算できます。

avbtool.py$PATH で使用可能になったら、ターミナルから次のコマンドを実行してビルドフィンガープリントを抽出し、ダウンロードしたばかりのファクトリ イメージの 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 と、それに依存する他の 2 つの 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 スクリプトも用意されています。このツールを使用すると、ファイルを手動で取得して解凍するのではなく、工場出荷時の画像の URL を指定するだけで済みます。

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 が正常に作成されたら、画像の包含の検証の手順を開始できます。

画像の包含を確認する(包含の証明)

ペイロードを作成したら、ペイロードのパスを参照するようにシェル変数($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 です。