Halaman ini menguraikan berbagai metode untuk memastikan bahwa APK yang diinstal di perangkat Android Anda sesuai dengan klaim yang dibuat dalam Model Penggugat. Hal ini melibatkan pengambilan APK yang dimaksud dari perangkat Anda, memeriksa integritas kodenya, 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.
Pada dasarnya, dua komputasi dilakukan pada pohon Merkle untuk memverifikasi properti log transparansi yang tahan terhadap gangguan: bukti penyertaan dan bukti konsistensi. Yang pertama membuktikan bahwa log menyertakan entri yang sesuai dengan versi APK tertentu. Entri log menyertakan hash, yang merupakan ringkasan SHA256 dari token tanda tangan kode dalam bentuk JSON Web Token (JWT), yang dapat diperoleh dari APK yang sesuai. Yang kedua membuktikan bahwa saat entri baru ditambahkan ke pohon, checkpoint baru (secara kriptografi) konsisten dengan versi pohon sebelumnya.
Untuk memverifikasi APK yang tercakup, lakukan pengujian bukti penyertaan berdasarkan checkpoint yang disaksikan. Perhatikan bahwa kami berencana mengintegrasikan log ini dengan jaringan saksi publik menggunakan protokol saksi standar . Hal ini akan memberikan checkpoint yang disaksikan, yang menjamin konsistensi log.
Jika Anda ingin meyakinkan diri bahwa APK yang ada di perangkat Anda sesuai dengan klaim yang dibuat dalam model penggugat, lihat tulisan di bawah.
Bukti Penyertaan
Pengguna Android dapat memeriksa apakah APK yang tercakup di perangkatnya ada dalam log dengan terlebih dahulu mengekstrak APK dan metadata relevannya, lalu membandingkan hash root yang dihitung ulang dengan hash root yang terdapat dalam checkpoint yang dipublikasikan. Jika cocok, pengguna Android dapat yakin akan beberapa perlindungan yang dijelaskan dalam Model Ancaman.
Cara Memverifikasi Penyertaan APK Dalam Log
Seperti yang dijelaskan sebelumnya, daftar APK yang saat ini tercakup dapat ditemukan di halaman Ringkasan.
Prasyarat Verifikasi
Sebelum melanjutkan untuk memverifikasi bahwa artefak (firmware atau APK) sesuai dengan klaim, pastikan alat berikut tersedia di komputer yang terhubung ke jaringan. Bergantung pada target verifikasi, Anda mungkin tidak memerlukan semuanya.
Golang
Alat verifikasi ditulis dalam Go. Untuk mem-build-nya, instal Go 1.24 atau yang lebih baru dari situs Go.
Android Debug Bridge (ADB)
ADB adalah alat yang berkomunikasi dengan perangkat Android untuk memeriksa gambar atau
mengekstrak APK, yang tersedia di Android SDK Platform Tools situs web.
Pemverifikasi Bukti Penyertaan
Pemverifikasi bukti penyertaan adalah modul Go yang membuat kueri log transparansi dan menampilkan apakah artefak disertakan dalam log.
Modul ini dipublikasikan di repositori GitHub android-binary-transparency di
https://github.com/android/android-binary-transparency/tree/main
Untuk meng-clone repositori avb AOSP:
computer:~$ git clone https://android.googlesource.com/platform/external/avb
Untuk meng-clone repositori GitHub android-binary-transparency:
computer:~$ git clone https://github.com/android/android-binary-transparency
AAPT2
AAPT2 (Android Asset Packaging Tool) adalah alat build yang digunakan untuk mengompilasi dan memaketkan resource aplikasi Android. Alat ini dapat ditemukan sebagai alat mandiri di Android SDK Build Tools versi 26.0.2 dan yang lebih baru.
bundletool
bundletool adalah alat yang digunakan untuk mem-build Android App Bundle (AAB). Alat ini juga dapat digunakan untuk memverifikasi tanda tangan kode APK.
Alat ini dapat didownload dari GitHub.
wget atau curl
wget dan curl adalah alat yang dapat digunakan untuk mengambil atau mendownload file dari Internet. Pastikan Anda telah menginstal salah satu alat ini, karena skrip verifikasi mungkin bergantung padanya.
Avbtool
avbtool
digunakan untuk menghitung ringkasan VBMeta dari image pabrik dan verifikasi
biner.
Setelah meng-clone repositori avb (seperti yang ditunjukkan di bagian pemverifikasi Bukti Penyertaan
bagian), avbtool.py dapat ditemukan dalam direktori avb yang di-clone.
Anda harus menambahkan direktori ini ke variabel lingkungan $PATH.
computer:~$ PATH=$PATH:DIRECTORY_CONTAINING_AVBTOOL
Fbpacktool
fbpacktool
adalah skrip Python yang digunakan untuk mengekstrak komponen individual di Pixel's
bootloader.img.
Anda tidak memerlukannya jika memverifikasi APK.
Alat ini penting karena memungkinkan avbtool.py menemukan image yang diperlukan untuk verifikasi.
Untuk menggunakan alat ini, Anda harus mendownload tiga skrip Python berikut
ke direktori tempat avbtool.py berada,
membuat fbpacktool.py dapat dieksekusi,
dan membuat symlink bernama fbpacktool ke fbpacktool.py untuk memudahkan.
Jika Anda memiliki 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
Jika Anda memiliki 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 membantu melakukan berbagai operasi kriptografi menggunakan terminal dalam alur kerja verifikasi. Pastikan alat ini diinstal di sistem Anda. Anda dapat memeriksa di terminal dengan menjalankan perintah berikut dan memastikan hasil yang ditampilkan tidak kosong:
computer:~$ which openssl
/usr/bin/openssl
Membuat Payload untuk Verifikasi
Untuk memverifikasi bahwa APK yang Anda ekstrak dari perangkat sesuai dengan klaim kami, Anda harus membuat payload log dari informasi yang berasal dari APK.
Sebelum memulai, pastikan adb dapat digunakan di perangkat Anda dengan
mengaktifkan proses debug adb di
perangkat.
Kemudian, temukan tempat APK diinstal di perangkat Anda. Untuk tujuan panduan ini, kita akan menggunakan APK Android System Key Verifier (com.google.android.contactkeys) sebagai contoh kerja.
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
Jika APK Android System Key Verifier diinstal di perangkat Anda, perintah di atas akan menampilkan jalur yang menunjukkan tempat APK diinstal di perangkat Anda. Jika tidak, Anda tidak akan melihat output apa pun.
Kemudian, download APK dari perangkat Android Anda ke komputer yang Anda gunakan dengan perintah ini (perhatikan bahwa lokasi sebenarnya dan nama file APK di perangkat Anda mungkin berbeda):
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
Untuk mendapatkan dan memverifikasi nama paket APK yang baru saja Anda download, Anda harus terlebih dahulu mengekstrak APK, karena APK pada akhirnya adalah jenis file ZIP khusus.
computer:/tmp/testdir$ mkdir extracted && unzip contactkeys_candidate.apk -d extracted/
Langkah ini mengekstrak semua file yang membentuk APK. Nama dan
versi paket dapat ditemukan dalam
manifes
APK, yang biasanya berada dalam file bernama AndroidManifest.xml.
Namun, file manifes yang diperoleh berbentuk biner, yang tidak dapat dibaca oleh manusia.
Untuk mengonversi XML biner ke dalam bentuk yang dapat dibaca oleh manusia, kita menggunakan
alat aapt2 yang diinstal sebelumnya (seperti yang diperlukan untuk diinstal di bagian
prasyarat).
computer:/tmp/testdir$ aapt2 dump badging ./contactkeys_candidate.apk
package: name='com.google.android.contactkeys' versionCode='7805' versionName='1.219.791156583' platformBuildVersionName='Baklava' platformBuildVersionCode='36' compileSdkVersion='36' compileSdkVersionCodename='Baklava'
Dari output di atas, kita sekarang dapat memastikan bahwa nama paket APK ini adalah com.google.android.contactkeys dan nomor versinya (versionCode) adalah 1413.
Sekarang, kita akan menelusuri tanda tangan transparansi kode dalam APK. Tanda tangan tersebut harus berupa file bernama code_transparency_signed.jwt yang terdapat dalam folder META-INF di antara file lain yang diekstrak dari APK.
computer:/tmp/testdir$ sha256sum extracted/META-INF/code_transparency_signed.jwt
1779a2aee029112c2c9bfc9390b9678f3e5f4595b39705e8528dd522e8042f11 code_transparency_signed.jwt
Dengan string hash ini, kita sekarang memiliki setiap informasi yang diperlukan untuk menyusun payload log sesuai dengan format yang dijelaskan di bagian Konten Log. Dalam contoh ini, payload log yang sesuai akan terlihat seperti berikut:
1779a2aee029112c2c9bfc9390b9678f3e5f4595b39705e8528dd522e8042f11
SHA256(Signed Code Transparency JWT)
com.google.android.contactkeys
1143
Perhatikan juga karakter baris baru setelah versi paket.
Anda dapat menyimpan konten ke dalam file, seperti payload.txt. Hal ini akan berguna saat melakukan pengujian bukti penyertaan nanti.
Memverifikasi Keaslian Tanda Tangan Kode APK
Sekarang, kita harus memverifikasi keaslian token tanda tangan kode yang disematkan dalam APK. Untuk melakukannya, kita menggunakan bundletool dan kunci publik dari pasangan kunci yang telah digunakan untuk menandatanganinya. Keduanya dipublikasikan dalam setiap bagian APK masing-masing. Dengan asumsi bahwa Anda telah menyimpan sertifikat kunci publik
(misalnya, untuk Android System Key Verifier)
ke dalam file bernama signing_cert_pubkey.pem,
ikuti panduan di bawah untuk melakukan verifikasi tanda tangan kode.
Pertama, Anda harus membuat arsip zip dan menambahkan APK kandidat ke dalam arsip 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
Kita sekarang siap menggunakan perintah check-transparency bundletool untuk memverifikasi apakah tanda tangan kode yang disematkan dalam APK kandidat cocok dengan tanda tangan kode yang dipublikasikan.
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.
Anda harus memastikan bahwa output perintah di atas menyatakan bahwa tanda tangan transparansi kode dan transparansi kode telah diverifikasi.
Jika tidak, misalnya, jika Anda melihat output seperti
Code transparency verification failed because the provided public key
certificate does not match the transparency file,
berarti integritas kode APK yang dimaksud berpotensi
terganggu dan Anda tidak boleh mempercayai APK tersebut.
Ingatlah untuk memeriksa kembali bahwa Anda memverifikasinya terhadap sertifikat kunci publik yang benar.
Jika tidak ada masalah lain, hal ini menandakan bahwa keaslian tanda tangan kode telah diverifikasi untuk APK yang Anda validasi.
Memverifikasi Penyertaan Paket (Bukti Penyertaan)
Dengan payload yang telah Anda buat sebelumnya, Anda sekarang siap menguji apakah paket yang dimaksud telah disertakan dalam log transparansi.
Alat bukti penyertaan telah dipublikasikan di avb repositori dalam
Project Open Source Android. Untuk menjalankannya:
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_1p_code
Pemverifikasi menggunakan checkpoint yang sesuai dan konten log (yang ditemukan di direktori petak) untuk memeriksa apakah payload APK Anda ada dalam log transparansi, sehingga memverifikasi bahwa payload tersebut memang dipublikasikan oleh Google.
Output perintah ditulis ke stdout:
OK. inclusion check success!jika kode paket disertakan dalam log,FAILUREjika tidak.