Ta strona zawiera informacje o składaniu zasad SELinux. Zasady SELinux są tworzone na podstawie kombinacji zasad AOSP (platformy) i zasad dotyczących urządzenia (dostawcy). Proces kompilacji zasad SELinux w przypadku Androida 4.4–7.0 łączy wszystkie fragmenty sepolicy, a następnie generuje pliki monolityczne w katalogu głównym. Oznacza to, że dostawcy układów SoC i producenci ODM modyfikowali wartość boot.img
(w przypadku urządzeń innych niż A/B) lub system.img
(w przypadku urządzeń A/B) za każdym razem, gdy zmieniały się zasady.
W Androidzie 8.0 i nowszych zasady platformy i dostawcy są tworzone oddzielnie.
Organizacje SOC i OEM mogą aktualizować swoje części zasad, tworzyć obrazy (takie jak vendor.img
i boot.img
), a następnie aktualizować te obrazy niezależnie od aktualizacji platformy.
Ponieważ jednak pliki zasad SELinux w wersji modułowej są przechowywane w partycjach /vendor
, proces init
musi wcześniej zamontować partycje systemową i partycje dostawcy, aby móc odczytać pliki SELinux z tych partycji i złączyć je z podstawowymi plikami SELinux w katalogu systemowym (przed załadowaniem ich do jądra).
Pliki źródłowe
Zasady kompilowania SELinux znajdują się w tych plikach:
-
external/selinux
: zewnętrzny projekt SELinux, służący do tworzenia narzędzi wiersza poleceń HOST do kompilowania zasad i etykiet SELinux.-
external/selinux/libselinux
: Android używa tylko podzbioru zewnętrznego projektulibselinux
oraz kilku dostosowań specyficznych dla Androida. Więcej informacji znajdziesz w artykuleexternal/selinux/README.android
. -
external/selinux/libsepol
: -
external/selinux/checkpolicy
: kompilator zasad SELinux (pliki wykonywalne hosta:checkpolicy
,checkmodule
idispol
). Zależy odlibsepol
.
-
-
system/sepolicy
: podstawowe konfiguracje zasad SELinux Androida, w tym konteksty i pliki zasad. Tu też znajduje się główna logika tworzenia reguł sepolicy (system/sepolicy/Android.mk
).
Więcej informacji o plikach w system/sepolicy
Wdrażanie SELinux.
Android 7.x i starsze
W tej sekcji opisano, jak zasady SELinux są tworzone w Androidzie 7.x i starszych.
Proces kompilacji na Androida 7.x i starsze
Zasady SELinux są tworzone przez połączenie zasad AOSP z dostosowaniami specyficznymi dla urządzenia. Następnie połączone zasady są przekazywane do kompilatora zasad i różnych sprawdzarek. Dostosowywanie na potrzeby konkretnego urządzenia odbywa się za pomocą zmiennej BOARD_SEPOLICY_DIRS
zdefiniowanej w pliku Boardconfig.mk
dotyczącym tego urządzenia. Ta globalna zmienna kompilacji zawiera listę katalogów, które określają kolejność wyszukiwania dodatkowych plików zasad.
Na przykład dostawca SoC i ODM mogą dodać po jednym katalogu – jeden dla ustawień dotyczących SoC, a drugi dla ustawień dotyczących urządzenia – aby wygenerować ostateczne konfiguracje SELinux dla danego urządzenia:
BOARD_SEPOLICY_DIRS += device/SOC/common/sepolicy
BOARD_SEPOLICY_DIRS += device/SoC/DEVICE/sepolicy
Treść plików file_contexts w folderach system/sepolicy
i BOARD_SEPOLICY_DIRS
jest łączona, aby wygenerować plik file_contexts.bin
na urządzeniu:

Rysunek 1. Logika kompilacji SELinux.
Plik sepolicy
składa się z kilku plików źródłowych:
- Tekst
policy.conf
jest generowany przez złączenie plikówsecurity_classes
,initial_sids
,*.te
,genfs_contexts
iport_contexts
w podanej kolejności. - W przypadku każdego pliku (np.
security_classes
) jego zawartość to konkatenacja plików o tej samej nazwie wsystem/sepolicy/
iBOARDS_SEPOLICY_DIRS
. policy.conf
jest wysyłany do kompilatora SELinux w celu sprawdzenia poprawności składni i skompilowany w formacie binarnym jakosepolicy
na urządzeniu.Rysunek 2. Plik zasad SELinux.
Pliki SELinux
Po skompilowaniu urządzenia z Androidem 7.x i starszym zwykle zawierają te pliki związane z SELinux:
selinux_version
- sepolicy: wyjście binarne po połączeniu plików zasad (takich jak
security_classes
,initial_sids
i*.te
) file_contexts
property_contexts
seapp_contexts
service_contexts
system/etc/mac_permissions.xml
Więcej informacji znajdziesz w artykule Wdrażanie SELinux.
Inicjalizacja SELinux
Podczas uruchamiania systemu SELinux jest w trybie dozwolonym (a nie w trybie egzekwowania). Proces inicjalizacji wykonuje te zadania:
- Ładuje pliki
sepolicy
z ramdiska do jądra za pomocą funkcji/sys/fs/selinux/load
. - Przełącza SELinux na tryb wymuszania.
- Wykonuje
re-exec()
, aby zastosować regułę domeny SELinux do siebie.
Aby skrócić czas uruchamiania, jak najszybciej przeprowadź proces re-exec()
na urządzeniu init
.
Android 8.0 lub nowszy
W Androidzie 8.0 zasada SELinux jest podzielona na komponenty platformy i dostawcy, aby umożliwić niezależne aktualizacje zasad platformy i dostawcy przy zachowaniu zgodności.
Platforma sepolicy jest dalej podzielona na części prywatne i publiczne, aby eksportować określone typy i atrybuty do twórców zasad dostawcy. Publiczne typy/atrybuty platformy są zawsze utrzymywane jako stabilne interfejsy API w przypadku danej wersji platformy. Zgodność z poprzednimi typami/atrybutami publicznymi platformy można zagwarantować w przypadku kilku wersji za pomocą plików mapowania platformy.
Proces kompilacji w Androidzie 8.0
Zasady SELinux w Androidzie 8.0 zostały utworzone przez połączenie elementów z wersji /system
i /vendor
. Logika odpowiedniej konfiguracji znajduje się w pliku
/platform/system/sepolicy/Android.mk
.
Zasady znajdują się w tych miejscach:
Lokalizacja | Zawiera |
---|---|
system/sepolicy/public |
Interfejs API sepolicy platformy |
system/sepolicy/private |
Szczegóły implementacji na platformie (dostawcy mogą je zignorować) |
system/sepolicy/vendor |
pliki zasad i kontekstu, których mogą używać dostawcy (w razie potrzeby mogą je zignorować); |
BOARD_SEPOLICY_DIRS |
sepolicy dostawcy |
BOARD_ODM_SEPOLICY_DIRS (Android 9 lub nowszy) |
Odm sepolicy |
SYSTEM_EXT_PUBLIC_SEPOLICY_DIRS (Android 11 lub nowszy) |
Interfejs API sepolicy w System_ext |
SYSTEM_EXT_PRIVATE_SEPOLICY_DIRS (Android 11 lub nowszy) |
Szczegóły implementacji System_ext (dostawcy mogą je zignorować) |
PRODUCT_PUBLIC_SEPOLICY_DIRS (Android 11 lub nowszy) |
Interfejs API sepolicy usługi |
PRODUCT_PRIVATE_SEPOLICY_DIRS (Android 11 lub nowszy) |
Szczegóły implementacji produktu (dostawcy mogą je zignorować) |
System kompilacji pobiera te zasady i generuje komponenty zasad system, system_ext, product, vendor i odm w odpowiedniej partycji. Czynności do wykonania:
- konwertowanie zasad do formatu CIL (SELinux Common Intermediate Language):
- public platform policy (system + system_ext + product)
- połączone zasady prywatne i publiczne
- public + vendor and
BOARD_SEPOLICY_DIRS
policy
- Wersje zasad udostępnionych publicznie jako część zasad dostawcy.
Jest to możliwe dzięki zastosowaniu wygenerowanej publicznej polityki CIL, aby poinformować połączoną politykę publiczną + dostawcy +
BOARD_SEPOLICY_DIRS
, które części należy przekształcić w atrybuty, które zostaną połączone z zasadami platformy. - Utwórz plik mapowania łączący platformę i części dostawcy. Początkowo łączy ona tylko typy z publicznych zasad z odpowiadającymi im atrybutami w zasadach dostawcy. Później będzie też stanowić podstawę pliku obsługiwanego w przyszłych wersjach platformy, co umożliwi zgodność z zasadami dostawcy kierowanymi na tę wersję platformy.
- Łączenie plików zasad (opisać rozwiązania na urządzeniu i skompilowane wstępnie).
- Połącz mapowanie z zasadami platformy i dostawcy.
- Kompilowanie wyjściowego binarnego pliku zasad.
Publiczna platforma sepolicy
Publiczna polityka bezpieczeństwa platformy obejmuje wszystkie elementy zdefiniowane w
system/sepolicy/public
. Platforma może zakładać, że typy i atrybuty zdefiniowane w zasadach publicznych są stabilnymi interfejsami API dla danej wersji platformy. Jest to część sepolicy eksportowana przez platformę, na której deweloperzy zasad dostawców (czyli deweloperzy zasad dotyczących urządzenia) mogą tworzyć dodatkowe zasady dotyczące urządzenia.
Typy są wersjonowane zgodnie z wersją zasad, na podstawie których są tworzone pliki dostawcy. Wersja jest określana przez zmienną kompilacji PLATFORM_SEPOLICY_VERSION
. Wersja publiczna zasad jest następnie uwzględniana w zasadach dostawcy i (w pierwotnej formie) w zasadach platformy. Ostateczne zasady obejmują zasady prywatne platformy, publiczne zasady bezpieczeństwa bieżącej platformy, zasady dotyczące urządzenia oraz publiczne zasady z wersją odpowiadającą wersji platformy, dla której zostały napisane zasady urządzenia.
Platforma prywatna sepolicy
Polityka prywatności platformy obejmuje wszystkie elementy zdefiniowane w
/system/sepolicy/private
. Ta część zasad określa typy, uprawnienia i atrybuty wymagane do działania platformy. Nie są one eksportowane do vendor/device
. Autorzy zasad niebędących platformami nie mogą pisać rozszerzeń zasad na podstawie typów, atrybutów ani reguł zdefiniowanych w zasadach prywatności platformy. Ponadto te reguły można modyfikować lub mogą zniknąć w ramach aktualizacji tylko frameworku.
Mapowanie prywatne na platformie
Mapowanie prywatne platformy obejmuje oświadczenia o zasadach, które mapują atrybuty udostępnione w publicznych zasadach platformy w poprzednich wersjach platformy na konkretne typy używane w bieżących publicznych zasadach platformy. Dzięki temu zasady dostawcy napisane na podstawie publicznych atrybutów platformy z poprzednich wersji publicznych zasad bezpieczeństwa platformy nadal działają. Numeracja wersji jest oparta na zmiennej kompilacji PLATFORM_SEPOLICY_VERSION
ustawionej w AOSP dla danej wersji platformy. Dla każdej poprzedniej wersji platformy, z której ta platforma ma akceptować zasady dostawcy, istnieje oddzielny plik mapowania. Więcej informacji znajdziesz w sekcji dotyczącej zgodności.
Android 11 lub nowszy
system_ext i product sepolicy
W Androidzie 11 dodano zasady system_ext i zasady dotyczące produktu. Podobnie jak w przypadku platformy sepolicy, zasady system_ext i zasady usługi są podzielone na zasady publiczne i prywatne.
Publiczne zasady są eksportowane do dostawcy. Typy i atrybuty stają się stabilnym interfejsem API, a zasady dostawcy mogą odnosić się do typów i atrybutów w publicznych zasadach. Typy są wersjonowane zgodnie z PLATFORM_SEPOLICY_VERSION
, a wersja zasad jest uwzględniona w zasadach dostawcy. Pierwotna zasada jest dołączona do każdej partycji system_ext i partycji produktu.
Zasady prywatności zawierają typy, uprawnienia i atrybuty dostępne tylko dla system_ext i produktów, które są wymagane do działania system_ext i partycji produktów. Prywatne zasady są niewidoczne dla dostawcy, co oznacza, że są to zasady wewnętrzne, które można modyfikować.
system_ext i mapowanie produktu
System_ext i product mogą eksportować swoje wyznaczone publiczne typy do vendor. Obowiązkiem zapewnienia zgodności jest jednak każdy partner. Aby zapewnić zgodność, partnerzy mogą udostępnić własne pliki mapowania, które mapują atrybuty wersji poprzednich wersji na konkretne typy używane w bieżącej wersji publicznej sepolicy.
- Aby zainstalować plik mapowania dla system_ext, umieść plik CIL zawierający odpowiednie informacje mapowania w katalogu
{SYSTEM_EXT_PRIVATE_SEPOLICY_DIRS}/compat/{ver}/{ver}.cil
, a potem dodajsystem_ext_{ver}.cil
do kataloguPRODUCT_PACKAGES
. - Aby zainstalować plik mapowania dla produktu, umieść plik .cil zawierający odpowiednie informacje mapowania w folderze
{PRODUCT_PRIVATE_SEPOLICY_DIRS}/compat/{ver}/{ver}.cil
, a następnie dodaj plikproduct_{ver}.cil
do folderuPRODUCT_PACKAGES
.
Zapoznaj się z przykładem, w którym dodano plik mapowania partycji produktu urządzenia Redbull.
Wstępnie skompilowana zasada SELinux
Zanim init
włączy SELinux, init
gromadzi wszystkie pliki CIL z partycji (system
, system_ext
, product
, vendor
i odm
) i kompiluje je w binarną politykę, czyli format, który można załadować do jądra. Kompilacja zajmuje trochę czasu (zwykle 1–2 sekundy), dlatego pliki CIL są wstępnie kompilowane w czasie kompilacji i umieszczone w katalogu /vendor/etc/selinux/precompiled_sepolicy
lub /odm/etc/selinux/precompiled_sepolicy
wraz z heszczem sha256 plików CIL wejściowych. Podczas działania init
sprawdza, czy któryś z plików zasad został zaktualizowany, porównując wartości skrótów. Jeśli nic się nie zmieniło, init
wczyta skompilowane wcześniej zasady. Jeśli nie, funkcja init
skompiluje go na bieżąco i użyje zamiast skompilowanego wcześniej.
Konkretnie: wstępnie skompilowane zasady są używane, jeśli są spełnione wszystkie te warunki. W tym przypadku {partition}
reprezentuje partycję, w której znajduje się skompilowana wcześniej zasada: vendor
lub odm
.
-
Obie kolumny
/system/etc/selinux/plat_sepolicy_and_mapping.sha256
i/{partition}/etc/selinux/precompiled_sepolicy.plat_sepolicy_and_mapping.sha256
istnieją i są identyczne. -
Ani
/system_ext/etc/selinux/system_ext_sepolicy_and_mapping.sha256
, ani/{partition}/etc/selinux/precompiled_sepolicy.system_ext_sepolicy_and_mapping.sha256
nie istnieją. albo oba istnieją i są identyczne. -
Ani
/product/etc/selinux/product_sepolicy_and_mapping.sha256
, ani/{partition}/etc/selinux/precompiled_sepolicy.product_sepolicy_and_mapping.sha256
nie istnieją. albo oba istnieją i są identyczne.
Jeśli którykolwiek z nich się różni, init
przechodzi do ścieżki kompilacji na urządzeniu. Więcej informacji znajdziesz w sekcji
system/core/init/selinux.cpp
.