Android 9, uygulamalara APK güncellemesinin bir parçası olarak imzalama anahtarlarını değiştirme olanağı sağlayan APK anahtar rotasyonunu destekler. Rotasyonu pratik hale getirmek için APK'ların yeni ve eski imzalama anahtarı arasındaki güven düzeylerini belirtmesi gerekir. Anahtar rotasyonunu desteklemek amacıyla, yeni ve eski anahtarların kullanılmasına izin vermek amacıyla APK imza şemasını v2'den v3'e güncelledik. V3, desteklenen SDK sürümleri hakkında bilgi ve APK imzalama bloğuna bir rotasyon kanıtı yapısı ekler.
APK İmzalama Bloğu
v1 APK formatıyla geriye dönük uyumluluğu sürdürmek için v2 ve v3 APK imzaları, ZIP Merkezi Dizininin hemen önünde bulunan bir APK İmzalama Bloğunda saklanır.
v3 APK İmza Bloğu formatı v2 ile aynıdır . APK'nın v3 imzası, 0xf05368c0 kimliğine sahip bir kimlik-değer çifti olarak depolanır.
APK İmza Şeması v3 Bloğu
V3 şeması v2 şemasına çok benzer olacak şekilde tasarlanmıştır. Aynı genel formata sahiptir ve aynı imza algoritması kimliklerini , anahtar boyutlarını ve EC eğrilerini destekler.
Ancak v3 şeması, desteklenen SDK sürümleri ve rotasyon kanıtı yapısı hakkında bilgi ekler.
Biçim
APK İmza Şeması v3 Bloğu, APK İmzalama Bloğunun içinde 0xf05368c0
kimliği altında saklanır.
APK İmza Şeması v3 Bloğunun formatı v2'nin formatını takip eder:
- uzunluk öneki olan
signer
uzunluk öneki dizisi:- uzunluk önekli
signed data
:- uzunluk önekli
digests
uzunluk önekli dizisi:-
signature algorithm ID
(4 bayt) -
digest
(uzunluk öneki)
-
- X.509
certificates
uzunluk öneki dizisi:- uzunluk ön ekli X.509
certificate
(ASN.1 DER formu)
- uzunluk ön ekli X.509
-
minSDK
(uint32) - platform sürümü bu sayının altındaysa bu imzalayan göz ardı edilmelidir. -
maxSDK
(uint32) - platform sürümü bu sayının üzerindeyse bu imzalayan göz ardı edilmelidir. - uzunluk önekli
additional attributes
uzunluk önekli dizisi:-
ID
(uint32) -
value
(değişken uzunluk: ek özelliğin uzunluğu - 4 bayt) -
ID - 0x3ba06f8c
-
value -
Dönme kanıtı yapısı
-
- uzunluk önekli
-
minSDK
(uint32) - imzalı veri bölümündeki minSDK değerinin kopyası - mevcut platform menzil içinde değilse bu imzanın doğrulanmasını atlamak için kullanılır. İmzalı veri değeriyle eşleşmelidir. -
maxSDK
(uint32) - imzalı veri bölümündeki maxSDK değerinin kopyası - mevcut platform menzil içinde değilse bu imzanın doğrulanmasını atlamak için kullanılır. İmzalı veri değeriyle eşleşmelidir. - uzunluk önekli
signatures
uzunluk önekli dizisi:-
signature algorithm ID
(uint32) -
signed data
üzerinde uzunluk önekisignature
-
- uzunluk önekli
public key
(SubjectPublicKeyInfo, ASN.1 DER formu)
- uzunluk önekli
Rotasyon kanıtı ve kendine güvenilen eski sertifika yapıları
Rotasyon kanıtı yapısı, uygulamaların iletişim kurdukları diğer uygulamalarda engellenmeden imzalama sertifikalarını döndürmesine olanak tanır. Bunu başarmak için uygulama imzaları iki yeni veri parçası içerir:
- Üçüncü taraflar için, önceki sürümlere güvenilen her yerde uygulamanın imzalama sertifikasına da güvenilebileceğine dair iddia
- uygulamanın kendisinin hâlâ güvendiği eski imzalama sertifikaları
İmzalı veri bölümündeki rotasyon kanıtı özelliği, her düğümün uygulamanın önceki sürümlerini imzalamak için kullanılan bir imzalama sertifikası içerdiği tek bağlantılı bir listeden oluşur. Bu özniteliğin kavramsal rotasyon kanıtı ve kendine güvenilen eski sertifika veri yapılarını içermesi amaçlanmaktadır. Liste, kök düğüme karşılık gelen en eski imzalama sertifikasına sahip sürüme göre sıralanır. Rotasyon kanıtı veri yapısı, her düğümdeki sertifikanın listedeki bir sonrakini imzalamasını sağlayarak ve böylece her yeni anahtara, eski anahtar(lar) kadar güvenilir olması gerektiğine dair kanıt aşılayarak oluşturulur.
Kendine güvenen eski sertifika veri yapısı, her düğüme kümedeki üyeliğini ve özelliklerini belirten bayraklar eklenerek oluşturulur. Örneğin, Android imza izinlerini almak için belirli bir düğümdeki imzalama sertifikasına güvenildiğini belirten bir bayrak mevcut olabilir. Bu işaret, eski sertifika tarafından imzalanan diğer uygulamalara, yeni imzalama sertifikasıyla imzalanan bir uygulama tarafından tanımlanan imza izninin verilmesine hâlâ izin verir. Rotasyon kanıtı özelliğinin tamamı v3 signer
alanının imzalı veriler bölümünde bulunduğundan, içeren apk'yi imzalamak için kullanılan anahtar tarafından korunur.
Bu biçim, birden fazla imzalama anahtarını ve farklı üst imzalama sertifikalarının tek bir sertifikada (ortak bir havuzda birden fazla başlangıç düğümü) yakınsamasını engeller.
Biçim
Döndürme kanıtı, APK Signature Scheme v3 Bloğunda 0x3ba06f8c
kimliği altında saklanır. Formatı şöyledir:
- uzunluk önekli
levels
uzunluk önekli dizisi:- uzunluk ön ekli
signed data
(önceki sertifikaya göre - varsa)- uzunluk ön ekli X.509
certificate
(ASN.1 DER formu) -
signature algorithm ID
(uint32) - önceki düzeyde sertifika tarafından kullanılan algoritma
- uzunluk ön ekli X.509
-
flags
(uint32) - bu sertifikanın kendine güvenilen eski sertifikalar yapısında olması gerekip gerekmediğini ve hangi işlemler için olduğunu belirten bayraklar. -
signature algorithm ID
(uint32) - bir sonraki düzeydeki imzalı veri bölümündekiyle eşleşmelidir. - Yukarıdaki
signed data
üzerinde uzunluk ön eklisignature
- uzunluk ön ekli
Çoklu sertifikalar
Android şu anda birden fazla sertifikayla imzalanmış bir APK'yı, onu oluşturan sertifikalardan ayrı, benzersiz bir imzalama kimliğine sahip olarak ele alıyor. Bu nedenle, imzalı veri bölümündeki rotasyon kanıtı özelliği, belirli bir sürüm için her imzalayan kümesinin bir düğümü temsil ettiği, tek bağlantılı bir liste olarak daha iyi görülebilecek yönlendirilmiş, döngüsel olmayan bir grafik oluşturur. Bu, rotasyon kanıtı yapısına ekstra karmaşıklık katar (çoklu imzalayıcılı sürüm aşağıdadır). Özellikle sipariş vermek endişe verici hale gelir. Dahası, APK'ları bağımsız olarak imzalamak artık mümkün değil çünkü rotasyon kanıtı yapısında, bunları tek tek imzalamak yerine eski imzalama sertifikalarının yeni sertifika kümesini imzalaması gerekiyor. Örneğin, A anahtarı tarafından imzalanan ve iki yeni B ve C anahtarıyla imzalanmak isteyen bir APK, B imzalayanın yalnızca A veya B imzasını içermesini sağlayamaz çünkü bu, B ve C'den farklı bir imzalama kimliğidir. Bu, imzalayanların böyle bir yapıyı oluşturmadan önce koordine olmaları gerektiği anlamına gelir.
Çoklu imzalayan rotasyon kanıtı özelliği
- uzunluk önekli
sets
uzunluk önekli dizisi:-
signed data
(önceki kümeye göre - varsa)- uzunluk önekli
certificates
dizisi- uzunluk ön ekli X.509
certificate
(ASN.1 DER formu)
- uzunluk ön ekli X.509
-
signature algorithm IDs
dizisi (uint32) - önceki kümedeki her sertifika için aynı sırayla bir tane.
- uzunluk önekli
-
flags
(uint32) - bu sertifika kümesinin kendine güvenilen eski sertifikalar yapısında olması gerekip gerekmediğini ve hangi işlemler için olduğunu belirten bayraklar. - uzunluk önekli
signatures
uzunluk önekli dizisi:-
signature algorithm ID
(uint32) - imzalı veri bölümündekiyle eşleşmelidir - Yukarıdaki
signed data
üzerinde uzunluk ön eklisignature
-
-
Rotasyon kanıtı yapısında birden fazla ata
v3 şeması aynı uygulama için aynı imzalama anahtarına dönen iki farklı anahtarı da işlemez. Bu, satın alan şirketin, satın alınan uygulamayı izinleri paylaşmak için imzalama anahtarını kullanacak şekilde taşımak istediği satın alma durumundan farklıdır. Satın alma, desteklenen bir kullanım durumu olarak görülüyor çünkü yeni uygulama, paket adıyla ayırt edilecek ve kendi rotasyon kanıtı yapısını içerebilecek. Aynı uygulamanın aynı sertifikaya ulaşmak için iki farklı yola sahip olduğu desteklenmeyen durum, anahtar rotasyon tasarımında yapılan birçok varsayımı bozuyor.
Doğrulama
Android 9 ve üzeri sürümlerde APK'lar, APK İmza Şeması v3, v2 şeması veya v1 şemasına göre doğrulanabilir. Daha eski platformlar v3 imzalarını yok sayar ve v2 imzalarını doğrulamaya çalışır, ardından v1.
APK İmza Şeması v3 doğrulaması
- APK İmzalama Bloğunu bulun ve şunları doğrulayın:
- APK İmzalama Bloğunun iki boyutlu alanı aynı değeri içerir.
- ZIP Merkezi Dizininin hemen ardından Merkezi Dizinin ZIP Sonu kaydı gelir.
- Merkezi Dizinin ZIP Sonu daha fazla veri tarafından takip edilmez.
- APK İmzalama Bloğunun içindeki ilk APK İmza Şeması v3 Bloğunu bulun. v3 Bloğu mevcutsa 3. adıma geçin. Aksi takdirde v2 şemasını kullanarak APK'yı doğrulama işlemine geri dönün.
- APK İmza Şeması v3 Bloğundaki, mevcut platformun kapsamında olan minimum ve maksimum SDK sürümüne sahip her
signer
için:-
signatures
desteklenen en güçlüsignature algorithm ID
seçin. Güç sıralaması her uygulama/platform sürümüne bağlıdır. -
signatures
karşılık gelensignature
public key
kullanaraksigned data
doğrulayın. (signed data
ayrıştırmak artık güvenlidir.) - İmzalı verilerdeki minimum ve maksimum SDK sürümlerinin,
signer
için belirtilenlerle eşleştiğini doğrulayın. -
digests
vesignatures
imza algoritması kimliklerinin sıralı listesinin aynı olduğunu doğrulayın. (Bu, imzanın çıkarılmasını/eklenmesini önlemek içindir.) - APK içeriklerinin özetini, imza algoritması tarafından kullanılan özet algoritmasıyla aynı özet algoritmasını kullanarak hesaplayın .
- Hesaplanan özetin,
digests
karşılık gelendigest
aynı olduğunu doğrulayın. - İlk
certificates
certificate
SubjectPublicKeyInfo değerininpublic key
aynı olduğunu doğrulayın. -
signer
için rotasyon kanıtı özelliği mevcutsa yapının geçerli olduğunu ve busigner
listedeki son sertifika olduğunu doğrulayın.
-
- Geçerli platformun aralığında tam olarak bir
signer
bulunursa ve busigner
için 3. adım başarılı olursa doğrulama başarılı olur.
Doğrulama
Cihazınızın v3'ü düzgün bir şekilde desteklediğini test etmek için cts/hostsidetests/appsecurity/src/android/appsecurity/cts/
konumunda PkgInstallSignatureVerificationTest.java
CTS testlerini çalıştırın.