APK imza şeması v3.1

Android 13, mevcut APK imza şeması v3'ün geliştirilmiş bir sürümü olan APK imza şeması v3.1'i destekler. v3.1 şeması, APK İmza Şeması v3 ile ilgili bilinen bazı sorunları (döndürme) ele alır. Özellikle v3.1 imza şeması, SDK sürümünü hedeflemeyi destekler. Bu sayede, platformun daha sonraki bir sürümünü hedeflemek için döndürme yapılabilir.

v3.1 imza şeması, Android 12 veya daha eski sürümlerde tanınmayan bir blok kimliği kullanıyor. Bu nedenle, platform aşağıdaki imzalayan davranışını uygular:

  • Android 13 veya sonraki sürümlerin yüklü olduğu cihazlarda v3.1 bloğunda döndürülmüş imzalayan kullanılır.
  • Android'in eski sürümlerinin yüklü olduğu cihazlarda, döndürülmüş imzalayan yoksayılır ve bunun yerine v3 bloğundaki orijinal imzalayan kullanılır.

İmzalama anahtarını henüz döndürmemiş olan uygulamalar için ek işlem yapılması gerekmez. Bu uygulamalar döndürmeyi seçtiğinde sistem varsayılan olarak v3.1 imza şemasını uygular.

v3.1 imza bloğu

v3.1 imzalama bloğu, v3 imzalama bloğuyla aynı içeriğe sahiptir ancak yeni blok kimliğiyle bu imzalar yalnızca Android 13 ve sonraki sürümlerin yüklü olduğu cihazlarda tanınır. Bu sayede uygulamalar, çok hedefli APK'lar konusunda endişelenmeden imzalama anahtarlarını güvenli bir şekilde değiştirebilir. Çünkü orijinal imzalayan, v3 imzalama bloğundaki APK'yı imzalamak için, değiştirilen imzalayan ise v3.1 imzalama bloğundaki APK'yı imzalamak için kullanılabilir. Bu, platformun v3.1 imzası doğrulanırken v3 imzalama bloğu için mevcut tüm doğrulama kodlarını yeniden kullanmasına da olanak tanır.

Varsayılan olarak, imzalama yapılandırmasında döndürülmüş bir anahtar ve soy sağlanırsa apksig kitaplığı v3.1 imzalama bloğunu kullanır. Bir uygulamanın minSdkVersion değeri Android 12'den düşükse ve döndürülmüş bir anahtar kullanılıyorsa v3 imza bloğundaki APK'yı imzalamak için orijinal imza anahtarının da belirtilmesi gerekir. Bu, APK'nın Android 9'dan önceki bir sürümü hedeflediği durumlarda orijinal imzalayanın gerekli olduğu mevcut davranışa benzer.

Belirli bir SDK sürümünden itibaren anahtar döndürmeyi hedeflemeyi desteklemek için apksig kitaplığı, döndürme için minimum SDK sürümünün ayarlanmasına olanak tanıyan yeni API'ler sunar. Döndürme desteği için minimum sürüm olarak Android 12'den düşük bir SDK sürümü belirtilirse orijinal v3 bloğu kullanılır. v3.1 imza bloğu yalnızca, dönüşüm için minimum SDK sürümünün Android 12 ve üzeri olarak ayarlandığı dönüşümün mevcut olduğu durumlarda kullanılır. v3 imzalama bloğunda, döndürme için bir özellik bulunur. Minimum SDK sürümü kaldırma koruması.

APK, soy bilgisi içeriyor rotation-min-sdk-version değerini v3 imza bloğu v3.1 imza bloğu
Hayır Varsayılan veya herhangi bir değer (aşağıda x ile gösterilir) Orijinal imzalayan tarafından imzalanmış, Android 9 ve sonraki sürümler hedefleniyor Mevcut değil
Evet Varsayılan Orijinal imzalayanla imzalanmış, Android 9 ile 12L sürümlerini hedefleyen Android 12 ve sonraki sürümleri hedefleyen, döndürülmüş imzalama sertifikasıyla imzalanmış
Evet x < 33 (Android 13) Android 9 ve sonraki sürümleri hedefleyen, döndürülmüş imzalayanla imzalanmış Mevcut değil
Evet x >= 33 (Android 13) Orijinal imzalayanla imzalanmış, Android 9'u hedefliyor - (x-1) x+ hedefleyen, döndürülmüş imzalayanla imzalanmış

Döndürmeyle ilgili sorunlar

Platformda, döndürmeyle ilgili aşağıdaki sorunlar çözüldü:

Android 12'deki düzeltmeler

  • Platform, yalnızca uygulamanın mevcut imzalayanı imzalama soyunda yer alıyorsa veya diğer uygulamanın mevcut imzalayanıysa istekte bulunan uygulamaya imza izni verir. Bu, iki uygulama imzalama anahtarıyla ilgili en iyi uygulamaları takip edip farklı imzalama anahtarlarına geçiş yaparsa istekte bulunan uygulamaya imza izni verilmesini engeller.
  • Platformun APK geri alma özelliği, imzalama soyundaki önceki anahtar geri alma özelliğine sahip olmadığı sürece, imzalama anahtarı yeni döndürülmüş bir APK'yı geri alamaz. Ancak bu özellik, yeni bir paket güncellemesinin önceki imzalama anahtarıyla imzalanmasına ve döndürülen anahtarın geri alınmasına izin verdiğinden anahtar döndürmenin amacını bozar.
  • Yalnızca döndürülmüş anahtarla imzalanan ve daha sonra soyda orijinal anahtar ve döndürülmüş anahtarla imzalanan bir APK ile güncellenen bir APK, Android 11 ve önceki sürümleri çalıştıran cihazlarda soyda yalnızca döndürülmüş anahtarı gösterir.

Android 11'deki düzeltmeler

  • PackageManager#checkSignatures, iki paketin orijinal imzalama anahtarlarını kontrol etmek için düzgün şekilde güncellenmedi. Bu durum, orijinal imzalama anahtarını kullanan enstrümantasyon APK'sı ile rotasyona tabi tutulmuş imzalama anahtarı kullanan uygulamalarda enstrümantasyonu bozdu.
  • sharedUserId kapsamındaki paketler, imza soyunu paylaşır. Güncellenmiş imza soyuna sahip bir uygulama sharedUiserId yüklenir veya güncellenirse bu uygulamanın soyu, sharedUserId için paylaşılan soyun yerini alır (ör. bir uygulamanın imza soyu A -> B ise ve uygulama, soyu B -> C olan sharedUserId içinde güncellenirse sharedUserId soyu B -> C ile değiştirilir). Benzer şekilde, imza zinciri değiştirilmediği sürece zincirdeki önceki bir imzalayanın özellikleri güncellenemez.

v4 entegrasyonu

v4 imza şeması, apksigner'a sağlanan imzalama yapılandırmasını kullanır. Rotasyon için birden fazla imzalama yapılandırması sağlanması durumunda, en son döndürülen imzalama yapılandırması kullanılır. v3.1'in kullanıma sunulmasından önce v3 yalnızca bu en son döndürülmüş imzalama yapılandırmasını içeriyordu. Bu nedenle v4, bu yapılandırmayı olduğu gibi kullanabiliyordu. Bu sayede v4 imza şeması, SigningInfo'da döndürülmüş imzalama anahtarını kullandığı için döndürmeyi destekleyebiliyordu. v4 SigningInfo, tam imzalama soyunu içermese de platformun imza sorgularında soy bilgisine erişmesine izin vermek için bunu v3 imzalama bloğundan çekebilir. Sağlanan rotation-min-sdk-version için döndürmeyi hedeflemek üzere v3.1 kullanılırken genel v3 yapılandırması hem orijinal imzalama yapılandırmasını hem de en son döndürülmüş imzalama yapılandırmasını içerir. v3.1 bloğundaki imzalama yapılandırmalarının her biri için ek imzalama bilgisi blokları içeren v4 imza şemasının bir uzantısı oluşturuldu.

Doğrulama

v3.1 uygulamanızı test etmek için PkgInstallSignatureVerificationTest.java CTS testlerini cts/hostsidetests/appsecurity/src/android/appsecurity/cts/ içinde çalıştırın.

Test hakkında daha fazla bilgi için v3'teki doğrulama bölümüne göz atın.