APK İmza Şeması v3

Android 9, uygulamalara bir APK güncellemesinin 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 göstermesi 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, 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 korumak için, v2 ve v3 APK imzaları, ZIP Merkezi Dizininden hemen önce bulunan bir APK İmzalama Bloğu içinde saklanır.

V3 APK Signing Block formatı v2 ile aynıdır . APK'nin v3 imzası, 0xf05368c0 kimliğine sahip bir kimlik-değer çifti olarak saklanır.

APK İmza Şeması v3 Blok

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, 0xf05368c0 kimliği altında APK İmzalama Bloğunun içinde saklanır.

APK İmza Şeması v3 Bloğu formatı v2'nin formatı ile uyumludur:

  • uzunluk önekli signer uzunluk önekli dizisi:
    • uzunluk önekli signed data :
      • uzunluk önekli digests uzunluğu önekli dizisi:
        • signature algorithm ID (4 bayt)
        • digest (uzunluk önekli)
      • X.509 certificates uzunluk önekli dizisi:
        • uzunluk önekli X.509 certificate (ASN.1 DER formu)
      • minSDK ( minSDK ) - platform sürümü bu sayının altındaysa bu imzalayan yok sayılmalıdır.
      • maxSDK ( maxSDK ) - platform sürümü bu sayının üzerindeyse bu imzalayan yok sayı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önme kanıtı yapısı
    • minSDK ( minSDK ) - imzalı veri bölümünde minSDK değerinin kopyası - mevcut platform menzil içinde değilse bu imzanın doğrulanmasını atlamak için kullanılır. İmzalanmış veri değeriyle eşleşmelidir.
    • maxSDK ( maxSDK ) - 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. İmzalanmış veri değeriyle eşleşmelidir.
    • uzunluk önekli signatures uzunluk önekli dizisi:
      • signature algorithm ID (uint32)
      • signed data üzerinde uzunluk önekli signature
    • uzunluk önekli public key (SubjectPublicKeyInfo, ASN.1 DER formu)

Rotasyon kanıtı ve kendine güvenen eski sertifikalı 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ının, öncüllerine güvenilen her yerde güvenilir olabileceği iddiası
  • uygulamanın kendisinin hala güvendiği uygulamanın eski imzalama sertifikaları

İmzalı veri bölümündeki rotasyon kanıtı özniteliği, her bir düğümde 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 öznitelik, kavramsal rotasyon kanıtı ve kendine güvenen eski sertifikalı veri yapılarını içermeyi amaçlamaktadır. Liste, kök düğüme karşılık gelen en eski imzalama sertifikasına sahip sürüme göre sıralanır. Döndürme kanıtı veri yapısı, her düğümdeki sertifikanın listede bir sonrakini imzalaması ve böylece her yeni anahtara eski anahtar (lar) kadar güvenilir olması gerektiğine dair kanıtlar eklenmesiyle oluşturulur.

Kendine güvenilen eski sertifikalar 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 gösteren bir bayrak mevcut olabilir. Bu bayrak, eski sertifika ile imzalanan diğer uygulamalara, yeni imzalama sertifikasıyla imzalanan 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 anahtarla korunur.

Bu biçim, birden çok imzalama anahtarını ve farklı ata imzalama sertifikalarının bir taneye (birden çok başlangıç ​​düğümünü ortak havuza) yakınsamasını engeller .

Biçim

Rotasyon kanıtı, APK İmza Şeması v3 Bloğu içinde 0x3ba06f8c kimliği altında 0x3ba06f8c . Biçimi şu şekildedir:

  • uzunluk önekli uzunluk önekli levels dizisi:
    • uzunluk önekli signed data (varsa önceki sertifikaya göre)
      • uzunluk önekli X.509 certificate (ASN.1 DER formu)
      • signature algorithm ID (uint32) - önceki düzeyde sertifika tarafından kullanılan algoritma
    • flags (uint32) - bu sertifikanın kendine güvenen-eski-sertifika yapısında olup olmayacağını ve hangi işlemler için kullanılacağını belirten bayraklar.
    • signature algorithm ID (uint32) - sonraki seviyedeki imzalı veri bölümündeki ile eşleşmelidir.
    • Yukarıdaki signed data üzerinde uzunluk önekli signature

Birden çok sertifika

Android şu anda birden çok sertifikayla imzalanmış bir APK'yı, içeren sertifikalardan ayrı benzersiz bir imzalama kimliğine sahip olarak değerlendirmektedir. Bu nedenle, işaretli veri bölümündeki rotasyon kanıtı niteliği, belirli bir sürüm için her bir imzalayıcı kümesinin bir düğümü temsil ettiği tekil bağlantılı bir liste olarak daha iyi görülebilecek, yönlendirilmiş çevrimsiz bir grafik oluşturur. Bu, rotasyon kanıtı yapısına fazladan karmaşıklık ekler (aşağıdaki çoklu imzalayan sürümü). Özellikle sipariş, endişe yaratır. Dahası, artık APK'ları bağımsız olarak imzalamak mümkün değildir, çünkü rotasyon kanıtı yapısında, onları tek tek imzalamak yerine eski imzalama sertifikalarının yeni sertifika setini imzalaması gerekir. Örneğin, iki yeni B ve C anahtarıyla imzalanmak isteyen A anahtarı tarafından imzalanan bir APK, B imzalayıcısına A veya B imzasını dahil edemez, çünkü bu, B ve C'den farklı bir imzalama kimliğidir. Bu tür bir yapı oluşturmadan önce imzalayanların koordine etmesi gerektiği anlamına gelir.

Birden çok imzalayan rotasyon kanıtı özelliği

  • uzunluk önekli sets uzunluk önekli dizisi:
    • signed data (önceki sete göre - varsa)
      • uzunluk önekli certificates dizisi
        • uzunluk önekli X.509 certificate (ASN.1 DER formu)
      • signature algorithm IDs dizisi (uint32) - önceki kümedeki her sertifika için aynı sırayla bir tane.
    • flags (uint32) - bu sertifika kümesinin kendine güvenilen-eski-sertifika yapısında olup olmayacağını ve hangi işlemler için kullanılacağını belirten bayraklar.
    • uzunluk önekli signatures uzunluk önekli dizisi:
      • signature algorithm ID (uint32) - imzalı veri bölümündeki ile eşleşmelidir
      • Yukarıdaki signed data üzerinde uzunluk önekli signature

Dönme kanıtı yapısında birden çok ata

v3 şeması, aynı uygulama için aynı imzalama anahtarına dönen iki farklı anahtarı da işlemez. Bu, satın alan şirketin edinilen uygulamayı imzalama anahtarını izinleri paylaşmak için kullanmak üzere taşımak istediği bir satın alma durumundan farklıdır. Yeni uygulama, paket adıyla ayırt edilebileceği ve kendi rotasyon kanıtı yapısını içerebileceği için, edinme desteklenen bir kullanım durumu olarak görülüyor. Aynı uygulamanın, aynı sertifikaya ulaşmak için iki farklı yolu olan desteklenmeyen durumu, anahtar rotasyon tasarımında yapılan birçok varsayımı 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.1 imzalarını doğrulamaya çalışır.

APK imza doğrulama süreci

Şekil 1. APK imza doğrulama süreci

APK İmza Şeması v3 doğrulaması

  1. APK İmzalama Bloğunu bulun ve şunları doğrulayın:
    1. APK İmzalama Bloğunun iki boyut alanı aynı değeri içerir.
    2. ZIP Merkezi Dizini hemen ZIP Sonu Merkezi Dizin kaydı izler.
    3. Merkezi Dizinin ZIP Sonunu daha fazla veri izlemiyor.
  2. APK İmza Bloğunun içindeki ilk APK İmza Şeması v3 Bloğunu bulun. V3 Bloğu varsa 3. adıma geçin. Aksi takdirde, v2 şemasını kullanarak APK'yı doğrulamaya geri dönün.
  3. Geçerli platformun aralığında olan minimum ve maksimum SDK sürümüne sahip APK İmza Şeması v3 Bloğundaki her signer için:
    1. En güçlü desteklenen seç signature algorithm ID gelen signatures . Güç sıralaması her uygulama / platform sürümüne bağlıdır.
    2. signature ilgili signatures public key kullanarak signed data karşılaştırarak doğrulayın. ( signed data ayrıştırmak artık güvenlidir.)
    3. İmzalı verilerdeki minimum ve maksimum SDK sürümlerinin signer için belirtilenlerle eşleştiğini doğrulayın.
    4. digests ve signatures imza algoritması kimliklerinin sıralı listesinin aynı olduğunu doğrulayın. (Bu, imzanın çıkarılmasını / eklenmesini önlemek içindir.)
    5. İmza algoritması tarafından kullanılan özet algoritmasıyla aynı özet algoritmasını kullanarak APK içeriklerinin özetini hesaplayın .
    6. Hesap edilmiş karşılık gelen özdeş olduğundan emin olun digest gelen digests .
    7. İlk o SubjectPublicKeyInfo doğrulama certificate ait certificates aynıdır public key .
    8. signer için rotasyon kanıtı özniteliği varsa, yapının geçerli olduğunu ve bu signer listedeki son sertifika olduğunu doğrulayın.
  4. Geçerli platformun aralığında tam olarak bir signer bulunursa ve bu signer için 3. adım başarılı olursa doğrulama başarılı olur.

Doğrulama

Cihazınızın PkgInstallSignatureVerificationTest.java doğru şekilde destekleyip desteklemediğini test etmek için, cts/hostsidetests/appsecurity/src/android/appsecurity/cts/ içindeki PkgInstallSignatureVerificationTest.java CTS testlerini çalıştırın.