APK signature scheme v3.1

Ringkasan

Android 13 mendukung APK Signature Scheme v3.1, yang merupakan peningkatan pada APK signature scheme v3 yang sudah ada. Skema v3.1 membahas beberapa masalah umum pada APK Signature Scheme v3 terkait rotasi. Secara khusus, skema tanda tangan v3.1 mendukung penargetan versi SDK, yang memungkinkan rotasi untuk menargetkan rilis platform selanjutnya.

Skema tanda tangan v3.1 menggunakan ID blok yang tidak dikenali di Android 12 atau yang lebih rendah. Oleh karena itu, platform ini menerapkan perilaku penanda tangan berikut ini:

  • Perangkat yang menjalankan Android 13 atau yang lebih baru menggunakan penanda tangan yang dirotasi di blok v3.1.
  • Perangkat yang menjalankan versi Android yang lebih lama mengabaikan penanda tangan yang dirotasi dan menggunakan penanda tangan asli dalam blok v3.

Aplikasi yang belum merotasi kunci penandatanganannya tidak memerlukan tindakan tambahan. Setiap kali aplikasi ini memilih untuk merotasi, sistem akan menerapkan skema tanda tangan v3.1 secara default.

Blok penandatanganan v3.1

Blok penandatanganan v3.1 akan memiliki konten yang sama dengan blok penandatanganan v3, tetapi dengan ID blok baru, tanda tangan ini hanya akan dikenali di perangkat yang menjalankan Android 13 dan yang lebih baru. Hal ini memungkinkan aplikasi merotasi kunci penandatanganan dengan aman tanpa perlu khawatir dengan APK multi-target karena penanda tangan asli dapat digunakan untuk menandatangani APK di blok penandatanganan v3 dan penanda tangan yang dirotasi di blok penandatanganan v3.1. Hal ini juga memungkinkan platform menggunakan kembali semua kode verifikasi yang ada untuk blok penandatanganan v3 saat memverifikasi tanda tangan v3.1.

Secara default, library apksig akan menggunakan blok penandatanganan v3.1 setiap kali kunci dan garis keturunan yang dirotasi disediakan dalam konfigurasi penandatanganan. Jika minSdkVersion aplikasi kurang dari Android 13 dan kunci yang dirotasi sedang digunakan, kunci penandatanganan asli juga harus ditentukan agar dapat digunakan untuk menandatangani APK di blok penandatanganan v3. Hal ini mirip dengan perilaku saat ini, yaitu penanda tangan asli diperlukan jika APK menargetkan versi yang lebih lama dari Android 9.

Untuk mendukung rotasi kunci penargetan mulai dari versi SDK tertentu, library apksig akan mengekspos API baru yang akan memungkinkan penetapan versi SDK minimum untuk rotasi. Jika versi SDK kurang dari Android 13 ditentukan sebagai versi minimum untuk dukungan rotasi, maka blok v3 asli akan digunakan. Blok penandatanganan v3.1 hanya digunakan jika ada rotasi dengan versi SDK minimum untuk rotasi ditetapkan ke Android 13 dan yang lebih baru. Blok penandatanganan v3 akan memiliki atribut baru untuk perlindungan penghapusan versi SDK minimum rotasi.

APK Menyertakan Lineage Nilai rotation-min-sdk-version Blok penandatanganan v3 Blok penandatanganan v3.1
Tidak Nilai default atau nilai apa pun (diwakili oleh x di bawah) Ditandatangani dengan penanda tangan asli, menargetkan Android 9 dan yang lebih baru Tidak ada
Ya Default Ditandatangani dengan penanda tangan asli, menargetkan Android 9 hingga 12L Ditandatangani dengan penanda tangan yang dirotasi, menargetkan Android 13 dan yang lebih baru
Ya x < 33 (Android 13) Ditandatangani dengan penanda tangan yang dirotasi, yang menargetkan Android 9 dan yang lebih baru Tidak ada
Ya x >= 33 (Android 13) Ditandatangani dengan penanda tangan asli, menargetkan Android 9 - (x-1) Ditandatangani dengan penanda tangan yang dirotasi, menargetkan x+

Masalah terkait rotasi

Masalah terkait rotasi berikut telah diselesaikan di platform:

Perbaikan Android 12

  • Platform hanya akan memberikan izin tanda tangan ke aplikasi yang meminta jika penanda tangan saat ini dari salah satu aplikasi berada dalam urutan penandatanganan, atau merupakan penanda tangan saat ini, dari aplikasi lain; hal ini mencegah pemberian izin tanda tangan ke aplikasi yang meminta jika kedua aplikasi mengikuti praktik terbaik kunci penandatanganan dan beralih ke kunci penandatanganan yang berbeda.
  • Fitur rollback APK platform tidak dapat melakukan rollback APK yang baru saja melakukan rotasi kunci penandatanganannya, kecuali jika kunci sebelumnya dalam lini penandatanganan memiliki kemampuan rollback, tetapi kemampuan ini mengalahkan tujuan rotasi karena memungkinkan update paket baru ditandatangani oleh kunci penandatanganan sebelumnya dan melakukan rollback kunci yang dirotasi.
  • APK yang ditandatangani hanya dengan kunci yang dirotasi dan kemudian diupdate dengan APK yang ditandatangani dengan kunci asli dan kunci yang dirotasi dalam lineage hanya akan menampilkan kunci yang dirotasi dalam lineage di perangkat yang menjalankan Android 11 dan yang lebih lama.

Perbaikan Android 11

  • PackageManager#checkSignatures tidak diperbarui dengan benar untuk memeriksa kunci penandatanganan asli dari dua paket. Hal ini merusak instrumentasi untuk aplikasi yang menggunakan kunci penandatanganan yang dirotasi dengan APK instrumentasi yang menggunakan kunci penandatanganan asli.
  • Paket dalam sharedUserId berbagi garis keturunan penandatanganan. Setiap kali aplikasi dengan lini keturunan penandatanganan yang diperbarui diinstal atau diupdate di sharedUiserId, lini keturunan aplikasi tersebut akan menggantikan lini keturunan bersama untuk sharedUserId (yaitu, jika lini keturunan penandatanganan aplikasi adalah A -> B, dan aplikasi diupdate di sharedUserId dengan lini keturunan B -> C, maka lini keturunan sharedUserId akan diganti dengan B -> C). Demikian pula, kemampuan penanda tangan sebelumnya dalam garis keturunan tidak dapat diperbarui kecuali jika garis keturunan penanda tangan diubah.

Integrasi v4

Skema tanda tangan v4 menggunakan konfigurasi penandatanganan yang disediakan untuk apksigner; dalam hal beberapa konfigurasi penandatanganan yang disediakan untuk rotasi, konfigurasi penandatanganan terbaru yang dirotasi akan digunakan. Sebelum diperkenalkannya v3.1, v3 hanya menyertakan konfigurasi penandatanganan yang dirotasi terbaru ini, sehingga v4 dapat menggunakan konfigurasi ini apa adanya; dengan hal ini, skema tanda tangan v4 dapat mendukung rotasi karena menggunakan kunci penandatanganan yang dirotasi di SigningInfo-nya. Meskipun SigningInfo v4 tidak menyertakan lineage penandatanganan lengkap, SigningInfo v4 dapat mengambilnya dari blok penandatanganan v3 untuk mengizinkan platform mengakses lineage untuk kueri tanda tangan apa pun. Jika v3.1 digunakan untuk menargetkan rotasi untuk rotation-min-sdk-version yang disediakan, konfigurasi v3 generik akan menyertakan konfigurasi penanda tanganan asli serta konfigurasi penanda tanganan yang dirotasi terbaru. Ekstensi skema tanda tangan v4 telah dibuat yang menyertakan blok info penandatanganan tambahan untuk setiap konfigurasi penandatanganan dari blok v3.1.

Validasi

Untuk menguji penerapan v3.1, jalankan pengujian CTS PkgInstallSignatureVerificationTest.java di cts/hostsidetests/appsecurity/src/android/appsecurity/cts/.

Untuk informasi selengkapnya tentang pengujian, lihat bagian verifikasi di v3.