このページでは、Android デバイスにインストールされている APK が、申立人モデルで行われた申し立てに対応していることを確認するためのさまざまな方法について説明します。これには、対象の APK をデバイスから取得し、コードの整合性を確認して、抽出されたアーティファクトに対してログ包含証明を実行することが含まれます。
適格性の確認プロセス
透明性ログは、ハッシュで構成される Merkle ツリーで実装されます。リーフノードにはデータが含まれ、親ノードには子のハッシュが含まれます。
基本的に、マークルツリーに対して 2 つの計算(包含証明と整合性証明)が実行され、透明性ログの改ざん防止プロパティが検証されます。前者は、ログに特定の APK バージョンに対応するエントリが含まれていることを証明します。ログエントリにはハッシュが含まれます。これは、JSON Web Token(JWT)形式のコード署名トークンの SHA256 ダイジェストです。これは、対応する APK から取得できます。後者は、新しいエントリがツリーに追加されたときに、新しいチェックポイントが以前のバージョンのツリーと(暗号的に)整合していることを証明します。
カバーされている APK を確認するには、目撃されたチェックポイントに基づいて包含証明テストを実行します。Google は、標準化された証人プロトコルを使用して、このログを公開証人ネットワークと統合する予定です。これにより、ログの一貫性が保証される、監視対象のチェックポイントが提供されます。
デバイスにインストールされている APK が、申立人モデルで申し立てられている内容に準拠していることを確認するには、以下の説明を参照してください。
インクルージョンの証明
Android ユーザーは、まず APK と関連するメタデータを抽出し、再計算されたルートハッシュを公開済みのチェックポイントに含まれるルートハッシュと比較することで、デバイス上の対象 APK がログに含まれていることを確認できます。一致する場合、Android ユーザーは脅威モデルで説明されている保護を享受できます。
ログに APK が含まれていることを確認する方法
前述のように、現在カバーされている APK のリストは、[概要] ページに表示されます。
検証の前提条件
デバイスから抽出した APK が Google の申し立てに沿っていることを確認する前に、ネットワークに接続されたパソコンから次のツールをインストールする必要があります。
Android Debug Bridge(ADB)
ADB
は Android デバイスと通信するツールで、Android SDK Platform Tools のウェブサイトで入手できます。
bundletool
bundletool
は、Android App Bundle(AAB)のビルドに使用されるツールです。また、AAB をデバイスにインストールできる APK に変換するためにも使用できます。GitHub からダウンロードできます。
Androguard
Androguard は、APK の分析に使用されるツールの集合です。Androguard のウェブサイトからダウンロードしてインストールできます。
インクルージョン証明書の検証
これは、Android オープンソース プロジェクト(AOSP)内の git リポジトリ avb
に公開された Go モジュールです。Google System Services APK の透明性ログをクエリし、パッケージがログに含まれているかどうかを出力できます。使用方法の例については、後述のセクションをご覧ください。
このツールをダウンロードするには、まず avb
リポジトリのクローンを作成する必要があります。
computer:~$ git clone https://android.googlesource.com/platform/external/avb
検証ツールのソースコードは、avb
リポジトリ内の tools/transparency/verify
にあります。
検証用のペイロードを作成する
デバイスから抽出した APK が Google の申し立てに沿ったものであることを確認するには、APK から取得した情報からログ ペイロードを作成する必要があります。
始める前に、デバイスで adb デバッグを有効にして、デバイスで adb
を使用できることを確認します。
次に、デバイスに APK がインストールされている場所を探します。このガイドでは、Android System Key Verifier APK(com.google.android.contactkeys)をサンプルとして使用します。
computer:~$ adb shell pm list packages -f | grep contactkeys
package:/data/app/~~i5WYSO4PuAAv798-eHdM7A==/com.google.android.contactkeys-PQCKjnn7xDqjeVhcUDibBA==/base.apk=com.google.android.contactkeys
Android System Key Verifier APK がデバイスにインストールされている場合、上記のコマンドは、デバイスにインストールされている場所を示すパスを返します。そうでない場合、出力は表示されません。
次に、このコマンドを使用して Android デバイスから作業中のパソコンに APK をダウンロードします(デバイス上の実際の場所と APK ファイル名は異なる場合があります)。
computer:~$ mkdir -p /tmp/testdir && cd /tmp/testdir
computer:/tmp/testdir$ adb pull /data/app/~~i5WYSO4PuAAv798-eHdM7A==/com.google.android.contactkeys-PQCKjnn7xDqjeVhcUDibBA==/base.apk ./contactkeys_candidate.apk
ダウンロードした APK のパッケージ名を取得して確認するには、まず APK を解凍する必要があります。APK は特別な種類の ZIP ファイルであるためです。
computer:/tmp/testdir$ mkdir extracted && unzip contactkeys_candidate.apk -d extracted/
このステップでは、APK を構成するすべてのファイルを解凍します。パッケージ名とバージョンは、APK のマニフェストで確認できます。通常は AndroidManifest.xml
という名前のファイルにあります。
ただし、取得したマニフェスト ファイルはバイナリ形式であり、人間が読み取ることはできません。バイナリ XML を人間が読める形式に変換するには、androguard
スイート(前提条件に記載されているようにインストールされている必要があります)の axml
ツールを使用します。
computer:/tmp/testdir$ androguard axml extracted/AndroidManifest.xml
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="1413" android:versionName="1.48.688082145" android:compileSdkVersion="35" android:compileSdkVersionCodename="VanillaIceCream" android:requiredSplitTypes="" android:splitTypes="" package="com.google.android.contactkeys" platformBuildVersionCode="35" platformBuildVersionName="VanillaIceCream">
上記の出力から、この APK のパッケージ名が com.google.android.contactkeys
で、バージョン番号(versionCode)が 1413
であることがわかります。
次に、APK 内でコード透明性署名を検索します。APK から抽出された他のファイルとともに、META-INF
フォルダ内に code_transparency_signed.jwt
という名前のファイルが含まれている必要があります。
computer:/tmp/testdir$ sha256sum extracted/META-INF/code_transparency_signed.jwt
1779a2aee029112c2c9bfc9390b9678f3e5f4595b39705e8528dd522e8042f11 code_transparency_signed.jwt
このハッシュ文字列により、ログ コンテンツ セクションで説明されている形式に従ってログ ペイロードを組み立てるために必要なすべての情報が揃いました。この例では、対応するログ ペイロードは次のようになります。
1779a2aee029112c2c9bfc9390b9678f3e5f4595b39705e8528dd522e8042f11
SHA256(Signed Code Transparency JWT)
com.google.android.contactkeys
1143
また、パッケージ バージョンの後の改行文字にも注意してください。
コンテンツを payload.txt
などのファイルに保存できます。これは、後で包含証明テストを行う際に役立ちます。
APK コード署名の真正性を検証する
次に、APK に埋め込まれたコード署名トークンの真正性を確認する必要があります。これを行うには、bundletool
と、最初に署名に使用された鍵ペアの公開鍵を使用します。各 APK の各セクション内に公開されます。公開鍵証明書(Android System Key Verifier など)を signing_cert_pubkey.pem
というファイルに保存したと仮定して、以下のガイドに沿ってコード署名の検証を行います。
まず、ZIP アーカイブを作成し、候補の APK を ZIP アーカイブに追加する必要があります。
computer:/tmp/testdir$ zip -u test.zip contactkeys_candidate.apk
zip warning: test.zip not found or empty
adding: contactkeys_candidate.apk (deflated 58%)
computer:/tmp/testdir$ file test.zip
test.zip: Zip archive data, at least v2.0 to extract, compression method=deflate
これで、bundletool
の check-transparency
コマンドを使用して、候補の APK に埋め込まれたコード署名が公開されている署名と一致するかどうかを確認できるようになりました。
computer:/tmp/testdir$ java -jar BUNDLETOOL_INSTALL_PATH/bundletool-all-version.jar check-transparency \
--mode=apk \
--apk-zip=test.zip \
--transparency-key-certificate=signing_cert_pubkey.pem
APK signature is valid. SHA-256 fingerprint of the apk signing key certificate (must be compared with the developer's public key manually): D9 E1 73 5B 2A 39 51 27 3A 87 35 B7 66 9E F1 9E F5 3A F1 C1 27 5C BA 31 39 3C 18 40 8B 03 79 D0
Code transparency signature verified for the provided code transparency key certificate.
Code transparency verified: code related file contents match the code transparency file.
上のコマンドの出力で、コード透明性シグネチャとコード透明性の両方が検証されていることを確認する必要があります。一致しない場合(Code transparency verification failed because the provided public key
certificate does not match the transparency file
などの出力が表示される場合など)は、対象の APK のコード整合性が侵害されている可能性があるため、APK を信頼しない必要があります。正しい公開鍵証明書と照合していることを再度確認してください。それ以外の場合は、他のすべてが確認済みであれば、検証対象の APK のコード署名の真正性が検証されていることを意味します。
パッケージの包含の確認(包含証明)
前述で作成したペイロードを使用して、対象のパッケージが透明性ログに含まれているかどうかをテストする準備が整いました。
包含証明ツールは、Android オープンソース プロジェクト内の avb
リポジトリで公開されています。実行するには:
computer:external/avb/tools/transparency/verify$ PAYLOAD_PATH=PATH_TO_PAYLOAD_DIR/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=google_system_apk
検証ツールは、対応するチェックポイントとログの内容(タイル ディレクトリにある)を使用して、APK ペイロードが透明性ログに含まれていることを確認します。これにより、APK が実際に Google によって公開されていることを確認します。
コマンドの出力は stdout に書き込まれます。
OK. inclusion check success!
パッケージのコードがログに含まれている場合FAILURE
です。