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 dalam Model Pengklaim. Hal ini melibatkan penarikan 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 anti-manipulasi log transparansi: bukti penyertaan dan bukti konsistensi. Yang pertama membuktikan bahwa log menyertakan entri yang sesuai dengan versi APK tertentu. Entri log mencakup hash, yang merupakan digest SHA256 dari token tanda tangan kode dalam bentuk Token Web JSON (JWT), yang dapat diperoleh dari APK yang sesuai. Yang terakhir membuktikan bahwa saat entri baru ditambahkan ke pohon, titik pemeriksaan baru (secara kriptografis) konsisten dengan versi pohon sebelumnya.

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

Jika Anda ingin meyakinkan diri sendiri bahwa APK yang ada di perangkat Anda sesuai dengan klaim yang dibuat dalam model pelapor, lihat penjelasan di bawah.

Bukti Penyertaan

Pengguna Android dapat memeriksa apakah APK yang dicakup di perangkatnya ada dalam log dengan terlebih dahulu mengekstrak APK dan metadatanya yang relevan, lalu membandingkan hash root yang dihitung ulang dengan hash root yang ada dalam titik pemeriksaan yang dipublikasikan. Jika cocok, pengguna Android dapat diyakinkan 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 untuk Memverifikasi

Sebelum melanjutkan untuk memverifikasi bahwa APK yang baru saja Anda ekstrak dari perangkat Anda 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, tersedia di situs Android SDK Platform Tools.

AAPT2

AAPT2 (Android Asset Packaging Tool) adalah alat build yang digunakan untuk kompilasi dan pemaketan resource aplikasi Android. Alat ini dapat ditemukan sebagai alat mandiri di Android SDK Build Tools 26.0.2 dan yang lebih tinggi.

bundletool

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

Pemverifikasi Bukti Penyertaan

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

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 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 Anda.

Kemudian, temukan 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 penginstalannya 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 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 paket dan versi dapat ditemukan di manifest APK, yang biasanya ada dalam file bernama AndroidManifest.xml.

Namun, file manifes yang diperoleh berbentuk biner, yang tidak dapat dibaca manusia. Untuk mengonversi XML biner menjadi format yang dapat dibaca manusia, kita menggunakan alat aapt2 yang diinstal sebelumnya (sebagaimana 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 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. File tersebut harus berupa file bernama code_transparency_signed.jwt yang ada di 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 sejak awal. File tersebut dipublikasikan dalam setiap bagian APK masing-masing. Dengan asumsi 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 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 tanda tangan 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 terganggu dan Anda tidak boleh memercayai APK tersebut. Jangan lupa untuk memeriksa ulang bahwa Anda memverifikasinya terhadap sertifikat kunci publik yang benar. Jika tidak, dan jika semuanya sudah diperiksa, hal 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 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_system_apk

Verifier menggunakan titik pemeriksaan yang sesuai dan konten log (ditemukan di direktori kartu) untuk memeriksa apakah payload APK Anda ada di log transparansi, 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.