Możliwości pozwalają procesom w systemie Linux zrezygnować z większości uprawnień podobnych do uprawnień roota, zachowując jednocześnie podzbiór uprawnień wymaganych do wykonywania funkcji. Pierwotna implementacja uprawnień uniemożliwiała procesom rozwidlonym i wykonanym za pomocą funkcji fork+exec dziedziczenie uprawnień, chyba że pliki wykonywane miały skonfigurowane uprawnienia pliku. Z kolei możliwości plików stanowią zagrożenie dla bezpieczeństwa, ponieważ każdy proces wykonujący plik z możliwościami plików może je uzyskać.
Funkcje otoczenia umożliwiają usługom systemowym uruchamianym przez init konfigurowanie uprawnień w plikach .rc
, dzięki czemu konfiguracja jest zawarta w jednym pliku zamiast być rozdzielona w pliku fs_config.c
. Oznacza to, że w przypadku każdej usługi uruchomionej przez init możesz użyć pliku .rc
powiązanego z usługą, aby skonfigurować jej funkcje.
Możliwości otoczenia to preferowany mechanizm ustawiania możliwości usług uruchamianych przez init (ta metoda zachowuje wszystkie aspekty konfiguracji usługi w jednym pliku .rc
). Zalecamy korzystanie z możliwości związanych z otoczeniem zamiast konfigurowania możliwości systemu plików za pomocą sekcji caps w plikach config.fs
.
Podczas ustawiania możliwości usług nieuruchamianych przez init kontynuuj konfigurowanie możliwości systemu plików za pomocą fs_config.c
.
Włączanie funkcji otoczenia
Aby włączyć funkcje otoczenia dla danej usługi, użyj słowa kluczowego capabilities
w funkcji init. Szczegółowe informacje o bieżącym języku inicjującym znajdziesz w pliku README.md.
Na przykład, aby włączyć funkcje otoczenia dla usługi AOSP
wificond
, plik.rc
dla usługi wificond
konfiguruje odpowiedniego użytkownika i grupy oraz przyznaje usłudze określone możliwości za pomocą słowa kluczowego capabilities
:
service wificond /system/bin/wificond class main user wifi group wifi net_raw net_admin capabilities NET_RAW NET_ADMIN
Implementacja referencyjna
Implementacją referencyjną jest wspólne jądro Androida https://android.googlesource.com/kernel/common/.
Wymagane poprawki
Wymagane poprawki zostały przeniesione do wszystkich odpowiednich gałęzi wspólnego jądra Androida.
Główna poprawka dotycząca funkcji ambientowych https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=58319057b7847667f0c9585b9de0e8932b0fdb08 została przeniesiona do starszych wersji:
- android-3.18:
- android-4.1:
Mała poprawka zabezpieczeń https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=b7f76ea2ef6739ee484a165ffbac98deb855d3d3 została przeniesiona do starszej wersji w:
- android-3.18:
- android-4.1:
Weryfikacja
Testy jednostkowe Bionic obejmują testy jednostkowe dotyczące funkcji otoczenia. Poza tym użycie słowa kluczowego „capabilities” w procesie inicjowania usługi w Androidzie, a następnie sprawdzenie, czy usługa uzyskuje oczekiwane możliwości, umożliwi testowanie tej funkcji w czasie działania.