Google, Siyah topluluklar için ırksal eşitliği ilerletmeye kararlıdır. Nasıl olduğunu gör.
Bu sayfa, Cloud Translation API ile çevrilmiştir.
Switch to English

APK İmza Düzeni v3

Android 9, uygulamalara APK güncellemesinin bir parçası olarak imzalama anahtarlarını değiştirme olanağı veren APK anahtarı döndürmeyi destekler. Rotasyonu pratik hale getirmek için APK'ların yeni ve eski imza anahtarı arasında güven düzeylerini belirtmesi gerekir. Anahtar döndürmeyi 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 ve APK imza bloğuna bir döndürme kanıtı yapısı hakkında bilgi ekler.

APK İmzalama Bloğu

V1 APK formatıyla geriye dönük uyumluluğu sağlamak için v2 ve v3 APK imzaları, ZIP Merkezi Dizininin hemen önünde bulunan bir APK İmzalama Bloğu içinde saklanır.

V3 APK İmzalama Bloğu formatı v2 ile aynıdır . APK'nın v3 imzası, 0xf05368c0 kimliğine sahip bir ID-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 biçime sahiptir ve aynı imza algoritması kimliklerini , anahtar boyutlarını ve EC eğrilerini destekler.

Bununla birlikte, v3 şeması, desteklenen SDK sürümleri ve dönme kanıtı yapısı hakkında bilgi ekler.

Biçim

APK İmza Düzeni v3 Bloğu, APK İmzalama Bloğu içinde 0xf05368c0 kimliği altında 0xf05368c0 .

APK İmza Düzeni v3 Bloğunun biçimi v2 biçimindedir:

  • uzunluk ön signer uzunluk ön signer dizisi:
    • uzunluk ön ekli signed data :
      • uzunluk ön ekli uzunluk ön ekli digests dizisi:
        • signature algorithm ID (4 bayt)
        • digest (uzunluk ön ekli)
      • uzunluk ön ekli X.509 certificates dizisi:
        • uzunluk ön ekli X.509 certificate (ASN.1 DER formu)
      • minSDK ( minSDK ) - platform sürümü bu sayının altındaysa bu imzalayıcı yoksayılmalıdır.
      • maxSDK ( maxSDK ) - platform sürümü bu sayının üzerindeyse bu imzalayıcı yoksayılmalıdır.
      • uzunluk ön ekli uzunluk ön ekli additional attributes dizisi:
        • ID (uint32)
        • value (değişken uzunluk: ek özelliğin uzunluğu - 4 bayt)
        • ID - 0x3ba06f8c
        • value - Dönüş kanıtı yapısı
    • minSDK ( minSDK ) - imzalı veri bölümünde minSDK değerinin kopyası - mevcut platform aralıkta değilse bu imzanın doğrulanmasını atlamak için kullanılır. İmzalı veri değeriyle eşleşmelidir.
    • maxSDK ( maxSDK ) - imzalı veri bölümünde maxSDK değerinin kopyası - geçerli platform aralıkta değilse bu imzanın doğrulanmasını atlamak için kullanılır. İmzalı veri değeriyle eşleşmelidir.
    • uzunluk ön ekli uzunluk ön ekli signatures dizisi:
      • signature algorithm ID (uint32)
      • signed data üzerinde önceden eklenmiş signature
    • uzunluk ön ekli public key (SubjectPublicKeyInfo, ASN.1 DER formu)

Dönme kanıtı ve kendine güvenilen yaşlı sertifikalar 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 yapmak için uygulama imzaları iki yeni veri parçası içerir:

  • üçüncü taraflar için uygulamanın imzalama sertifikasının öncüllerine güvenildiği her yerde güvenilebileceğine dair iddia
  • uygulamanın hala güvendiği eski imza sertifikaları

İmzalı veri bölümündeki döndürme kanıtı özniteliği, her bir düğüm, uygulamanın önceki sürümlerini imzalamak için kullanılan bir imza sertifikası içeren tekli bir listeden oluşur. Bu öznitelik kavramsal rotasyon kanıtı ve kendine güvenilen yaşlı certs veri yapılarını içerir. Liste, kök düğüme karşılık gelen en eski imza sertifikası olan sürüme göre sıralanır. Dönme kanıtı veri yapısı, her bir düğümdeki sertifikanın listede bir sonraki işareti imzalaması ve böylece her yeni anahtarı, eski anahtar (lar) kadar güvenilir olması gerektiğine dair kanıtlarla birleştirerek oluşturulur.

Kendine güvenilen eski sertifikalar veri yapısı, her bir düğüme kümedeki üyeliğini ve özelliklerini gösteren 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 bulunabilir. Bu bayrak, eski sertifika tarafından imzalanan diğer uygulamalara yeni imza sertifikasıyla imzalanmış bir uygulama tarafından tanımlanan bir imza izni verilmesine izin verir. Tüm döndürme kanıtı özniteliği v3 signer alanının imzalı veri bölümünde yer signer , içerilen apk'yi imzalamak için kullanılan anahtar tarafından korunur.

Bu biçim, birden çok imzalama anahtarını ve farklı ata imzalama sertifikalarını bire (birden çok başlangıç ​​düğümü ortak bir lavaboya) yakınlaştırmayı engeller .

Biçim

Döndürme kanıtı, APK İmza Düzeni v3 Bloğu içinde 0x3ba06f8c kimliği altında 0x3ba06f8c . Biçimi:

  • uzunluk ön eki uzunluk ön eki levels :
    • uzunluk ön ekli signed data (önceki sertifikaya göre - varsa)
      • uzunluk ön ekli X.509 certificate (ASN.1 DER formu)
      • signature algorithm ID (uint32) - cert tarafından önceki düzeyde kullanılan algoritma
    • flags (uint32) - bu sertifikanın kendine güvenen yaşlı sertifikalar yapısında olup olmayacağını ve hangi işlemler için olduğunu belirten bayraklar.
    • signature algorithm ID (uint32) - bir sonraki düzeyde imzalı veri bölümündeki ile eşleşmelidir.
    • yukarıdaki signed data üzerinde önceden eklenmiş signature

Birden çok sertifika

Android şu anda birden çok sertifikayla imzalanmış bir APK'yı, oluşturulmuş sertifikalardan ayrı benzersiz bir imzalama kimliğine sahip olarak değerlendiriyor. Böylece, imzalı veri bölümündeki dönme ispatı özniteliği, tek bir bağlantılı liste olarak daha iyi görüntülenebilen yönlendirilmiş bir asiklik grafik oluşturur ve belirli bir versiyonun her imzalayıcı seti bir düğümü temsil eder. Bu, dönme kanıtı yapısına ekstra karmaşıklık katar (aşağıdaki çoklu imzalayıcı sürümü). Özellikle, düzen bir sorun haline gelir. Dahası, artık APK'ları bağımsız olarak imzalamak mümkün değildir, çünkü rotasyon kanıtı yapısı, tek tek imzalamak yerine yeni serts setini imzalayan eski imza sertifikalarına sahip olmalıdır. Örneğin, iki yeni B ve C tuşu ile imzalanmak isteyen A anahtarıyla imzalanmış bir APK, B imzalayıcısının sadece A veya B tarafından imza içermesini sağlayamaz, çünkü bu B ve C'den farklı bir imzalama kimliğidir. yani imzalayanların böyle bir yapı oluşturmadan önce koordine etmesi gerekir.

Birden fazla imzalayan rotasyon kanıtı özelliği

  • uzunluk ön eki uzunluk ön eki sets :
    • signed data (önceki kümeye göre - varsa)
      • uzunluk önekli certificates sırası
        • uzunluk ön ekli X.509 certificate (ASN.1 DER formu)
      • signature algorithm IDs sırası (uint32) - önceki sıradaki her sertifika için aynı sırada bir tane.
    • flags (uint32) - bu sunucu grubunun kendine güvenen yaşlı sertifika yapısı içinde olup olmayacağını ve hangi işlemler için olduğunu belirten bayraklar.
    • uzunluk ön ekli uzunluk ön ekli signatures dizisi:
      • signature algorithm ID (uint32) - imzalı veri bölümündeki ile aynı olmalıdır
      • yukarıdaki signed data üzerinde önceden eklenmiş signature

Dönme kanıtı yapısında birden fazla ata

v3 şeması da aynı uygulama için aynı imza anahtarına dönen iki farklı anahtarı işlemez. Bu, edinen şirketin edinilen uygulamayı izinleri paylaşmak için imza anahtarını kullanmak üzere taşımak istediği bir edinim durumundan farklıdır. Yeni uygulama, paket adıyla ayırt edilecek ve kendi rotasyon kanıtı yapısını içerebileceğinden, edinme desteklenen bir kullanım örneği olarak görülüyor. Aynı uygulamanın aynı sertifikaya ulaşmak için iki farklı yolu olan desteklenmeyen durumu, anahtar döndürme tasarımında yapılan varsayımların çoğunu kırar.

Doğrulama

Android 9 ve sonraki sürümlerde APK'lar APK İmza Düzeni v3, v2 şeması veya v1 şemasına göre doğrulanabilir. Eski platformlar v3 imzalarını yok sayar ve v2 imzalarını, ardından v1'i 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 aşağıdakileri doğrulayın:
    1. APK İmzalama Bloğunun iki boyut alanı aynı değeri içerir.
    2. ZIP Central Directory'yi hemen Central Directory kaydının ZIP Sonu izler.
    3. Central Directory'nin ZIP Sonunu daha fazla veri takip etmez.
  2. APK İmzalama Bloğunun içindeki ilk APK İmza Düzeni v3 Bloğunu bulun. V3 Bloğu varsa, 3. adıma geçin. Aksi takdirde, v2 şemasını kullanarak APK'yı doğrulamak için geri dönün.
  3. APK Signature Scheme v3 signer için min. Ve maks. SDK sürümüne sahip 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. public key kullanarak signatures signed data karşılık gelen signature doğrulayın. (Artık signed data ayrıştırmak 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, imza sıyırma / eklemeyi ö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 o SubjectPublicKeyInfo doğrulama certificate ait certificates aynıdır public key .
    8. signer için döndürme kanıtı özniteliği varsa, yapının geçerli olduğunu ve bu signer listedeki son sertifika olduğunu doğrulayın.
  4. Doğrulama, geçerli platformun aralığında tam olarak bir signer bulunup bulunmadığı ve 3. adımın bu signer için başarılı olup olmadığı başarılı olur.

onaylama

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