Verifikasi Lengkap Transparansi Aplikasi Produk Google

Halaman ini menguraikan cara memverifikasi bahwa APK atau APEX yang diinstal di perangkat Android Anda sesuai dengan klaim yang dibuat dalam Model Pengklaim. Proses ini melibatkan penarikan APK dari perangkat Anda dan melakukan bukti penyertaan log pada artefak yang diekstrak.

Proses Verifikasi

Log transparansi diimplementasikan dengan pohon Merkle yang terdiri dari hash. Node daun berisi data, dan node induk berisi hash turunannya.

Dua komputasi mendasar memverifikasi properti anti-pemalsuan log transparansi: bukti penyertaan dan bukti konsistensi. Bukti penyertaan mengonfirmasi bahwa log menyertakan entri untuk versi APK tertentu. Entri log ini berisi hash, yang merupakan digest SHA256 dari file APK yang diinstal di perangkat. Bukti konsistensi memastikan bahwa saat entri baru ditambahkan, titik pemeriksaan baru tetap konsisten secara kriptografis dengan versi pohon sebelumnya (atau pohon tidak dirusak). Dalam panduan ini, kita akan berfokus pada proses komputasi bukti penyertaan, sekaligus mengandalkan saksi untuk terus melakukan bukti konsistensi terhadap checkpoint terbaru.

Untuk memverifikasi APK yang tercakup, lakukan bukti penyertaan terhadap titik pemeriksaan yang disaksikan. Perhatikan bahwa kami berencana mengintegrasikan log ini dengan jaringan saksi publik menggunakan protokol saksi standar. Integrasi ini akan menyediakan titik pemeriksaan yang disaksikan, yang menjamin konsistensi log.

Untuk memverifikasi bahwa aplikasi Google di perangkat Anda sesuai dengan klaim yang dibuat dalam model pelapor, ikuti langkah-langkah di bawah.

Bukti Penyertaan

Anda dapat memverifikasi bahwa APK yang dicakup di perangkat Anda ada dalam log dengan mengekstrak APK, menghitung hash-nya, dan menggunakan bukti penyertaan untuk memeriksa apakah hash tersebut ada dalam titik pemeriksaan yang dipublikasikan. Bukti penyertaan yang berhasil memberikan jaminan terhadap risiko yang dijelaskan dalam Model Ancaman, yang mengonfirmasi bahwa aplikasi adalah aplikasi Google yang sah.

Cara Memverifikasi Penyertaan APK dalam Log

Aplikasi apa pun yang mengklaim sebagai aplikasi Google pihak pertama dapat diverifikasi terhadap log ini.

Prasyarat untuk Memverifikasi

Sebelum memverifikasi APK yang diekstrak, alat berikut harus diinstal di komputer Anda:

Android Debug Bridge (ADB)

ADB adalah alat yang berkomunikasi dengan perangkat Android, tersedia di situs Android SDK Platform Tools.

AAPT2

AAPT2 (Android Asset Packaging Tool) adalah alat build yang digunakan untuk mengompilasi dan memaketkan resource aplikasi Android. Fitur ini tersedia sebagai alat mandiri di Android SDK Build Tools 26.0.2 dan yang lebih tinggi.

Golang

Alat verifikasi ditulis di Go. Untuk mem-build-nya, instal Go 1.17 atau yang lebih baru dari situs Go.

Pemverifikasi Bukti Penyertaan

Kami memublikasikan modul Go bernama verifier di repositori GitHub android-binary-transparency. Alat ini membuat kueri log transparansi APK Pihak Pertama Google untuk memeriksa apakah suatu paket disertakan.

Untuk menggunakan alat ini, clone repositori ke komputer lokal Anda terlebih dahulu:

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

Kode sumber untuk verifier dapat ditemukan dalam repositori android-binary-transparency.

Membuat Payload untuk Verifikasi

Untuk memverifikasi APK yang diekstrak, Anda harus membuat payload log menggunakan informasi yang berasal dari APK itu sendiri.

Sebelum memulai, aktifkan proses debug USB di perangkat Anda untuk mengizinkan koneksi adb.

Selanjutnya, cari APK yang diinstal di perangkat Anda. Panduan ini menggunakan APK layanan Google Play (com.google.android.gms) sebagai contoh kerja.

adb shell pm path com.google.android.gms

Anda akan melihat output yang mirip dengan berikut ini:

computer:~$ adb shell pm path com.google.android.gms
package:/data/app/~~oI3N-m7I3VNMk5eKUCscQg==/com.google.android.gms-O79jYXgqkqKaQ9IzJ5zqfA==/base.apk
package:/data/app/~~oI3N-m7I3VNMk5eKUCscQg==/com.google.android.gms-O79jYXgqkqKaQ9IzJ5zqfA==/split_CronetDynamite_installtime.apk
package:/data/app/~~oI3N-m7I3VNMk5eKUCscQg==/com.google.android.gms-O79jYXgqkqKaQ9IzJ5zqfA==/split_DynamiteLoader_installtime.apk
package:/data/app/~~oI3N-m7I3VNMk5eKUCscQg==/com.google.android.gms-O79jYXgqkqKaQ9IzJ5zqfA==/split_DynamiteModulesA_installtime.apk
package:/data/app/~~oI3N-m7I3VNMk5eKUCscQg==/com.google.android.gms-O79jYXgqkqKaQ9IzJ5zqfA==/split_DynamiteModulesC_installtime.apk
package:/data/app/~~oI3N-m7I3VNMk5eKUCscQg==/com.google.android.gms-O79jYXgqkqKaQ9IzJ5zqfA==/split_GoogleCertificates_installtime.apk
package:/data/app/~~oI3N-m7I3VNMk5eKUCscQg==/com.google.android.gms-O79jYXgqkqKaQ9IzJ5zqfA==/split_MapsDynamite_installtime.apk
package:/data/app/~~oI3N-m7I3VNMk5eKUCscQg==/com.google.android.gms-O79jYXgqkqKaQ9IzJ5zqfA==/split_MeasurementDynamite_installtime.apk
package:/data/app/~~oI3N-m7I3VNMk5eKUCscQg==/com.google.android.gms-O79jYXgqkqKaQ9IzJ5zqfA==/split_config.en.apk
package:/data/app/~~oI3N-m7I3VNMk5eKUCscQg==/com.google.android.gms-O79jYXgqkqKaQ9IzJ5zqfA==/split_config.xxhdpi.apk
package:/data/app/~~oI3N-m7I3VNMk5eKUCscQg==/com.google.android.gms-O79jYXgqkqKaQ9IzJ5zqfA==/split_maps_core_dynamite_ondemand.apk

Output ini menunjukkan bahwa satu APK dasar dan beberapa APK terpisah diinstal untuk com.google.android.gms di perangkat Anda. Jumlah pasti APK terpisah bervariasi, bergantung pada konfigurasi perangkat Anda. Setiap APK terpisah memiliki nama paket dan kode versi yang sama dengan APK dasar.

Download APK yang tercantum dari perangkat Android Anda ke komputer menggunakan perintah berikut (perhatikan bahwa jalur file Anda yang sebenarnya mungkin berbeda):

mkdir -p /tmp/testdir/gms && cd /tmp/testdir/gms && \
adb shell pm path com.google.android.gms | cut -d':' -f2 | tr -d '\r' | xargs -n1 adb pull

Untuk memverifikasi nama paket dan versi APK yang didownload, Anda harus memeriksa manifest (AndroidManifest.xml).

Karena manifes di dalam APK berformat biner, gunakan alat aapt2 (diinstal selama langkah prasyarat) untuk mengekstrak dan membaca informasi langsung dari APK:

computer:/tmp/testdir/gms$ aapt2 dump badging ./base.apk
package: name='com.google.android.gms' versionCode='260834035' versionName='26.08.34 (260400-876566425)' platformBuildVersionName='Baklava' platformBuildVersionCode='36' compileSdkVersion='36' compileSdkVersionCodename='Baklava'
minSdkVersion:'35'
targetSdkVersion:'36'
...

Anda harus mengulangi langkah ini untuk mendapatkan informasi yang relevan hingga Anda memperhitungkan semua APK terpisah yang diinstal di perangkat Anda.

Output mengonfirmasi bahwa nama paket APK adalah com.google.android.gms dan nomor versinya (versionCode) adalah 260834035.

Selanjutnya, hitung hash kriptografi setiap APK:

computer:/tmp/testdir/gms$ sha256sum *.apk
66aa2d7b9752cdd61065b55c8e16739d8367fa18a0f1c8c84122369f86958f1a  base.apk
c20754aee886cc55a9de91ee15c623c59d94ad22b7e435a1a48afc43cf1a106c  split_config.en.apk
68c09b63a1262e0d34020c139bc77deff3c32bd2b01177abac64790a62fb3be6  split_config.xxhdpi.apk
cd746820c27babd855fa5daea6fabcdf7b44abf3060bc547adc4219212410af0  split_CronetDynamite_installtime.apk
512ee48b60fdb0787a17f84a7dc448fdbf885b2b86a9cb50525d4c22d561b0f1  split_DynamiteLoader_installtime.apk
9e0c74bdc75c50c80d4e2e580a7eda6b8391423ab1161645f41ec6cadc07d678  split_DynamiteModulesA_installtime.apk
955780ac01f59b98bd9be12968f3824ad71b762620f7bf223c569c1a6ab7056c  split_DynamiteModulesC_installtime.apk
34c4a2e32d31554d55fc1519e2cfc3ed5027a090fb29b54cfc99f42d1da43bc5  split_GoogleCertificates_installtime.apk
475e18dde92472cde9d8300c082b6dc269613db03398bcd9d1987dff3e68f7b5  split_maps_core_dynamite_ondemand.apk
f83faf40f08bc13f4879302e01c08c863ca2304b4b4e7c9eaf8cd1e869bb6573  split_MapsDynamite_installtime.apk
ec6d854ddda6cd1ba2ba7af2d9fdf4f28c5c78be8713c64521c785429296738c  split_MeasurementDynamite_installtime.apk

Sekarang Anda memiliki semua informasi yang diperlukan untuk membuat payload log, yang diformat seperti yang dijelaskan di bagian Konten Log. Dengan memilih satu hash dari hasil sebagai contoh (Anda harus memverifikasi hash setiap APK terpisah), payload log akan terlihat seperti ini:

66aa2d7b9752cdd61065b55c8e16739d8367fa18a0f1c8c84122369f86958f1a
SHA256(APK)
com.google.android.gms
260834035

Pastikan Anda menyertakan karakter baris baru di akhir file. Simpan konten ini ke file, seperti payload.txt, untuk digunakan dengan alat verifier nanti.

Memverifikasi Penyertaan Paket (Bukti Penyertaan)

Setelah membuat payload, Anda kini dapat memeriksa apakah paket disertakan dalam log transparansi. Bangun alat bukti penyertaan dari repositori android-binary-transparency yang Anda clone sebelumnya:

go build cmd/verifier/verifier.go

Perintah ini akan menghasilkan file yang dapat dieksekusi bernama verifier di direktori tersebut. Jalankan verifier, berikan jalur ke payload Anda, dan tentukan jenis log:

computer:android-binary-transparency$ PAYLOAD_PATH=PATH_TO_PAYLOAD_DIR/payload.txt
computer:android-binary-transparency$ ./verifier --payload_path=${PAYLOAD_PATH} --log_type=google_1p_apk

Verifier menggunakan konten log dan titik pemeriksaan (dari direktori kartu) untuk memeriksa apakah payload APK Anda ada di log transparansi, sehingga mengonfirmasi bahwa payload tersebut dipublikasikan oleh Google.

Perintah ini menampilkan output ke stderr:

  • OK. inclusion check success! jika paket disertakan dalam log.
  • FAILURE jika tidak.

Memverifikasi Semua Paket Secara Otomatis di Perangkat

Mengingat banyaknya aplikasi Google yang mungkin telah diinstal sebelumnya di perangkat Anda, mencantumkan setiap aplikasi dan melakukan bukti penyertaan satu per satu dapat menjadi tugas yang membosankan.

Kami menyediakan alat otomatis lain yang disebut Uraniborg yang dapat mendeteksi dan mengukur semua paket yang saat ini diinstal di perangkat Anda. Alat ini memasukkan outputnya langsung ke alat verifier, sehingga Anda dapat menemukan dan memverifikasi transparansi semua aplikasi di perangkat dalam satu langkah.

Untuk menggunakan alur kerja otomatis ini, pastikan perangkat Android Anda terhubung ke komputer Anda melalui ADB. Kode sumber Uraniborg juga disertakan dalam repositori android-binary-transparency.

Jalankan skrip automate_observation.py yang ada di direktori scripts/python:

python3 automate_observation.py --pull-all-apks --perform_inclusion_proof_check --verifier_path <path_to_verifier_executable>

Setelah skrip selesai, Anda akan melihat output yang mirip dengan ini:

INFO:automate_observation.py:main(858): SUCCESS! Hubble was successfully deployed and executed on connected device ABCDEFGHN01234.
INFO:automate_observation.py:main(860): Hubble output files can be found at: /Users/user/home/src/android-binary-transparency/uraniborg/scripts/python/results/google/lynx/lynx:16/BP4A.260105.004.E1/14587043:user/release-keys/001

Buka direktori output yang ditunjukkan oleh skrip. Di dalamnya, temukan file bernama packages_with_inclusion_proof_signal.txt. File ini mencantumkan setiap paket yang diinstal bersama dengan kolom inclusion_proof_verified yang disetel ke true atau false. Nilai true menunjukkan bahwa paket telah diverifikasi secara kriptografis terhadap log transparansi, sehingga mengonfirmasi bahwa paket tersebut mematuhi klaim log.