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 disharedUiserId
, lini keturunan aplikasi tersebut akan menggantikan lini keturunan bersama untuksharedUserId
(yaitu, jika lini keturunan penandatanganan aplikasi adalah A -> B, dan aplikasi diupdate disharedUserId
dengan lini keturunan B -> C, maka lini keturunansharedUserId
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.