APK İmza Şeması v3

Android 9 destekler anahtar dönüşü APK uygulamalara; APK güncellemesinin bir parçası olarak imzalama anahtarı değiştirme yeteneği verir. 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 dönüşünü desteklemek için, güncellenmiş APK imza düzeni , yeni ve eski anahtarlar kullanılmasına izin için v3'e v2'den. 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.

Blok formatını İmzalama v3 APK olduğu v2 aynı . APK'nın v3 imzası, ID 0xf05368c0 ile bir ID-değer çifti olarak saklanır.

APK İmza Şeması v3 Bloğu

V3 düzeni çok benzer olacak şekilde tasarlanmıştır v2 düzeni . Aynı aynı genel biçime sahip destekler , imza algoritmasının kimlikleri , anahtar boyutları ve AT eğrileri.

Ancak v3 şeması, desteklenen SDK sürümleri ve döndürme kanıtı yapısı hakkında bilgi ekler.

Biçim

APK İmza Şeması v3 Blok kimliği altında Block İmza APK içinde saklanır 0xf05368c0 .

APK Signature Scheme v3 Block'un formatı v2'ninkiyle aynıdır:

  • uzunluk önekli uzunluğu önekli dizi signer :
    • uzunluk-öneki signed data :
      • uzunluk önekli uzunluğu önekli sekans digests :
        • signature algorithm ID (4 bayt)
        • digest (uzunluk-sabitlenmiş)
      • X.509 uzunluğu önekli sekans certificates :
        • uzunluk önekli X.509 certificate (ASN.1 DER formu)
      • minSDK (uint32) - platform sürümü bu sayının altında ise bu imzalayan göz ardı edilmelidir.
      • maxSDK (uint32) - platform sürümü bu sayının üzerinde ise bu imzalayan göz ardı edilmelidir.
      • uzunluk önekli uzunluğu önekli dizi additional attributes :
        • ID (uint32)
        • value (değişken uzunlukta: ek bir özellikte uzunluğu - 4 bayt)
        • ID - 0x3ba06f8c
        • value - kanıt-dönme yapı
    • minSDK (uint32) - imzalanmış veri bölümünde minSDK değerin yinelenen - Geçerli platformu aralığında değilse bu imzanın doğrulanması geçmek için kullanılır. İmzalı veri değeriyle eşleşmelidir.
    • maxSDK (uint32) - Geçerli platformu aralığında değilse bu imzanın doğrulamayı atlamasına kullanılan - imzalanan veri bölümünde maxSDK değerinin yinelenen. İmzalı veri değeriyle eşleşmelidir.
    • uzunluk önekli uzunluğu önekli sekans signatures :
      • signature algorithm ID (uint32)
      • uzunluk-öneki signature üzerinde signed data
    • 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 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. V3 imzalı veri bölümünde bütün kanıtı dönme nitelik kahntılannin Çünkü signer alanında, bu içeren apk imzalamak için kullanılan anahtar ile korunmaktadır.

Bu biçim önlüyor birden imzalama anahtarları ve yakınsama farklı atası imzalama sertifikaları (ortak lavabo için birden başlangıç düğümlerine) bire.

Biçim

Kanıt-dönüş Düzenleme İD altında Block v3 APK İmza içinde saklanır 0x3ba06f8c . Biçimi:

  • uzunluk önekli uzunluğu önekli sekans levels :
    • uzunluk önekli signed data (önceki sertifika ile - eğer varsa)
      • uzunluk önekli X.509 certificate (ASN.1 DER formu)
      • signature algorithm ID (uint32) - algoritma önceki aşamada sertifika kullandığı
    • flags (uint32) - bayrakları bu sertifika kendinden güvenilen-eski certs yapı içinde olmalıdır olup olmadığını belirten ve hangi işlemleri için.
    • signature algorithm ID (uint32) - bir sonraki seviyeye imzalanan veri bölümünden biriyle eşleşmelidir.
    • uzunluk-öneki signature yukarıda üzerinde signed data

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ında eski imzalama sertifikalarının yeni sertifika setlerini 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 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 uzunluğu önekli dizi sets :
    • signed data (önceki dizi - varsa)
      • uzunluğu önekli dizi certificates
        • uzunluk önekli X.509 certificate (ASN.1 DER formu)
      • Sekans signature algorithm IDs (uint32) - Önceki kümesinden her sertifika için bir aynı sırada.
    • flags certs bu seti kendini güvenilir-eski certs yapı içinde olmalı ve hangi operasyonlar için gerekip gerekmediğini belirten bayrakları - (uint32).
    • uzunluk önekli uzunluğu önekli sekans signatures :
      • signature algorithm ID (uint32) - imzalanmış veri bölümünden aynı olmalıdır
      • uzunluk-öneki signature yukarıda üzerinde signed data

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. Satın alma, desteklenen bir kullanım durumu olarak görülüyor çünkü yeni uygulama paket adıyla ayırt edilecek ve kendi döndürme kanıtı yapısını içerebilecek. 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. Blok mevcut v3, Aksi 3. adımda devam ederseniz geri APK doğrulayarak düşer v2 düzeni kullanarak .
  3. Her biri için signer APK İmza Şema mevcut platformun aralığındaki bir minimum ve maksimum SDK sürümüyle Block v3:
    1. En güçlü desteklenen seç signature algorithm ID gelen signatures . Güç sıralaması her uygulama/platform versiyonuna bağlıdır.
    2. İlgili doğrulama signature gelen signatures karşı signed data kullanarak public key . (Ayrıştırmak için şimdi güvenlidir signed data .)
    3. İmzalı verilerdeki minimum ve maksimum SDK sürümlerini doğrulama için belirtilen eşleşir signer .
    4. İmza algoritması kimlikleri sıralı liste emin olun digests ve signatures aynıdır. (Bu, imzanın çıkarılmasını/eklenmesini önlemek içindir.)
    5. APK içeriğinin sindirimi hesaplamak aynı imza algoritması tarafından kullanılan algoritma sindirmek algoritma sindirimi kullanılarak.
    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. Kanıtı dönme özelliği için varsa signer yapı geçerlidir ve bu doğrulamak signer listedeki son belgedir.
  4. Tam olarak bir eğer Doğrulama başarılı signer bunun için başarılı geçerli platformda ve 3. adımda aralığında bulunmuştur signer .

doğrulama

Test etmek için cihaz desteklediği düzgün v3 olduğunu, koşmak PkgInstallSignatureVerificationTest.java içinde CTS testleri cts/hostsidetests/appsecurity/src/android/appsecurity/cts/ .