Linux ze zwiększonymi zabezpieczeniami w systemie Android

W ramach modelu bezpieczeństwa Androida, Android używa systemu Linux z ulepszonymi zabezpieczeniami (SELinux), aby wymusić obowiązkową kontrolę dostępu (MAC) nad wszystkimi procesami, nawet procesami uruchomionymi z uprawnieniami root/superużytkownika (funkcje Linuksa). Wiele firm i organizacji przyczyniło się do wdrożenia SELinux w systemie Android. Dzięki SELinux system Android może lepiej chronić i ograniczać usługi systemowe, kontrolować dostęp do danych aplikacji i dzienników systemowych, redukować skutki złośliwego oprogramowania i chronić użytkowników przed potencjalnymi błędami w kodzie na urządzeniach mobilnych.

SELinux działa na zasadzie odmowy domyślnej: wszystko, co nie jest wyraźnie dozwolone, jest zabronione. SELinux może działać w dwóch trybach globalnych:

  • Tryb zezwalający, w którym odmowy uprawnień są rejestrowane, ale nie są wymuszane.
  • Tryb wymuszania , w którym odmowy uprawnień są zarówno rejestrowane, jak i wymuszane.

Android zawiera SELinux w trybie wymuszania i odpowiednią politykę bezpieczeństwa, która domyślnie działa w AOSP. W trybie wymuszania niedozwolone akcje są blokowane, a wszystkie próby naruszeń są rejestrowane przez jądro w dmesg i logcat . Podczas programowania powinieneś użyć tych błędów, aby udoskonalić swoje oprogramowanie i zasady SELinux przed ich egzekwowaniem. Aby uzyskać więcej informacji, zobacz Implementacja SELinux .

SELinux obsługuje również tryb per-domain permissive , w którym określone domeny (procesy) mogą być permisywne, podczas gdy reszta systemu znajduje się w trybie globalnego wymuszania. Domena to po prostu etykieta identyfikująca proces lub zestaw procesów w polityce bezpieczeństwa, gdzie wszystkie procesy oznaczone tą samą domeną są traktowane identycznie przez politykę bezpieczeństwa. Tryb zezwalający na domenę umożliwia stopniowe stosowanie SELinux do stale rosnącej części systemu i tworzenie polityk dla nowych usług (przy jednoczesnym wymuszaniu reszty systemu).

Tło

Model bezpieczeństwa Androida jest częściowo oparty na koncepcji piaskownic aplikacji . Każda aplikacja działa we własnej piaskownicy. Przed Androidem 4.3 te piaskownice były definiowane przez utworzenie unikalnego identyfikatora UID Linuksa dla każdej aplikacji podczas instalacji. Android 4.3 i nowsze używają SELinux do dalszego definiowania granic piaskownicy aplikacji na Androida.

W systemie Android 5.0 i nowszych SELinux jest w pełni egzekwowany, opierając się na liberalnym wydaniu Androida 4.3 i częściowym egzekwowaniu Androida 4.4. Wraz z tą zmianą Android przeszedł z wymuszania na ograniczonym zestawie kluczowych domen ( installd , netd , vold i zygote ) na wszystko (ponad 60 domen). Konkretnie:

  • Wszystko jest w trybie wymuszania w Androidzie 5.x i nowszych.
  • W domenie init nie powinny działać żadne procesy inne niż init .
  • Każda ogólna odmowa (dla urządzenia default_service , socket_device block_device wskazuje, że urządzenie potrzebuje specjalnej domeny.

Android 6.0 wzmocnił system, zmniejszając dopuszczalność naszych zasad, aby uwzględnić lepszą izolację między użytkownikami, filtrowanie IOCTL, zmniejszone zagrożenie ze strony wystawionych usług, dalsze zaostrzanie domen SELinux i bardzo ograniczony dostęp /proc .

Android 7.0 zaktualizował konfigurację SELinux, aby jeszcze bardziej zablokować piaskownicę aplikacji i zmniejszyć powierzchnię ataku. Ta wersja podzieliła również monolityczny stos serwerów mediów na mniejsze procesy, aby zmniejszyć zakres ich uprawnień. Aby uzyskać więcej informacji, zobacz Ochrona systemu Android za pomocą większej liczby zabezpieczeń jądra systemu Linux i Wzmacnianie stosu multimediów .

Android 8.0 zaktualizował SELinux do pracy z Treble , co oddziela kod dostawcy niższego poziomu od struktury systemu Android. To wydanie zaktualizowało zasady SELinux, aby umożliwić producentom urządzeń i dostawcom SOC aktualizowanie ich części zasad, budowanie ich obrazów ( vendor.img , boot.img , itp.), a następnie aktualizowanie tych obrazów niezależnie od platformy lub odwrotnie.

Chociaż możliwe jest posiadanie wyższej/nowszej wersji platformy (framework) działającej na urządzeniu, odwrotny przypadek nie jest obsługiwany; obrazy dostawcy ( vendor.img/odm.img ) nie mogą mieć nowszej wersji niż platforma ( system.img ). Tak więc nowsza wersja platformy może powodować problemy z kompatybilnością SELinux, ponieważ polityka SELinux platformy jest w nowszej wersji niż części polityki SELinux dostawcy. Model systemu Android 8.0 zapewnia metodę zachowania zgodności , aby zapobiec niepotrzebnym jednoczesnym OTA.

Dodatkowe zasoby

Aby uzyskać pomoc w konstruowaniu użytecznych polityk SELinux, zapoznaj się z następującymi zasobami. Niektóre koncepcje SELinux nie są używane przez Androida, zobacz sekcję Specyfika , gdy rozważasz dokumentację zewnętrzną.