APK Signature Scheme v3.1

Ringkasan

Android 13 mendukung APK Signature Scheme v3.1, yang merupakan penyempurnaan dari APK Signature Scheme v3 yang sudah ada. Skema v3.1 mengatasi 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 lebih rendah. Oleh karena itu, platform menerapkan perilaku penandatanganan berikut:

  • Perangkat yang menjalankan Android 13 atau lebih tinggi menggunakan penanda tangan yang diputar di blok v3.1.
  • Perangkat yang menjalankan Android versi lama mengabaikan penandatangan yang dirotasi dan sebagai gantinya menggunakan penanda tangan asli di blok v3.

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

v3.1 blok penandatanganan

Blok penandatanganan v3.1 akan memiliki konten yang sama dengan blok penandatanganan v3, namun dengan ID blok baru, tanda tangan ini hanya akan dikenali pada perangkat yang menjalankan Android 13 dan lebih baru. Hal ini memungkinkan aplikasi merotasi kunci penandatanganannya dengan aman tanpa perlu mengkhawatirkan 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 untuk menggunakan kembali semua kode verifikasi yang ada untuk blok penandatanganan v3 saat memverifikasi tanda tangan v3.1.

Secara default, perpustakaan apksig akan menggunakan blok penandatanganan v3.1 setiap kali kunci yang diputar dan silsilah disediakan dalam konfigurasi penandatanganan. Jika minSdkVersion aplikasi lebih kecil dari Android 13 dan kunci yang diputar digunakan, kunci penandatanganan asli juga harus ditentukan agar dapat digunakan untuk menandatangani APK di blok penandatanganan v3. Hal ini mirip dengan perilaku saat ini yang mengharuskan penandatanganan asli jika APK menargetkan versi yang lebih lama dari Android 9.

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

APK Termasuk Silsilah Nilai versi rotasi-min-sdk blok penandatanganan v3 v3.1 blok penandatanganan
TIDAK Default atau nilai apa pun (diwakili oleh x di bawah) Ditandatangani dengan penandatangan asli, menargetkan Android 9 dan lebih baru Tidak hadir
Ya Bawaan Ditandatangani dengan penandatangan asli, menargetkan Android 9 hingga 12L Ditandatangani dengan penandatangan yang dirotasi, menargetkan Android 13 dan yang lebih baru
Ya x < 33 (Android 13) Ditandatangani dengan penanda tangan yang dirotasi, menargetkan Android 9 dan yang lebih baru Tidak hadir
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 kepada aplikasi yang meminta jika salah satu penandatangan aplikasi saat ini termasuk dalam silsilah penandatanganan, atau merupakan penandatangan saat ini, dari aplikasi lain; hal ini mencegah pemberian izin tanda tangan kepada aplikasi yang meminta jika kedua aplikasi mengikuti praktik terbaik kunci penandatanganan dan merotasi ke kunci penandatanganan yang berbeda.
  • Fitur rollback APK platform tidak dapat melakukan rollback APK yang kunci penandatanganannya baru saja dirotasi kecuali kunci sebelumnya dalam silsilah penandatanganan memiliki kemampuan rollback, namun kemampuan ini menggagalkan tujuan rotasi karena memungkinkan pembaruan paket baru ditandatangani oleh kunci penandatanganan sebelumnya dan memutar kembali kunci yang diputar.
  • APK yang ditandatangani hanya dengan kunci yang diputar dan kemudian diperbarui dengan APK yang ditandatangani dengan kunci asli dan kunci yang diputar dalam silsilah hanya akan menampilkan kunci yang diputar dalam silsilah pada perangkat yang menjalankan Android 11 dan versi 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 diputar dengan APK instrumentasi yang menggunakan kunci penandatanganan asli.
  • Paket di bawah sharedUserId berbagi silsilah penandatanganannya. Setiap kali aplikasi dengan silsilah penandatanganan yang diperbarui dipasang atau diperbarui di sharedUiserId silsilah aplikasi tersebut menggantikan silsilah bersama untuk sharedUserId (yaitu, jika silsilah penandatanganan aplikasi adalah A -> B, dan aplikasi diperbarui di sharedUserId dengan silsilah B -> C, maka silsilah sharedUserId akan diganti dengan B -> C). Demikian pula kemampuan penandatangan sebelumnya dalam silsilah tidak dapat diperbarui kecuali silsilah penandatanganan diubah.

integrasi v4

Skema tanda tangan v4 menggunakan konfigurasi penandatanganan yang disediakan untuk apksigner; dalam kasus beberapa konfigurasi penandatanganan yang disediakan untuk rotasi, konfigurasi penandatanganan yang diputar terbaru akan digunakan. Sebelum diperkenalkannya v3.1, v3 hanya menyertakan konfigurasi penandatanganan yang diputar terbaru ini, sehingga v4 dapat menggunakan konfigurasi ini apa adanya; dengan ini skema tanda tangan v4 dapat mendukung rotasi karena menggunakan kunci penandatanganan yang diputar di SigningInfo-nya. Meskipun SigningInfo v4 tidak menyertakan silsilah penandatanganan penuh, ia dapat menariknya dari blok penandatanganan v3 untuk memungkinkan platform mengakses silsilah untuk kueri tanda tangan apa pun. Saat v3.1 digunakan untuk menargetkan rotasi untuk versi rotasi-min-sdk yang disediakan, konfigurasi v3 umum akan menyertakan konfigurasi penandatanganan asli serta konfigurasi penandatanganan yang diputar terbaru. Perpanjangan skema tanda tangan v4 telah dibuat yang mencakup blok info penandatanganan tambahan untuk setiap konfigurasi penandatanganan dari blok v3.1.

Validasi

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

Untuk informasi lebih lanjut tentang pengujian, lihat bagian verifikasi di v3.