Android 9, uygulamalara bir APK güncellemesinin parçası olarak imzalama anahtarlarını değiştirme olanağı veren APK anahtar rotasyonunu destekler. Döndürmeyi pratik hale getirmek için APK'ların yeni ve eski imzalama anahtarı arasındaki güven düzeylerini belirtmesi gerekir. Anahtar rotasyonunu desteklemek için, yeni ve eski anahtarların kullanılmasına izin vermek için APK imza şemasını v2'den v3'e güncelledik. V3, APK imzalama bloğuna desteklenen SDK sürümleri hakkında bilgi ve bir döndürme kanıtı yapısı ekler.
APK İmzalama Bloğu
v1 APK biçimiyle geriye dönük uyumluluğu korumak için v2 ve v3 APK imzaları, ZIP Merkez Dizininden hemen önce bulunan bir APK İmzalama Bloğu içinde saklanır.
v3 APK İmza Bloğu biçimi, v2 ile aynıdır . APK'nın v3 imzası, ID 0xf05368c0 ile bir ID-değer çifti olarak saklanır.
APK İmza Şeması v3 Bloğu
v3 şeması, v2 şemasına çok benzer olacak şekilde tasarlanmıştır. Aynı genel biçime sahiptir ve aynı imza algoritması kimliklerini , anahtar boyutlarını ve EC eğrilerini destekler.
Ancak v3 şeması, desteklenen SDK sürümleri ve döndürme kanıtı yapısı hakkında bilgi ekler.
Biçim
APK Signature Scheme v3 Block, APK İmzalama Bloğu içinde 0xf05368c0
ID altında saklanır.
APK Signature Scheme v3 Block'un formatı v2'ninkiyle aynıdır:
- uzunluk önekli
signer
uzunluk öneki dizisi:- uzunluk ön ekli
signed data
:- uzunluk ön ekli
digests
uzunluk ön ekli dizisi :-
signature algorithm ID
(4 bayt) -
digest
(uzunluk ön ekli)
-
- X.509
certificates
uzunluk ön ekli 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 yoksayılmalıdır. -
maxSDK
(uint32) - platform sürümü bu sayının üzerindeyse bu imzalayan yoksayılmalıdır. - uzunluk önekli
additional attributes
dizisi:-
ID
(uint32) -
value
(değişken uzunluk: ek özelliğin uzunluğu - 4 bayt) -
ID - 0x3ba06f8c
-
value -
Döndürme kanıtı yapısı
-
- uzunluk ön ekli
-
minSDK
(uint32) - imzalı veri bölümünde minSDK değerinin kopyası - mevcut platform aralık 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 aralık 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 öneki dizisi:-
signature algorithm ID
(uint32) -
signed data
üzerinde uzunluk ön eklisignature
-
- uzunluk önekli
public key
(SubjectPublicKeyInfo, ASN.1 DER formu)
- uzunluk ön ekli
Rotasyon kanıtı ve kendine güvenen eski sertifika yapıları
Rotasyon kanıtı yapısı, uygulamaların iletişim kurdukları diğer uygulamalarda engellenmeden imzalama sertifikalarını döndürmelerine olanak tanır. Bunu başarmak için uygulama imzaları iki yeni veri parçası içerir:
- üçüncü şahıslar için, uygulamanın imzalama sertifikasına, öncekilere güvenilen her yerde güvenilebileceği iddiası
- uygulamanın kendisinin hala güvendiği eski imza sertifikaları
İmzalı veri bölümündeki döndürme kanıtı özniteliği, her bir düğümün uygulamanın önceki sürümlerini imzalamak için kullanılan bir imzalama sertifikası içeren tek bağlantılı bir listeden oluşur. Bu özniteliğin kavramsal döndürme kanıtı ve kendine güvenen eski sertifikalar veri yapılarını içermesi amaçlanmıştı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ı ve böylece her yeni anahtarın eski anahtar(lar) kadar güvenilir olması gerektiğine dair kanıtlarla doldurulmasıyla oluşturulur.
Kendine güvenen eski sertifikalar veri yapısı, kümedeki üyeliğini ve özelliklerini gösteren her bir düğüme bayraklar eklenerek oluşturulur. Örneğin, belirli bir düğümdeki imzalama sertifikasının Android imza izinlerini almak için güvenilir olduğunu belirten bir bayrak mevcut olabilir. Bu bayrak, eski sertifika tarafından imzalanan diğer uygulamalara, yeni imzalama sertifikasıyla imzalanmış bir uygulama tarafından tanımlanan bir imza izni verilmesine izin verir. Rotasyon kanıtı özniteliğinin tamamı v3 signer
alanının imzalı veri bölümünde bulunduğundan, içeren apk'yi imzalamak için kullanılan anahtar tarafından korunur.
Bu biçim, birden çok imzalama anahtarını ve farklı üst imza sertifikalarının bire (ortak bir havuza birden çok başlangıç düğümü) yakınsamasını engeller.
Biçim
Döndürme kanıtı, ID 0x3ba06f8c
altında APK Signature Scheme v3 Block içinde saklanır. Biçimi:
- uzunluk ön ekli
levels
uzunluk ön ekli 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 self-trusted-old-certs yapısında olup olmayacağını ve hangi işlemler için olduğunu gösteren bayraklar. -
signature algorithm ID
(uint32) - bir sonraki seviyedeki imzalı veri bölümündeki ile eşleşmelidir. - yukarıdaki
signed data
üzerinde uzunluk ön eklisignature
- uzunluk ön ekli
Birden çok sertifika
Android şu anda birden çok sertifikayla imzalanmış bir APK'yı, oluşturan sertifikalardan ayrı benzersiz bir imzalama kimliğine sahip olarak değerlendiriyor. Bu nedenle, imzalı veri bölümündeki döndürme kanıtı niteliği, belirli bir sürüm için her bir imzalayıcı kümesinin bir düğümü temsil ettiği, tek başına bağlantılı bir liste olarak daha iyi görülebilen, yönlendirilmiş bir döngüsel olmayan grafik oluşturur. Bu, döndürme kanıtı yapısına ekstra karmaşıklık ekler (aşağıdaki çoklu imza sürümü). Özellikle, sipariş bir endişe haline gelir. Ayrıca, rotasyon kanıtı yapısının eski imzalama sertifikalarının yeni sertifikaları tek tek imzalamak yerine imzalaması gerektiğinden, APK'ları bağımsız olarak imzalamak artık mümkün değildir. Örneğin, iki yeni B ve C anahtarıyla imzalanmak isteyen A anahtarı tarafından imzalanmış bir APK, B imzalayanının yalnızca A veya B imzasını içermesini sağlayamaz, çünkü bu, B ve C'den farklı bir imzalama kimliğidir. imzalayanların böyle bir yapı oluşturmadan önce koordine etmeleri gerektiği anlamına gelir.
Birden çok imzalayan döndürme kanıtı özelliği
- uzunluk önekli
sets
uzunluk öneki dizisi:-
signed data
(önceki kümeye göre - varsa)- uzunluk ön ekli
certificates
dizisi- uzunluk ön ekli X.509
certificate
(ASN.1 DER formu)
- uzunluk ön ekli X.509
-
signature algorithm IDs
sırası (uint32) - önceki kümedeki her sertifika için aynı sırada bir tane.
- uzunluk ön ekli
-
flags
(uint32) - bu sertifika setinin self-trusted-old-certs yapısında olup olmayacağını ve hangi işlemler için olduğunu gösteren bayraklar. - uzunluk önekli
signatures
uzunluk öneki dizisi:-
signature algorithm ID
(uint32) - imzalı veri bölümündekiyle eşleşmelidir - yukarıdaki
signed data
üzerinde uzunluk ön eklisignature
-
-
Dönme kanıtı yapısında çoklu atalar
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 bir satın alma durumundan farklıdır. Yeni uygulama paket adıyla ayırt edileceğinden ve kendi döndürme kanıtı yapısını içerebileceğinden, satın alma desteklenen bir kullanım durumu olarak görülüyor. Aynı uygulamanın aynı sertifikaya ulaşmak için iki farklı yola sahip olduğu desteklenmeyen durum, anahtar döndürme tasarımında yapılan varsayımların çoğunu bozar.
Doğrulama
Android 9 ve sonraki sürümlerde APK'lar APK Signature Scheme v3, v2 şeması veya v1 şemasına göre doğrulanabilir. Daha eski platformlar v3 imzalarını yok sayar ve v2 imzalarını, ardından v1 imzalarını doğrulamaya çalışır.
Şekil 1. APK imza doğrulama işlemi
APK İmza Şeması v3 doğrulaması
- APK İmzalama Bloğu'nu bulun ve şunları doğrulayın:
- APK Signing Block'un iki boyut alanı aynı değeri içerir.
- ZIP Central Directory'nin hemen ardından ZIP End of Central Directory kaydı gelir.
- ZIP End of Central Directory daha fazla veri tarafından takip edilmez.
- APK İmzalama Bloğu içindeki ilk APK İmza Şeması v3 Bloğu'nu bulun. v3 Bloğu varsa 3. adıma geçin. Aksi takdirde, v2 şemasını kullanarak APK'yı doğrulamaya geri dönün.
- APK Signature Scheme v3 Block'taki mevcut platformun aralığında olan minimum ve maksimum SDK sürümüne sahip her
signer
için:- İmzalardan desteklenen en güçlü
signatures
signature algorithm ID
seçin. Güç sıralaması her uygulama/platform versiyonuna bağlıdır. -
public key
kullanaraksigned data
karşısignatures
karşılık gelensignature
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
sıralı imza algoritması kimlikleri listesinin aynı olduğunu doğrulayın. (Bu, imzanın çıkarılmasını/eklenmesini önlemek içindir.) - İmza algoritması tarafından kullanılan özet algoritmasıyla aynı özet algoritmasını kullanarak APK içeriğinin özetini hesaplayın .
- Hesaplanan özetin,
digests
karşılık gelendigest
aynı olduğunu doğrulayın. - İlk
certificate
certificates
public key
aynı olduğunu doğrulayın. -
signer
signer
son sertifika olduğunu doğrulayın.
- İmzalardan desteklenen en güçlü
- 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 şekilde desteklediğini test etmek için, cts/hostsidetests/appsecurity/src/android/appsecurity/cts/
içindeki PkgInstallSignatureVerificationTest.java
CTS testlerini çalıştırın.