Podpisywanie aplikacji

Podpisywanie aplikacji pozwala programistom zidentyfikować autora aplikacji i zaktualizować swoją aplikację bez tworzenia skomplikowanych interfejsów i uprawnień. Każdy wniosek, który jest uruchamiany na platformie Android musi być podpisana przez autora . Aplikacje, które próbują zainstalować bez podpisania, będą odrzucane przez Google Play lub instalatora pakietów na urządzeniu z Androidem.

W Google Play podpisywanie aplikacji łączy zaufanie firmy Google do programisty i zaufanie programisty do aplikacji. Deweloperzy wiedzą, że ich aplikacja jest dostarczana, niezmodyfikowana, na urządzeniu z Androidem; a programiści mogą zostać pociągnięci do odpowiedzialności za zachowanie ich aplikacji.

W systemie Android podpisywanie aplikacji jest pierwszym krokiem do umieszczenia aplikacji w jej piaskownicy aplikacji. Podpisany certyfikat aplikacji określa, który identyfikator użytkownika jest powiązany z daną aplikacją; różne aplikacje działają pod różnymi identyfikatorami użytkownika. Podpisywanie aplikacji zapewnia, że ​​jedna aplikacja nie może uzyskać dostępu do żadnej innej aplikacji, z wyjątkiem dobrze zdefiniowanego IPC.

Po zainstalowaniu aplikacji (pliku APK) na urządzeniu z systemem Android Menedżer pakietów weryfikuje, czy plik APK został prawidłowo podpisany za pomocą certyfikatu zawartego w tym pakiecie APK. Jeśli certyfikat (a dokładniej klucz publiczny w certyfikacie) jest zgodny z kluczem używanym do podpisywania dowolnego innego pakietu APK na urządzeniu, nowy pakiet APK ma możliwość określenia w manifeście, że podobnie będzie współdzielił identyfikator UID z innym pakietem -podpisane pliki APK.

Wnioski mogą być podpisane przez stronę trzecią (OEM, operator, rynek alternatywny) lub samodzielnie. Android zapewnia podpisywanie kodu przy użyciu certyfikatów z podpisem własnym, które programiści mogą generować bez pomocy lub pozwolenia z zewnątrz. Wnioski nie muszą być podpisane przez organ centralny. Android obecnie nie przeprowadza weryfikacji CA dla certyfikatów aplikacji.

Aplikacje mogą również deklarować uprawnienia bezpieczeństwa na poziomie ochrony podpisu, ograniczając dostęp tylko do aplikacji podpisanych tym samym kluczem przy jednoczesnym zachowaniu odrębnych identyfikatorów UID i piaskownic aplikacji. Bliższa relacja ze wspólną Application Sandbox jest dozwolone poprzez wspólną cechę UID gdy dwa lub więcej aplikacji podpisane z tym samym kluczem deweloperskim może zadeklarować wspólną UID w swoim manifeście.

Schematy podpisywania APK

Android obsługuje trzy schematy podpisywania aplikacji:

Aby uzyskać maksymalną zgodność, podpisuj aplikacje za pomocą wszystkich schematów, najpierw v1, następnie v2, a następnie v3. Urządzenia z Androidem 7.0+ i nowszymi instalują aplikacje podpisane schematami v2+ szybciej niż te podpisane tylko schematem v1. Starsze platformy Androida ignorują sygnatury v2+ i dlatego wymagają aplikacji zawierających sygnatury v1.

Podpisywanie JAR (schemat v1)

Podpisywanie APK było częścią Androida od samego początku. Jest on oparty na podpisanym JAR . Aby uzyskać szczegółowe informacje na temat korzystania z tego programu można znaleźć w dokumentacji Android studio na podpisywanie aplikacji .

Podpisy v1 nie chronią niektórych części APK, takich jak metadane ZIP. Weryfikator APK musi przetworzyć wiele niezaufanych (jeszcze nie zweryfikowanych) struktur danych, a następnie odrzucić dane nieobjęte podpisami. Daje to sporą powierzchnię ataku. Co więcej, weryfikator APK musi zdekompresować wszystkie skompresowane wpisy, zużywając więcej czasu i pamięci. Aby rozwiązać te problemy, w systemie Android 7.0 wprowadzono schemat podpisu APK w wersji 2.

Schemat podpisu APK v2 i v3 (schemat v2+)

Urządzenia z systemem Android 7.0 i nowszym obsługują schemat sygnatur APK v2 (schemat v2) i nowsze. (Schemat v2 został zaktualizowany do wersji 3 w systemie Android 9, aby uwzględnić dodatkowe informacje w bloku podpisywania, ale poza tym działa tak samo.) Zawartość APK jest zaszyfrowana i podpisana, a następnie wynikowy blok podpisywania APK jest wstawiany do APK. Szczegółowe informacje na temat stosowania systemu v2 + do aplikacji, zobacz APK Signature Scheme v2 .

Podczas walidacji schemat v2+ traktuje plik APK jako obiekt BLOB i wykonuje sprawdzanie podpisów w całym pliku. Wszelkie modyfikacje APK, w tym modyfikacje metadanych ZIP, unieważniają podpis APK. Ta forma weryfikacji APK jest znacznie szybsza i umożliwia wykrycie większej liczby klas nieautoryzowanych modyfikacji.

Nowy format jest kompatybilny wstecz, więc pliki APK podpisane nowym formatem podpisu można instalować na starszych urządzeniach z Androidem (które po prostu ignorują dodatkowe dane dodawane do pliku APK), o ile te pliki APK są również podpisane w wersji 1.

Proces weryfikacji podpisu APK

Rysunek 1. Sposób weryfikacji podpisu APK

Skrót całego pliku APK jest weryfikowany na podstawie podpisu v2+ przechowywanego w bloku podpisywania APK. Skrót obejmuje wszystko oprócz bloku podpisywania APK, który zawiera sygnaturę v2+. Wszelkie modyfikacje APK poza blokiem podpisywania APK unieważniają podpis APK w wersji v2+. Pliki APK z pozbawionym podpisu v2+ są również odrzucane, ponieważ ich podpis v1 wskazuje, że plik APK został podpisany w wersji v2, co sprawia, że ​​Android 7.0 i nowsze wersje odmawiają weryfikacji plików APK przy użyciu ich podpisów v1.

Szczegółowe informacje o weryfikacji podpisu APK, patrz punkt weryfikacji APK Signature schemacie V2.