Piaskownica aplikacji

Platforma Android wykorzystuje zabezpieczenia oparte na użytkownikach w celu identyfikować i izolować zasoby aplikacji. Pozwala to odizolować aplikacje od siebie nawzajem oraz chronić aplikacje i system przed złośliwymi aplikacjami. W tym celu Android przypisuje wartość do każdej aplikacji na Androida ma własny unikalny identyfikator użytkownika (UID). proces tworzenia konta.

Android używa identyfikatora UID do konfigurowania piaskownicy aplikacji na poziomie jądra. Rdzeń zapewnia bezpieczeństwo między aplikacjami a systemem na poziomie procesu za pomocą standardowych funkcji Linuksa, takich jak identyfikatory użytkowników i grup przypisane do aplikacji. Domyślnie aplikacje nie mogą wchodzić w interakcje ze sobą i mają ograniczony dostęp do systemu operacyjnego. Jeśli aplikacja A próbuje wykonać złośliwe działanie – na przykład odczytuje aplikacji B lub dzwoni na telefon bez pozwolenia, ponieważ nie ma odpowiednich domyślnych uprawnień użytkownika. Sandbox jest prosty, możliwy do kontrolowania i oparty na oddzielenie procesów od uprawnień do plików.

Piaskownica aplikacji znajduje się w rdzeniu, dlatego ten model zabezpieczeń obejmuje zarówno kod natywny, jak i aplikacje systemowe. Oprogramowanie znajdujące się nad jądrem, takie jak biblioteki systemu, framework aplikacji, środowisko wykonawcze aplikacji i wszystkie aplikacje, działa w piaskownicy aplikacji. Na niektórych platformach deweloperzy są ograniczeni do określonego frameworku programistycznego, zestawu interfejsów API lub języka. W Androidzie nie ma żadnych ograniczeń dotyczących sposobu pisania aplikacji, które są wymagane do zapewnienia bezpieczeństwa. W tym zakresie kod natywny jest tak samo bezpieczny jak kod interpretowany.

Zabezpieczenia

Ogólnie rzecz biorąc, aby wyjść poza Piaskownicę aplikacji w odpowiednio skonfigurowanym musi zagrażać bezpieczeństwu jądra Linuksa. Podobnie jak w przypadku innych funkcji zabezpieczeń, poszczególne zabezpieczenia stosowane w piaskowniku aplikacji nie są całkowicie odporne na ataki, dlatego ważne jest stosowanie zabezpieczeń wielowarstwowych, aby pojedyncze luki w zabezpieczeniach nie doprowadziły do naruszenia bezpieczeństwa systemu operacyjnego lub innych aplikacji.

Android korzysta z różnych zabezpieczeń, aby egzekwować piaskownicę aplikacji. Te środki zostały wprowadzone z upływem czasu i znacznie wzmocniły pierwotną piaskownicę kontroli dostępu (DAC) opartą na identyfikatorze UID. Poprzednie wersje Androida to: zabezpieczeń:

  • W Androidzie 5.0 system SELinux udostępniał obowiązkową separację 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 wymuszana przez UID DAC.
  • W Androidzie 6.0 piaskownica SELinux została rozszerzona, aby izolować aplikacje na podstawie granicy fizycznego użytkownika. Ponadto Android ustawił bezpieczne ustawienia domyślne dla dane aplikacji: w przypadku aplikacji z atrybutem targetSdkVersion >= 24 (domyślnie) Uprawnienia DAC w katalogu głównym aplikacji zostały zmienione z 751 na 700. Dzięki temu zapewniamy bezpieczniejsze domyślne ustawienia dotyczące prywatnych danych aplikacji (chociaż aplikacje mogą je zastąpić).
  • W Androidzie 8.0 wszystkie aplikacje były uruchamiane z użyciem filtra seccomp-bpf, który ograniczał systemowe wywołania funkcji, z których mogły korzystać aplikacje, wzmacniając w ten sposób granicę między aplikacją a jądrem.
  • W Androidzie 9 wszystkie nieuprzywilejowane aplikacje z targetSdkVersion >= 28 muszą działać w poszczególnych piaskownicach SELinux, zapewniając ochronę MAC na poziomie aplikacji. Ta ochrona poprawia rozdzielenie aplikacji, zapobiega zastępowaniu domyślne i (w większości przypadków) uniemożliwia aplikacjom tworzenie świata danych i łatwo dostępnych rozwiązań.
  • Aplikacje na Androida 10 mają ograniczony, nieprzetworzony widok bez bezpośredniego dostępu do ścieżek takich jak /sdcard/DCIM. Jednak aplikacje z pełnym nieprzetworzonym dostępem do swoich ścieżek dla poszczególnych pakietów, które zwraca odpowiednich metod, takich jak Context.getExternalFilesDir().

Wytyczne dotyczące udostępniania plików

Ustawienie danych aplikacji jako dostępnych dla wszystkich jest nieodpowiednią praktyką bezpieczeństwa. Dostęp jest przyznawany wszystkim, a nie można ograniczyć go tylko do wybranych odbiorców. Praktyka ta doprowadziła do wycieku ujawniania informacji i zdezorientowania odbiorców. które mają luki w zabezpieczeniach i są ulubionym celem złośliwego oprogramowania atakującego aplikacje. zawierające dane wrażliwe (np. klienty poczty e-mail). W Androidzie 9 i nowszych udostępnianie plików w ten sposób jest wyraźnie zabronione w przypadku aplikacji z uprawnieniem targetSdkVersion>=28.

Zamiast udostępniać dane aplikacji wszystkim użytkownikom, podczas udostępniania plików postępuj zgodnie z tymi wytycznymi:

  • Jeśli Twoja aplikacja musi udostępnić pliki innej aplikacji, użyj dostawcy treści. Dostawcy treści udostępniają dane z odpowiednią szczegółowością bez wielu wad łatwo dostępnych na całym świecie uprawnień systemu UNIX (dla Więcej informacji można znaleźć w sekcji podstawowe informacje o dostawcach treści).
  • Jeśli aplikacja zawiera pliki, które rzeczywiście powinny być dostępne dla wszystkich użytkowników (np. zdjęcia), muszą być związane z multimediami (zdjęcia, filmy i pliki audio). tylko) i przechowywane za pomocą MediaStore. (Więcej informacji o dodawaniu multimediów elementu, patrz dostęp do plików multimedialnych z pamięci współdzielonej,

Uprawnienia Storage w czasie wykonywania kontrolują dostęp do zbiorów o ścisłym typie za pomocą MediaStore. Aby uzyskać dostęp do słabo napisanych plików, takich jak pliki PDF czy klasa MediaStore.Downloads, aplikacje muszą używać protokołu intencje takie jak intencja ACTION_OPEN_DOCUMENT.

Aby włączyć działanie zgodne z Androidem 10, użyj atrybutu requestLegacyExternalStorage w pliku manifestu i stosuj się do sprawdzonych metod dotyczących uprawnień aplikacji.

  • Domyślna wartość flagi w pliku manifestu to true w przypadku aplikacji kierowanych na Androida 9 (i starszych).
  • W przypadku aplikacji kierowanych na Androida 10 domyślna wartość to „false”. Aby tymczasowo zrezygnować z filtrowania widoku pamięci w aplikacjach kierowanych na Androida 10, ustaw wartość flagi pliku manifestu na true.
  • Korzystając z uprawnień z ograniczeniami, instalator dodaje aplikacje do listy dozwolonych do pamięci poza piaskownicą. Aplikacje usunięte z listy dozwolonych są umieszczane w sandboksie.