Android 9 mendukung APK rotasi kunci , yang memberikan aplikasi kemampuan untuk mengubah kunci penandatanganan mereka sebagai bagian dari update APK. Untuk membuat rotasi praktis, APK harus menunjukkan tingkat kepercayaan antara kunci penandatanganan baru dan lama. Untuk mendukung rotasi kunci, kami memperbarui skema tanda tangan APK dari v2 ke v3 untuk memungkinkan kunci baru dan lama untuk digunakan. V3 menambahkan informasi tentang versi SDK yang didukung dan struct proof-of-rotation ke blok penandatanganan APK.
Blok Penandatanganan APK
Untuk menjaga kompatibilitas mundur dengan format APK v1, tanda tangan APK v2 dan v3 disimpan di dalam Blok Penandatanganan APK, yang terletak tepat sebelum Direktori Pusat ZIP.
The v3 APK Penandatanganan Blok Format adalah sama v2 . Tanda tangan v3 APK disimpan sebagai pasangan nilai ID dengan ID 0xf05368c0.
APK Signature Scheme v3 Block
Skema v3 dirancang untuk menjadi sangat mirip dengan skema v2 . Ini memiliki format umum yang sama dan mendukung sama signature ID algoritma , ukuran kunci, dan kurva EC.
Namun, skema v3 menambahkan informasi tentang versi SDK yang didukung dan struct proof-of-rotation.
Format
APK Signature Scheme v3 Blok disimpan di dalam APK Penandatanganan Blok bawah ID 0xf05368c0
.
Format APK Signature Scheme v3 Block mengikuti format v2:
- panjang-diawali urutan panjang-diawali
signer
:- panjang-diawali
signed data
:- panjang-diawali urutan panjang-diawali
digests
:-
signature algorithm ID
(4 bytes) -
digest
(panjang-diawali)
-
- panjang-diawali urutan X.509
certificates
:- panjang-diawali X.509
certificate
(ASN.1 bentuk DER)
- panjang-diawali X.509
-
minSDK
(uint32) - penandatangan ini harus diabaikan jika versi platform di bawah nomor ini. -
maxSDK
(uint32) - penandatangan ini harus diabaikan jika versi platform di atas nomor ini. - panjang-diawali urutan panjang-diawali
additional attributes
:-
ID
(uint32) -
value
(variable-length: panjang atribut tambahan - 4 bytes) -
ID - 0x3ba06f8c
-
value -
Proof-of-rotasi struct
-
- panjang-diawali urutan panjang-diawali
-
minSDK
(uint32) - duplikat dari nilai minSDK di bagian data ditandatangani - digunakan untuk melewati verifikasi tanda tangan ini jika platform saat ini tidak dalam jangkauan. Harus cocok dengan nilai data yang ditandatangani. -
maxSDK
(uint32) - duplikat dari nilai maxSDK dalam bagian data ditandatangani - digunakan untuk melewati verifikasi tanda tangan ini jika platform saat ini tidak dalam jangkauan. Harus cocok dengan nilai data yang ditandatangani. - panjang-diawali urutan panjang-diawali
signatures
:-
signature algorithm ID
(uint32) - panjang-diawali
signature
atassigned data
-
- panjang-diawali
public key
(SubjectPublicKeyInfo, ASN.1 DER bentuk)
- panjang-diawali
Struktur bukti rotasi dan sertifikat lama yang dapat dipercaya sendiri
Struktur bukti rotasi memungkinkan aplikasi untuk memutar sertifikat penandatanganan mereka tanpa diblokir pada aplikasi lain yang mereka gunakan untuk berkomunikasi. Untuk mencapai ini, tanda tangan aplikasi berisi dua bagian data baru:
- pernyataan untuk pihak ketiga bahwa sertifikat penandatanganan aplikasi dapat dipercaya di mana pun pendahulunya dipercaya
- sertifikat penandatanganan aplikasi yang lebih lama yang masih dipercaya oleh aplikasi itu sendiri
Atribut proof-of-rotation di bagian data yang ditandatangani terdiri dari daftar tertaut tunggal, dengan setiap node berisi sertifikat penandatanganan yang digunakan untuk menandatangani versi aplikasi sebelumnya. Atribut ini dimaksudkan untuk berisi bukti-rotasi konseptual dan struktur data self-trusted-old-certs. Daftar diurutkan berdasarkan versi dengan sertifikat penandatanganan tertua yang sesuai dengan simpul akar. Struktur data proof-of-rotation dibangun dengan membuat sertifikat di setiap node menandatangani yang berikutnya dalam daftar, dan dengan demikian menambahkan setiap kunci baru dengan bukti bahwa itu harus dipercaya seperti kunci yang lebih lama.
Struktur data self-trusted-old-certs dibangun dengan menambahkan flag ke setiap node yang menunjukkan keanggotaan dan propertinya di set. Misalnya, tanda mungkin ada yang menunjukkan bahwa sertifikat penandatanganan pada node tertentu dipercaya untuk mendapatkan izin tanda tangan Android. Bendera ini memungkinkan aplikasi lain yang ditandatangani oleh sertifikat lama tetap diberikan izin tanda tangan yang ditentukan oleh aplikasi yang ditandatangani dengan sertifikat penandatanganan baru. Karena seluruh bukti-rotasi Resides atribut di bagian data ditandatangani v3 signer
lapangan, dilindungi oleh kunci yang digunakan untuk menandatangani apk mengandung.
Format ini menghalangi beberapa kunci penandatanganan dan konvergensi dari penandatanganan sertifikat nenek moyang yang berbeda untuk satu (node awal berganda untuk wastafel umum).
Format
Bukti-of-rotasi disimpan di dalam Signature APK Skema v3 Blok bawah ID 0x3ba06f8c
. Formatnya adalah:
- panjang-diawali urutan panjang-diawali
levels
:- panjang-diawali
signed data
(oleh cert sebelumnya - jika ada)- panjang-diawali X.509
certificate
(ASN.1 bentuk DER) -
signature algorithm ID
(uint32) - algoritma yang digunakan oleh cert di tingkat sebelumnya
- panjang-diawali X.509
-
flags
(uint32) - bendera yang menunjukkan apakah atau tidak cert ini harus di self-dipercaya-lama sertifikat struct, dan yang operasi. -
signature algorithm ID
(uint32) - harus cocok dengan salah satu dari bagian data masuk tingkat berikutnya. - panjang-diawali
signature
di atas di atassigned data
- panjang-diawali
Beberapa sertifikat
Android saat ini memperlakukan APK yang ditandatangani dengan beberapa sertifikat sebagai memiliki identitas penandatanganan unik yang terpisah dari sertifikat penyusunnya. Dengan demikian, atribut proof-of-rotation di bagian data bertanda membentuk grafik asiklik terarah, yang dapat lebih baik dilihat sebagai daftar yang ditautkan tunggal, dengan setiap set penanda untuk versi tertentu mewakili satu simpul. Ini menambah kerumitan ekstra pada struct proof-of-rotation (versi multi-penanda tangan di bawah). Secara khusus, pemesanan menjadi perhatian. Terlebih lagi, tidak mungkin lagi menandatangani APK secara mandiri, karena struktur proof-of-rotation harus memiliki sertifikat penandatanganan lama yang menandatangani kumpulan sertifikat baru, daripada menandatanganinya satu per satu. Misalnya, APK yang ditandatangani oleh kunci A yang ingin ditandatangani oleh dua kunci baru B dan C tidak dapat membuat penanda tangan B hanya menyertakan tanda tangan oleh A atau B, karena itu adalah identitas penandatanganan yang berbeda dari B dan C. Ini akan berarti penandatangan harus berkoordinasi sebelum membangun struktur semacam itu.
Atribut bukti rotasi banyak penanda tangan
- panjang-diawali urutan panjang-diawali
sets
:-
signed data
(oleh set sebelumnya - jika ada)- panjang-diawali urutan
certificates
- panjang-diawali X.509
certificate
(ASN.1 bentuk DER)
- panjang-diawali X.509
- Urutan
signature algorithm IDs
(uint32) - satu untuk setiap sertifikat dari set sebelumnya, dalam urutan yang sama.
- panjang-diawali urutan
-
flags
(uint32) - bendera yang menunjukkan apakah atau tidak set sertifikat harus dalam diri dipercaya berusia-sertifikat struct, dan yang operasi. - panjang-diawali urutan panjang-diawali
signatures
:-
signature algorithm ID
(uint32) - harus cocok dengan salah satu dari bagian data ditandatangani - panjang-diawali
signature
di atas di atassigned data
-
-
Banyak leluhur dalam struktur bukti rotasi
Skema v3 juga tidak menangani dua kunci berbeda yang berputar ke kunci penandatanganan yang sama untuk aplikasi yang sama. Ini berbeda dari kasus akuisisi, di mana perusahaan yang mengakuisisi ingin memindahkan aplikasi yang diakuisisi untuk menggunakan kunci penandatanganannya untuk berbagi izin. Akuisisi ini dipandang sebagai kasus penggunaan yang didukung karena aplikasi baru akan dibedakan berdasarkan nama paketnya dan dapat berisi struct proof-of-rotation-nya sendiri. Kasus yang tidak didukung, dari aplikasi yang sama yang memiliki dua jalur berbeda untuk mendapatkan sertifikat yang sama, mematahkan banyak asumsi yang dibuat dalam desain rotasi kunci.
Verifikasi
Di Android 9 dan yang lebih tinggi, APK dapat diverifikasi menurut Skema Tanda Tangan APK v3, skema v2, atau skema v1. Platform lama mengabaikan tanda tangan v3 dan mencoba memverifikasi tanda tangan v2, lalu v1.
Gambar proses verifikasi tanda tangan 1. APK
Verifikasi APK Signature Scheme v3
- Temukan Blok Penandatanganan APK dan verifikasi bahwa:
- Dua bidang ukuran Blok Penandatanganan APK berisi nilai yang sama.
- ZIP Central Directory segera diikuti oleh ZIP End of Central Directory record.
- ZIP End of Central Directory tidak diikuti oleh lebih banyak data.
- Temukan Blok Skema Tanda Tangan APK v3 pertama di dalam Blok Penandatanganan APK. Jika v3 Blok hadir, lanjutkan ke langkah 3. Jika tidak, jatuh kembali ke memverifikasi APK yang menggunakan skema v2 .
- Untuk setiap
signer
di APK Signature Scheme v3 Blok dengan min dan versi SDK max yang ada di berbagai platform saat ini:- Pilih terkuat didukung
signature algorithm ID
darisignatures
. Urutan kekuatan tergantung pada setiap versi implementasi/platform. - Verifikasi yang sesuai
signature
darisignatures
terhadapsigned data
menggunakanpublic key
. (Sekarang aman untuk menguraisigned data
.) - Verifikasi min dan max SDK versi dalam data ditandatangani sesuai yang ditentukan untuk
signer
. - Verifikasi bahwa daftar memerintahkan ID algoritma tanda tangan di
digests
dansignatures
identik. (Ini untuk mencegah pengupasan/penambahan tanda tangan.) - Menghitung mencerna isi APK menggunakan mencerna sama algoritma sebagai mencerna algoritma yang digunakan oleh algoritma tanda tangan.
- Verifikasi bahwa dihitung digest identik dengan yang sesuai
digest
daridigests
. - Verifikasi bahwa SubjectPublicKeyInfo pertama
certificate
daricertificates
identik denganpublic key
. - Jika atribut bukti-rotasi ada untuk
signer
memverifikasi bahwa struct tersebut valid dan inisigner
adalah sertifikat terakhir dalam daftar.
- Pilih terkuat didukung
- Verifikasi berhasil jika tepat satu
signer
ditemukan di berbagai platform saat ini dan langkah 3 berhasil untuk itusigner
.
Validasi
Untuk tes yang mendukung perangkat Anda v3 benar, menjalankan PkgInstallSignatureVerificationTest.java
tes CTS di cts/hostsidetests/appsecurity/src/android/appsecurity/cts/
.