Platforma Android wykorzystuje ochronę opartą na systemie Linux do identyfikowania i izolowania zasobów aplikacji. To izoluje aplikacje od siebie i chroni aplikacje oraz system przed złośliwymi aplikacjami. W tym celu system Android przypisuje unikalny identyfikator użytkownika (UID) do każdej aplikacji systemu Android i uruchamia ją we własnym procesie.
System Android używa identyfikatora UID do skonfigurowania piaskownicy aplikacji na poziomie jądra. Jądro wymusza zabezpieczenia między aplikacjami a systemem na poziomie procesu za pomocą standardowych udogodnień systemu Linux, takich jak identyfikatory użytkowników i grup, które są przypisane do aplikacji. Domyślnie aplikacje nie mogą wchodzić ze sobą w interakcje i mają ograniczony dostęp do systemu operacyjnego. Jeśli aplikacja A próbuje zrobić coś złośliwego, na przykład odczytać dane aplikacji B lub wybrać numer telefonu bez pozwolenia, nie będzie to możliwe, ponieważ nie ma odpowiednich domyślnych uprawnień użytkownika. Piaskownica jest prosta, kontrolowana i oparta na dziesiątkach lat separacji użytkowników procesów i uprawnień do plików w stylu UNIX.
Ponieważ piaskownica aplikacji znajduje się w jądrze, ten model zabezpieczeń obejmuje zarówno kod natywny, jak i aplikacje systemu operacyjnego. Całe oprogramowanie powyżej jądra, takie jak biblioteki systemu operacyjnego, struktura aplikacji, środowisko wykonawcze aplikacji i wszystkie aplikacje, działają w piaskownicy aplikacji. Na niektórych platformach programiści są ograniczeni do określonej struktury programistycznej, zestawu interfejsów API lub języka. W systemie Android nie ma ograniczeń dotyczących sposobu pisania aplikacji, które są wymagane do wymuszania bezpieczeństwa; pod tym względem kod natywny jest tak samo piaskowany jak kod interpretowany.
Zabezpieczenia
Generalnie, aby wyrwać się z piaskownicy aplikacji w prawidłowo skonfigurowanym urządzeniu, należy złamać bezpieczeństwo jądra Linux. Jednak, podobnie jak w przypadku innych funkcji zabezpieczeń, indywidualne zabezpieczenia wymuszające działanie piaskownicy aplikacji nie są niewrażliwe na ataki, dlatego dogłębna ochrona jest ważna, aby pojedyncze luki nie prowadziły do złamania zabezpieczeń systemu operacyjnego lub innych aplikacji.
Android korzysta z wielu zabezpieczeń, aby wymusić stosowanie piaskownicy aplikacji. Te wymuszania zostały wprowadzone z biegiem czasu i znacznie wzmocniły oryginalną piaskownicę opartej na UID arbitralnej kontroli dostępu (DAC). Poprzednie wersje Androida zawierały następujące zabezpieczenia:
- W systemie Android 5.0 SELinux zapewniał obowiązkową separację kontroli dostępu (MAC) między systemem a aplikacjami. Jednak wszystkie aplikacje innych firm działały w tym samym kontekście SELinux, więc izolacja między aplikacjami była głównie wymuszona przez DAC UID.
- W systemie Android 6.0 piaskownica SELinux została rozszerzona, aby izolować aplikacje na granicy użytkownika fizycznego. Ponadto Android ustawia również bezpieczniejsze wartości domyślne dla danych aplikacji: W przypadku aplikacji z
targetSdkVersion >= 24
domyślne uprawnienia DAC w katalogu domowym aplikacji zostały zmienione z 751 na 700. Zapewniło to bezpieczniejsze domyślne ustawienia dla prywatnych danych aplikacji (chociaż aplikacje mogą zastąpić te ustawienia domyślne) . - W systemie Android 8.0 wszystkie aplikacje zostały ustawione tak, aby działały z
seccomp-bpf
, który ograniczał wywołania systemowe, z których mogły korzystać aplikacje, wzmacniając w ten sposób granicę między aplikacjami i jądrami. - W systemie Android 9 wszystkie nieuprzywilejowane aplikacje z
targetSdkVersion >= 28
muszą działać w poszczególnych piaskownicach SELinux, zapewniając adres MAC dla każdej aplikacji. Ta ochrona poprawia separację aplikacji, zapobiega zastępowaniu bezpiecznych ustawień domyślnych i (co najważniejsze) uniemożliwia aplikacjom udostępnianie swojego świata danych. - W Androidzie 10 aplikacje mają ograniczony surowy widok systemu plików, bez bezpośredniego dostępu do ścieżek, takich jak /sdcard/DCIM. Jednak aplikacje zachowują pełny surowy dostęp do ścieżek specyficznych dla pakietów, zwracanych przez odpowiednie metody, takie jak Context.getExternalFilesDir() .
Wytyczne dotyczące udostępniania plików
Ustawienie danych aplikacji jako dostępnych na całym świecie to kiepska praktyka bezpieczeństwa. Dostęp jest przyznawany wszystkim i nie można ograniczyć dostępu tylko do zamierzonych odbiorców. Praktyka ta doprowadziła do wycieków informacji i zdezorientowanych luk w zabezpieczeniach zastępców, a także jest ulubionym celem złośliwego oprogramowania, które atakuje aplikacje zawierające poufne dane (takie jak klienty poczty e-mail). W Androidzie 9 i nowszych udostępnianie plików w ten sposób jest jawnie zabronione dla aplikacji z targetSdkVersion>=28
.
Zamiast udostępniać dane aplikacji na całym świecie, podczas udostępniania plików skorzystaj z następujących wskazówek:
- Jeśli Twoja aplikacja musi udostępniać pliki innej aplikacji, użyj dostawcy treści . Dostawcy treści udostępniają dane z odpowiednią szczegółowością i bez wielu wad dostępnych na całym świecie uprawnień UNIX (aby uzyskać szczegółowe informacje, zobacz Podstawowe informacje o dostawcach treści ).
- Jeśli Twoja aplikacja zawiera pliki, które naprawdę powinny być dostępne dla całego świata (takie jak zdjęcia), muszą być one specyficzne dla multimediów (tylko zdjęcia, filmy i pliki audio) i przechowywane przy użyciu klasy MediaStore . (Aby uzyskać więcej informacji na temat dodawania elementu multimedialnego, zobacz Dostęp do plików multimedialnych z pamięci współdzielonej ).
Uprawnienie środowiska wykonawczego Storage kontroluje dostęp do kolekcji z jednoznacznie określonymi typami za pośrednictwem MediaStore . Aby uzyskać dostęp do słabo wpisanych plików, takich jak PDF i klasa MediaStore.Downloads , aplikacje muszą używać intencji, takich jak intencja ACTION_OPEN_DOCUMENT .
Aby włączyć zachowanie Androida 10, użyj atrybutu manifestu requestLegacyExternalStorage
i postępuj zgodnie ze sprawdzonymi metodami dotyczącymi uprawnień aplikacji .
- Domyślna wartość flagi manifestu to
true
dla aplikacji przeznaczonych na system Android 9 (i niższy). - Wartość domyślna to false w przypadku aplikacji na Androida 10. Aby tymczasowo zrezygnować z widoku filtrowanej pamięci w aplikacjach na Androida 10, ustaw wartość flagi manifestu na
true
. - Używając ograniczonych uprawnień, instalator umieszcza na białej liście aplikacje dozwolone do przechowywania w trybie innym niż piaskownica. Aplikacje spoza białej listy znajdują się w piaskownicy.