APK İmza Şeması v3

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)
      • 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ı
    • 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 ekli signature
    • uzunluk önekli public key (SubjectPublicKeyInfo, ASN.1 DER formu)

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
    • 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 ekli signature

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)
      • signature algorithm IDs sırası (uint32) - önceki kümedeki her sertifika için aynı sırada bir tane.
    • 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 ekli signature

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.

APK imza doğrulama işlemi

Şekil 1. APK imza doğrulama işlemi

APK İmza Şeması v3 doğrulaması

  1. APK İmzalama Bloğu'nu bulun ve şunları doğrulayın:
    1. APK Signing Block'un iki boyut alanı aynı değeri içerir.
    2. ZIP Central Directory'nin hemen ardından ZIP End of Central Directory kaydı gelir.
    3. ZIP End of Central Directory daha fazla veri tarafından takip edilmez.
  2. 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.
  3. APK Signature Scheme v3 Block'taki mevcut platformun aralığında olan minimum ve maksimum SDK sürümüne sahip her signer için:
    1. İmzalardan desteklenen en güçlü signatures signature algorithm ID seçin. Güç sıralaması her uygulama/platform versiyonuna bağlıdır.
    2. public key kullanarak signed data karşı signatures karşılık gelen signature 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 sıralı imza algoritması kimlikleri 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çeriğinin özetini hesaplayın .
    6. Hesaplanan özetin, digests karşılık gelen digest aynı olduğunu doğrulayın.
    7. İlk certificate certificates public key aynı olduğunu doğrulayın.
    8. signer signer 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 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.