Schemat podpisu plików APK w wersji 3.1

Omówienie

Android 13 obsługuje schemat podpisu pliku APK w wersji 3.1, który jest ulepszoną wersją dotychczasowego schematu podpisu pliku APK w wersji 3. Schemat w wersji 3.1 rozwiązuje niektóre znane problemy z obróceniem w schemacie podpisu plików APK w wersji 3. W szczególności schemat podpisu v3.1 obsługuje kierowanie na wersję SDK, co umożliwia rotacji kierowanie na nowszą wersję platformy.

Schemat podpisu w wersji 3.1 używa identyfikatora bloku, który nie jest rozpoznawany w Androidzie 12 lub starszym. Dlatego platforma stosuje takie zachowanie:

  • Urządzenia z Androidem 13 lub nowszym używają podpisanego klucza w bloku wersji 3.1.
  • Urządzenia z starszymi wersjami Androida ignorują rotowany podpisujący i zamiast tego używają oryginalnego podpisującego w bloku w wersji 3.

Aplikacje, których klucz podpisywania nie został jeszcze zastąpiony, nie wymagają żadnych dodatkowych działań. Gdy te aplikacje zdecydują się na rotację, system domyślnie zastosuje schemat podpisu v3.1.

Blok podpisywania v3.1

Blok podpisywania w wersji 3.1 będzie miał tę samą zawartość co blok podpisywania w wersji 3, ale z nowym identyfikatorem bloku. Te podpisy będą rozpoznawane tylko na urządzeniach z Androidem 13 lub nowszym. Dzięki temu aplikacje mogą bezpiecznie rotować klucze podpisywania bez obaw o pliki APK z wieloma celami, ponieważ pierwotny podpisujący może podpisywać plik APK w bloku podpisywania w wersji 3, a podpisujący po rotacji – w bloku podpisywania w wersji 3.1. Pozwala to platformie na ponowne użycie wszystkich dotychczasowych kodów weryfikacyjnych dla bloku podpisywania w wersji 3 podczas weryfikacji podpisu w wersji 3.1.

Domyślnie biblioteka apksig będzie używać bloku podpisywania v3.1, gdy w konfiguracji podpisywania podany jest klucz rotowany i rodowód. Jeśli minSdkVersion aplikacji jest mniejszy niż Android 13, a używany jest klucz rotowany, należy również podać oryginalny klucz podpisywania, aby można było użyć go do podpisania pliku APK w bloku podpisywania w wersji 3. Jest to podobne do obecnego zachowania, w którym wymagany jest pierwotny podpis, jeśli plik APK jest przeznaczony na wersję Androida wcześniejszą niż 9.

Aby umożliwić rotację kluczy docelowych od określonej wersji pakietu SDK, biblioteka apksig udostępni nowe interfejsy API, które pozwolą ustawić minimalną wersję pakietu SDK na potrzeby rotacji. Jeśli jako minimalną wersję do obsługi rotacji zostanie określona wersja pakietu SDK starsza niż Android 13, zostanie użyty oryginalny blok wersji 3. Blok podpisywania w wersji 3.1 jest używany tylko w przypadku rotacji, w której minimalna wersja pakietu SDK jest ustawiona na Androida 13 lub nowszego. Blok podpisywania w wersji 3 będzie zawierać nowy atrybut dotyczący ochrony przed usuwaniem minimalnej wersji pakietu SDK.

Plik APK zawiera Lineage Wartość parametru rotation-min-sdk-version Blok podpisywania w wersji 3 blok podpisywania wersji 3.1
Nie Domyślna lub dowolna wartość (poniżej oznaczona jako x) Podpisany przez pierwotnego podmiot, kierowany na Androida 9 i nowsze Nieobecność
Tak Domyślny Podpisany przez pierwotnego podmiot, kierowany na Androida 9–12L Podpisano za pomocą rotowanego podpisującego, kierując na Androida 13 lub nowszego
Tak x < 33 (Android 13) Podpisano za pomocą rotowanego podpisującego, kierując na Androida 9 lub nowszego Nieobecność
Tak x >= 33 (Android 13) Podpisano oryginalnym podpisem, kierowanie na Androida 9 – (x-1) Podpisano z rotacją podpisu, kierowanie x+

Problemy związane z rotacją

Na platformie zostały rozwiązane te problemy związane z obrotem:

poprawki dotyczące Androida 12,

  • Platforma przyznaje uprawnienie do podpisywania tylko wtedy, gdy bieżący podpisujący jednej z aplikacji jest podpisującym lub jest bieżącym podpisującym drugiej aplikacji. Zapobiega to przyznaniu uprawnienia do podpisywania aplikacji, jeśli obie aplikacje stosują się do zaleceń dotyczących kluczy podpisywania i korzystają z różnych kluczy podpisywania.
  • Funkcja przywracania pliku APK na platformie nie może przywrócić pliku APK, którego klucz podpisywania został rotowany, chyba że poprzedni klucz w pochodzeniu klucza podpisywania miał możliwość przywrócenia. Ta funkcja niweczy jednak cel rotacji, ponieważ pozwala na podpisanie nowego pakietu aktualizacji za pomocą poprzedniego klucza podpisywania i przywrócenie rotowanego klucza.
  • Plik APK podpisany tylko za pomocą klucza po rotacji, a później zaktualizowany za pomocą pliku APK podpisanego pierwotnym kluczem i kluczem po rotacji w linii dziedziczenia, będzie zawierał tylko klucz po rotacji w linii dziedziczenia na urządzeniach z Androidem 11 lub starszym.

poprawki dotyczące Androida 11,

  • PackageManager#checkSignatures nie został odpowiednio zaktualizowany, aby sprawdzić oryginalne klucze podpisywania 2 pakietów. Spowodowało to przerwanie pomiarów w przypadku aplikacji używających klucza podpisywania po rotacji z plikiem APK pomiarów korzystającym z pierwotnego klucza podpisywania.
  • Pakiety w ramach sharedUserId mają ten sam łańcuch podpisów. Gdy aplikacja z zaktualizowaną linią podpisywania zostanie zainstalowana lub zaktualizowana w ramach sharedUiserId, linia tej aplikacji zastąpi wspólną linię sharedUserId (czyli jeśli linia podpisywania aplikacji to A -> B, a aplikacja zostanie zaktualizowana w ramach sharedUserId z linią B -> C, linia sharedUserId zostanie zastąpiona przez B -> C). Podobnie możliwości poprzedniego podpisującego w łańcuchu nie można zaktualizować, chyba że zmieniono łańcuch podpisywania.

Integracja z wersją 4

Schemat podpisu w wersji 4 używa konfiguracji podpisywania przekazanej do narzędzia apksigner. W przypadku wielu konfiguracji podpisywania podanych do rotacji używana jest najnowsza rotowana konfiguracja podpisywania. Przed wprowadzeniem wersji 3.1 wersja 3 zawierała tylko tę najnowszą rotowaną konfigurację podpisywania, więc wersja 4 mogła używać tej konfiguracji w postaci w postaci. W tym przypadku schemat podpisu w wersji 4 mógł obsługiwać rotację, ponieważ w swoim obiekcie SigningInfo używał rotowanego klucza podpisywania. Chociaż blok SigningInfo w wersji 4 nie zawiera pełnego łańcucha podpisywania, może pobrać go z bloku podpisywania w wersji 3, aby umożliwić platformie dostęp do łańcucha w przypadku dowolnych zapytań dotyczących podpisu. Gdy wersja 3.1 jest używana do kierowania na rotację dla podanej wartości parametru rotation-min-sdk, ogólna konfiguracja w wersji 3 będzie zawierać zarówno oryginalną konfigurację podpisywania, jak i najnowszą rotowaną konfigurację podpisywania. Utworzono rozszerzenie schematu podpisu w wersji 4, które zawiera dodatkowe bloki informacji o podpisywaniu dla każdej konfiguracji podpisywania z bloku w wersji 3.1.

Weryfikacja

Aby przetestować implementację wersji 3.1, uruchom PkgInstallSignatureVerificationTest.javatesty CTS w cts/hostsidetests/appsecurity/src/android/appsecurity/cts/.

Więcej informacji o testowaniu znajdziesz w sekcji weryfikacji w wersji 3.