Android 13 obsługuje schemat podpisu plików APK w wersji 3.1, który jest ulepszoną wersją dotychczasowego schematu podpisu plików APK w wersji 3. Schemat w wersji 3.1 rozwiązuje niektóre znane problemy ze schematem podpisu plików APK w wersji 3 dotyczące rotacji. W szczególności schemat podpisu w wersji 3.1 obsługuje kierowanie na wersję SDK, co umożliwia rotację w celu kierowania na późniejszą wersję platformy.
Schemat podpisywania w wersji 3.1 używa identyfikatora bloku, który nie jest rozpoznawany na urządzeniach z Androidem 12 lub starszym. Dlatego platforma stosuje następujące zachowanie sygnatariusza:
- Urządzenia z Androidem 13 lub nowszym używają obróconego sygnatariusza w bloku v3.1.
- Urządzenia ze starszymi wersjami Androida ignorują rotację podpisu i zamiast tego używają oryginalnego podpisu w bloku v3.
Aplikacje, w których nie przeprowadzono jeszcze rotacji klucza podpisywania, nie wymagają żadnych dodatkowych działań. Gdy te aplikacje zdecydują się na rotację, system domyślnie zastosuje schemat podpisu w wersji 3.1.
Blok podpisu w wersji 3.1
Blok podpisu w wersji 3.1 zawiera te same informacje co blok podpisu w wersji 3, ale dzięki nowemu identyfikatorowi bloku te podpisy są rozpoznawane tylko na urządzeniach z Androidem 13 lub nowszym. Dzięki temu aplikacje mogą bezpiecznie zmieniać klucze podpisywania bez obaw o pliki APK z wieloma wersjami docelowymi, ponieważ oryginalny sygnatariusz może podpisać plik APK w bloku podpisywania v3, a zmieniony sygnatariusz w bloku podpisywania v3.1. Umożliwia to też platformie ponowne użycie wszystkich dotychczasowych kodów weryfikacyjnych w bloku podpisu w wersji 3 podczas weryfikowania podpisu w wersji 3.1.
Domyślnie biblioteka apksig używa bloku podpisywania w wersji 3.1, gdy w konfiguracji podpisywania podany jest obrócony klucz i jego pochodzenie. Jeśli minSdkVersion aplikacji jest starszy niż Android 12 i używany jest obrócony klucz, należy też podać oryginalny klucz podpisywania, aby można go było użyć 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ę wcześniejszą niż Android 9.
Aby obsługiwać rotację kluczy od określonej wersji pakietu SDK, biblioteka apksig udostępnia nowe interfejsy API, które umożliwiają ustawienie minimalnej wersji pakietu SDK na potrzeby rotacji. Jeśli jako minimalna wersja obsługi rotacji zostanie określona wersja pakietu SDK starsza niż Android 12, używany będzie oryginalny blok v3. Blok podpisu w wersji 3.1 jest używany tylko w przypadku rotacji, gdy minimalna wersja pakietu SDK dla rotacji jest ustawiona na Androida 12 lub nowszego. Blok podpisu w wersji 3 ma atrybut ochrony przed usuwaniem minimalnej wersji pakietu SDK na potrzeby rotacji.
| Plik APK zawiera informacje o pochodzeniu | Wartość parametru rotation-min-sdk-version | Blok podpisu w wersji 3 | Blok podpisu w wersji 3.1 |
|---|---|---|---|
| Nie | Wartość domyślna lub dowolna wartość (poniżej oznaczona jako x) | Podpisana przez pierwotnego sygnatariusza, kierowana na Androida 9 i nowsze wersje | Nie ma |
| Tak | Domyślny | Podpisana przez pierwotnego sygnatariusza, kierowana na Androida 9–12L | Podpisano za pomocą obróconego sygnatariusza, kierowanie na Androida 12 lub nowszego |
| Tak | x < 33 (Android 13) | Podpisany przez obróconego sygnatariusza, kierowany na Androida 9 i nowsze wersje | Nie ma |
| Tak | x >= 33 (Android 13) | Podpisano oryginalnym podpisem, kierowanie na Androida 9 – (x–1) | Podpisano z obróconym podpisem, kierowanie x+ |
Problemy związane z obracaniem
Na platformie rozwiązano te problemy związane z obracaniem:
Poprawki w Androidzie 12
- Platforma przyznaje uprawnienie do podpisu aplikacji, która o nie prosi, tylko wtedy, gdy bieżący podmiot podpisujący aplikację znajduje się w historii danych podpisywania lub jest bieżącym podmiotem podpisującym inną aplikację. Zapobiega to przyznawaniu uprawnienia do podpisu aplikacji, która o nie prosi, jeśli obie aplikacje postępują zgodnie ze sprawdzonymi metodami dotyczącymi kluczy podpisywania i zmieniają klucze podpisywania.
- Funkcja wycofywania pliku APK na platformie nie mogła wycofać pliku APK, którego klucz podpisywania został właśnie poddany rotacji, chyba że poprzedni klucz w linii podpisywania miał możliwość wycofania. Ta możliwość niweczy jednak cel rotacji, ponieważ umożliwia podpisanie nowej aktualizacji pakietu poprzednim kluczem podpisywania i wycofanie poddanego rotacji klucza.
- Plik APK podpisany tylko kluczem po rotacji, a później zaktualizowany plikiem APK podpisanym pierwotnym kluczem i kluczem po rotacji w linii pochodzenia, wyświetla w linii pochodzenia tylko klucz po rotacji na urządzeniach z Androidem 11 i starszymi wersjami.
Poprawki w Androidzie 11
PackageManager#checkSignaturesnie został prawidłowo zaktualizowany, aby sprawdzać oryginalne klucze podpisywania dwóch pakietów. Spowodowało to przerwanie instrumentacji w przypadku aplikacji, które używają klucza podpisywania poddanego rotacji, a plik APK instrumentacji używa oryginalnego klucza podpisywania.- Pakiety w ramach
sharedUserIdmają wspólną historię podpisywania. Gdy aplikacja ze zaktualizowaną ścieżką podpisywania zostanie zainstalowana lub zaktualizowana wsharedUiserId, ścieżka tej aplikacji zastąpi wspólną ścieżkęsharedUserId(czyli jeśli ścieżka podpisywania aplikacji to A → B, a aplikacja zostanie zaktualizowana wsharedUserIdze ścieżką B → C, to ścieżkasharedUserIdzostanie zastąpiona ścieżką B → C). Podobnie nie można było zaktualizować uprawnień poprzedniego sygnatariusza w linii pochodzenia, chyba że zmieniono linię pochodzenia podpisu.
Integracja z wersją 4
Schemat podpisu w wersji 4 korzysta z konfiguracji podpisywania przekazanej do narzędzia apksigner. W przypadku wielu konfiguracji podpisywania przekazanych na potrzeby rotacji używana jest najnowsza konfiguracja podpisywania po rotacji. Przed wprowadzeniem wersji 3.1 wersja 3 zawierała tylko najnowszą konfigurację podpisywania z rotacją, więc wersja 4 mogła używać tej konfiguracji w niezmienionej postaci. Dzięki temu schemat podpisu w wersji 4 mógł obsługiwać rotację, ponieważ używał klucza podpisywania z rotacją w informacjach o podpisywaniu. Chociaż element SigningInfo w wersji 4 nie zawiera pełnej historii danych podpisywania, może pobrać ją z bloku podpisywania w wersji 3, aby umożliwić platformie dostęp do historii danych w przypadku wszystkich zapytań o podpis. Gdy do kierowania rotacją w przypadku podanego atrybutu rotation-min-sdk-version używana jest wersja 3.1, ogólna konfiguracja w wersji 3 zawiera zarówno oryginalną konfigurację podpisywania, jak i najnowszą konfigurację podpisywania po rotacji. 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 weryfikacja w wersji 3.