Piaskownica aplikacji

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.