APK İmza Şeması v3

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

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

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

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 olması gibi desteklenmeyen durum, anahtar rotasyon tasarımında yapılan varsayımların çoğunu bozar.

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 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 boyutlu alanı aynı değeri içerir.
    2. ZIP Merkezi Dizininin hemen ardından Merkezi Dizinin ZIP Sonu kaydı gelir.
    3. Merkezi Dizinin ZIP Sonu daha fazla veri tarafından takip edilmez.
  2. 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.
  3. APK İmza Şeması v3 Bloğundaki, mevcut platformun kapsamında olan minimum ve maksimum SDK sürümüne sahip her signer için:
    1. signatures desteklenen en güçlü signature algorithm ID seçin. Güç sıralaması her uygulama/platform sürümüne bağlıdır.
    2. signatures karşılık gelen signature public key kullanarak signed data 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. APK içeriklerinin özetini, imza algoritması tarafından kullanılan özet algoritmasıyla aynı özet algoritmasını kullanarak hesaplayın .
    6. Hesaplanan özetin, digests karşılık gelen digest aynı olduğunu doğrulayın.
    7. İlk certificates certificate SubjectPublicKeyInfo değerinin public key aynı olduğunu doğrulayın.
    8. signer için rotasyon kanıtı özelliği mevcutsa 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 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.