Verifikasi Lengkap Transparansi APK Layanan Sistem Google

Halaman ini menguraikan berbagai metode untuk memastikan bahwa APK yang diinstal di perangkat Android Anda sesuai dengan klaim yang dibuat di Model Penggugat. Hal ini melibatkan pengambilan APK yang dipermasalahkan dari perangkat Anda, memeriksa integritas kodenya, dan melakukan bukti penyertaan log pada artefak yang diekstrak.

Proses Verifikasi

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

Pada dasarnya, dua komputasi dilakukan pada hierarki Merkle untuk memverifikasi properti log transparansi yang tahan modifikasi: bukti penyertaan dan bukti konsistensi. Yang pertama membuktikan bahwa log menyertakan entri yang sesuai dengan versi APK tertentu. Entri log menyertakan hash, yang adalah ringkasan SHA256 dari token tanda tangan kode dalam bentuk Token Web JSON (JWT), yang dapat diperoleh dari APK yang sesuai. Hal ini membuktikan bahwa saat entri baru ditambahkan ke hierarki, titik pemeriksaan baru (kriptografis) konsisten dengan versi hierarki sebelumnya.

Untuk memverifikasi APK yang tercakup, lakukan pengujian bukti penyertaan berdasarkan checkpoint yang disaksikan. Perhatikan bahwa kami berencana untuk mengintegrasikan log ini dengan jaringan saksi publik menggunakan protokol saksi standar. Tindakan ini akan memberikan checkpoint yang diamati, yang menjamin konsistensi log.

Jika Anda ingin memastikan bahwa APK yang Anda miliki di perangkat sesuai dengan klaim yang dibuat dalam model penggugat, lihat penjelasan di bawah.

Bukti Penyertaan

Pengguna Android dapat memeriksa apakah APK yang tercakup di perangkat mereka ada dalam log dengan mengekstrak APK dan metadata yang relevan terlebih dahulu, lalu membandingkan hash root yang dihitung ulang dengan hash root yang terdapat dalam checkpoint yang dipublikasikan. Jika cocok, pengguna Android dapat yakin dengan 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 tercantum di halaman Ringkasan.

Prasyarat untuk Memverifikasi

Sebelum melanjutkan untuk memverifikasi bahwa APK yang baru saja Anda ekstrak dari perangkat sesuai dengan klaim kami, Anda memerlukan alat berikut dengan menginstalnya dari komputer yang terhubung ke jaringan.

Android Debug Bridge (ADB)

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

bundletool

bundletool adalah alat yang digunakan untuk mem-build Android App Bundle (AAB). Alat ini juga dapat digunakan untuk mengonversi AAB menjadi APK yang dapat diinstal di perangkat. File ini dapat didownload dari GitHub.

Androguard

Androguard adalah kumpulan alat yang digunakan untuk menganalisis APK. Aplikasi ini dapat didownload dan diinstal dari situs Androguard.

Pemverifikasi Bukti Penyertaan

Ini adalah modul Go yang kami publikasikan di repositori git dalam Project Open Source Android (AOSP) bernama avb. Alat ini dapat membuat kueri log transparansi APK Layanan Sistem Google dan menampilkan apakah paket disertakan dalam log. Contoh penggunaannya dapat ditemukan di bagian berikutnya.

Untuk mendownload alat ini, Anda harus meng-clone repositori avb terlebih dahulu.

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

Kode sumber verifier dapat ditemukan di tools/transparency/verify dalam repositori avb.

Membuat Payload untuk Verifikasi

Untuk memverifikasi bahwa APK yang diekstrak 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 dengan mengaktifkan proses debug adb di perangkat Anda.

Kemudian, cari lokasi APK diinstal di perangkat Anda. Untuk tujuan panduan ini, kita akan menggunakan APK Android System Key Verifier (com.google.android.contactkeys) sebagai contoh kerja kita.

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 ke komputer yang Anda gunakan menggunakan perintah ini (perhatikan bahwa lokasi sebenarnya dan nama file APK di perangkat Anda dapat bervariasi):

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 didownload, Anda harus mengekstrak APK terlebih dahulu, karena APK pada akhirnya adalah jenis file ZIP khusus.

computer:/tmp/testdir$ mkdir extracted && unzip contactkeys_candidate.apk -d extracted/

Langkah ini akan mengekstrak semua file yang membentuk APK. Nama dan versi paket dapat ditemukan di manifes APK, yang biasanya dalam file bernama AndroidManifest.xml.

Namun, file manifes yang diperoleh dalam bentuk biner, yang tidak dapat dibaca manusia. Untuk mengonversi XML biner menjadi bentuk yang dapat dibaca manusia, kita menggunakan alat axml dari suite androguard (seperti yang diperlukan untuk diinstal di bagian prasyarat).

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">

Dari output di atas, sekarang kita dapat yakin bahwa nama paket APK ini adalah com.google.android.contactkeys dan nomor versi (versionCode) adalah 1413.

Sekarang, kita akan menelusuri tanda tangan transparansi kode dalam APK. File ini 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, sekarang kita memiliki setiap bagian informasi yang diperlukan untuk menggabungkan 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 pasangan kunci yang telah digunakan untuk menandatanganinya sejak awal. File tersebut 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

Sekarang kita siap menggunakan perintah check-transparency bundletool untuk memverifikasi apakah tanda tangan kode yang disematkan dalam APK kandidat cocok dengan 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, ini berarti integritas kode APK yang dimaksud berpotensi terancam dan Anda tidak boleh memercayai APK tersebut. Pastikan untuk memeriksa kembali apakah Anda memverifikasinya dengan sertifikat kunci publik yang benar. Jika tidak, jika semuanya sudah diperiksa, ini menandakan bahwa keaslian tanda tangan kode diverifikasi untuk APK yang Anda validasi.

Memverifikasi Penyertaan Paket (Bukti Penyertaan)

Dengan menggunakan payload yang telah Anda buat sebelumnya, Anda kini siap menguji apakah paket yang dimaksud telah disertakan dalam log transparansi.

Alat bukti penyertaan telah dipublikasikan di repositori avb 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_system_apk

Pengverifikasi menggunakan titik pemeriksaan yang sesuai dan konten log (ditemukan di direktori kartu) untuk memeriksa apakah payload APK Anda ada dalam log transparansi, yang memverifikasi bahwa payload tersebut memang dipublikasikan oleh Google.

Output perintah ditulis ke stdout:

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