Dyskretywna kontrola dostępu (DAC)

Dodane do kompilacji obiekty i usługi systemu plików często wymagają oddzielnych czyli w unikalnych identyfikatorach Androida (AID). Obecnie wiele źródeł, takich jak pliki i usługi niepotrzebnie używają podstawowych (zdefiniowanych przez Androida) identyfikatorów AID; w wielu W przypadku tych przypadków możesz korzystać z środków wspomagania wiarygodności OEM (zdefiniowanych przez OEM).

Wcześniejsze wersje Androida (Android 7.x i starsze) rozszerzyły identyfikatory AID za pomocą mechanizmu android_filesystem_config.h przeznaczonego na konkretne urządzenie aby określić możliwości systemu plików lub niestandardowe identyfikatory AID OEM. Jednak był nieintuicyjny, ponieważ nie obsługiwał używania ładnych nazw dla AID OEM, wymaga podawania nieprzetworzonej wartości liczbowej w polach użytkownika i grupy bez Powiązanie przyjaznej nazwy z liczbowym AID.

Nowsze wersje Androida (Android 8.0 i nowsze) obsługują nową metodę rozszerzanie możliwości systemu plików. Ta nowa metoda obsługuje :

  • Wiele lokalizacji źródłowych na pliki konfiguracji (umożliwia rozszerzenie konfiguracje kompilacji).
  • Kontrola satysfakcji w czasie kompilacji wartości AID OEM.
  • wygenerowanie niestandardowego nagłówka AID OEM, którego można używać w plikach źródłowych jako niezbędną.
  • Powiązanie przyjaznej nazwy z rzeczywistą wartością AID OEM. Obsługiwane nienumeryczne argumenty ciągu tekstowego dla użytkownika i grupy, np. „foo” zamiast „2901”.

Dodatkowe ulepszenia obejmują android_ids[] tablica z system/core/libcutils/include/private/android_filesystem_config.h Ten tablica w Bionic jest teraz w pełni generowana akcesory z atrybutami getpwnam() i getgrnam(). (Ta wartość ma efekt uboczny tworzenia stabilnych plików binarnych w miarę modyfikacji podstawowych identyfikatorów AID). Dla: narzędzia oraz plik README z dodatkowymi informacjami znajdziesz w build/make/tools/fs_config

Dodawanie identyfikatorów Androida (AID)

W Androidzie 8.0 usunięto macierz android_ids[] z Androida Open Source Project (AOSP). Wszystkie nazwy z myślą o AID są generowane na podstawie system/core/libcutils/include/private/android_filesystem_config.h pliku nagłówkowego podczas generowania tablicy Bionic android_ids[]. Dowolne define pasujący do elementu AID_* jest pobierany przez narzędzie a * stanie się małą nazwą.

Na przykład w pliku private/android_filesystem_config.h:

#define AID_SYSTEM 1000

Staje się:

  • Przyjazna nazwa: system
  • UID: 1000
  • gid: 1000

Aby dodać nowy podstawowy identyfikator AOSP, wystarczy dodać #define do android_filesystem_config.h. Identyfikator AID to generowane podczas tworzenia i udostępniane interfejsom opartym na użytkownikach i grupach . Narzędzie sprawdza, czy nowy AID nie znajduje się w aplikacji ani OEM zakresy uwzględnia również zmiany tych zakresów i powinien automatycznie ponowne konfigurowanie w przypadku zmian lub nowych zakresów zarezerwowanych przez OEM.

Skonfiguruj AID

Aby włączyć nowy mechanizm AID, ustaw TARGET_FS_CONFIG_GEN w BoardConfig.mk. Ta zmienna zawiera listę konfiguracji z plikami, dzięki czemu możesz je dołączać według potrzeb.

Zgodnie z konwencją pliki konfiguracji noszą nazwę config.fs, ale w Możesz użyć dowolnej nazwy. config.fs plików jest w Python. Format ini ConfigParser i umieść w nim sekcję z ograniczeniami (do konfigurowania pliku funkcji systemu) i sekcji dotyczącej AID (do konfigurowania identyfikatorów AID OEM).

Konfigurowanie sekcji dotyczącej limitów

Sekcja dotycząca limitów obsługuje ustawienie plik możliwości systemu w obiektach systemu plików w kompilacji (systemie plików musi również obsługiwać tę funkcję).

Ponieważ uruchomienie na Androidzie stabilnej usługi jako root powoduje Compatibility Test Suite (CTS) niepowodzenie, wcześniejsze wymagania dotyczące zachowania funkcji w trakcie procesu lub usługi wymaga skonfigurowania funkcji, a następnie setuid/setgid do odpowiedniego AID, aby je uruchomić. Dzięki kapcjom może pominąć te wymagania i skorzystać z jednego jądra systemu. Gdy element sterujący to przekazany main(), Twój proces ma już takie możliwości aby usługa mogła korzystać z użytkowników i grup innych niż root (jest to (sposób uruchamiania usług z podwyższonymi uprawnieniami).

Sekcja dotycząca wielkich liter ma taką składnię:

Sekcja Wartość Definicja
[path] Ścieżka systemu plików do skonfigurowania. Ścieżka zakończona na / jest uważana za dir, W przeciwnym razie jest to plik.

Wskazywanie wielu sekcji zawierających taki sam błąd jest błędem [path] w różnych plikach. W Pythonie w wersji <= 3.2 parametr ten sam plik może zawierać sekcje, które zastępują poprzednią sekcję; w Pythonie 3.2, tryb jest ścisły.
mode Tryb pliku ósemkowego Prawidłowy tryb pliku ósemkowego z co najmniej 3 cyframi. Jeśli podana jest wartość 3, jest ona poprzedzony znakiem 0, a w przeciwnym razie jest używany tryb bez zmian.
user AID_<użytkownik> C define dla prawidłowego AID lub przyjazna nazwa (np. dopuszczalne są zarówno wartości AID_RADIO, jak i radio). Do jak zdefiniować niestandardowy identyfikator AID, zapoznaj się z sekcją Konfigurowanie sekcji AID.
group AID_<grupa> Takie same jak u użytkownika.
caps czapka* Nazwa zadeklarowana w bionic/libc/kernel/uapi/linux/capability.h bez początkowego CAP_. Różne wielkości liter są dozwolone. Ograniczenia mogą być też Nieprzetworzony:
  • binarny (0b0101)
  • ósemkowy (0455)
  • int (42)
  • szesnastkowy (0xFF)
. Wiele wielkich liter rozdziel spacjami.

Przykład użycia znajdziesz w artykule Korzystanie z pliku możliwości systemu.

Konfigurowanie sekcji AID

Sekcja AID zawiera identyfikatory AID OEM i używa tej składni:

Sekcja Wartość Definicja
[AID_<name>] Pole <name> może zawierać znaki z zestawu wielkich liter, cyfr i podkreśleń. Wersja pisana małymi literami jest używana jako przyjazną nazwą. W wygenerowanym pliku nagłówka do uwzględnienia kodu jest AID_<name>

Wskazywanie wielu sekcji zawierających taki sam błąd jest błędem AID_<name> (wielkość liter nie jest rozróżniana przy tych samych ograniczeniach co [path]).

<name> musi zaczynać się od nazwy partycji, aby mieć pewność, że nie koliduje z różnymi źródłami.
value <numer> Prawidłowy ciąg liczbowy w stylu C (szesnastkowy, ósemkowy, binarny i dziesiętny).

Określanie wielu sekcji z tą samą opcją wartości jest błędem.

Opcje wartości muszą być określone w zakresie odpowiadającym partycji używane w projekcie <name>. Lista prawidłowych partycji i odpowiadających im partycji zakresy są zdefiniowane w funkcji system/core/libcutils/include/private/android_filesystem_config.h. Dostępne są następujące opcje:
  • Partycja dostawcy
    • AID_OEM_RESERVED_START(2900) – AID_OEM_RESERVED_END(2999)
    • AID_OEM_RESERVED_2_START(5000) – AID_OEM_RESERVED_2_END(5999)
  • Partycja systemowa
    • AID_SYSTEM_RESERVED_START(6000) – AID_SYSTEM_RESERVED_END(6499)
  • Partycja ODM
    • AID_ODM_RESERVED_START(6500) – AID_ODM_RESERVED_END(6999)
  • Podział produktu
    • AID_PRODUCT_RESERVED_START(7000) – AID_PRODUCT_RESERVED_END(7499)
  • Partycja rozszerzenia systemu
    • AID_SYSTEM_EXT_RESERVED_START(7500) – AID_SYSTEM_EXT_RESERVED_END(7999)

Przykłady użycia znajdziesz w artykule Definiowanie, czym jest OEM Nazwy urządzeń AID i Korzystanie z identyfikatorów AID OEM.

Przykłady użycia

Z poniższych przykładów dowiesz się, jak zdefiniować i stosować identyfikator AID OEM oraz jak włączyć funkcje systemu plików. Nazwy AID OEM ([AID_nazwa]) musi zaczynać się od nazwa partycji, na przykład „vendor_” aby nie kolidowały z przyszłymi zmianami. Nazwy AOSP i inne partycje.

Zdefiniuj nazwy AID OEM

Aby zdefiniować identyfikator AID OEM, utwórz plik config.fs i ustaw wartość AID. Na przykład w pliku device/x/y/config.fs ustaw parametr :

[AID_VENDOR_FOO]
value: 2900

Po utworzeniu pliku ustaw zmienną TARGET_FS_CONFIG_GEN i wskaż go w BoardConfig.mk. Na przykład w polu device/x/y/BoardConfig.mk ustaw te:

TARGET_FS_CONFIG_GEN += device/x/y/config.fs

Twój niestandardowy identyfikator AID może być teraz wykorzystywany przez cały system w nowej kompilacji.

Używaj identyfikatorów OEM

Aby korzystać z identyfikatora AID OEM, w kodzie C umieść oemaids_headers w powiązanym Zrób plik i dodaj #include "generated_oem_aid.h", a następnie zacznij używać zadeklarowanego i identyfikatorów. Na przykład do pliku my_file.c dodaj:

#include "generated_oem_aid.h"
…

If (ipc->uid == AID_VENDOR_FOO) {
  // Do something
...

W powiązanym pliku Android.bp dodaj:

header_libs: ["oemaids_headers"],

Jeśli używasz pliku Android.mk, dodaj te elementy:

LOCAL_HEADER_LIBRARIES := oemaids_headers

Używaj przyjaznych nazw

W Androidzie 9 możesz użyć przyjaznej nazwy dla dowolnego który obsługuje nazwy AID. Na przykład:

  • W poleceniu chown w some/init.rc:
    chown vendor_foo /vendor/some/vendor_foo/file
    
  • W pokoju service w some/init.rc:
    service vendor_foo /vendor/bin/foo_service
        user vendor_foo
        group vendor_foo
    

Ponieważ wewnętrzne mapowanie z przyjaznej nazwy na identyfikator UID jest wykonywane przez /vendor/etc/passwd i /vendor/etc/group, dostawcy musi być podłączona.

Powiąż przyjazne nazwy

Android 9 obsługuje powiązanie przyjazna nazwa z rzeczywistą wartością AID OEM. Możesz użyć ciągu nienumerycznego argumentów dla użytkownika i grupy, czyli „vendor_foo” zamiast „2901”.

Konwertowanie z AID na przyjazne nazwy

Dla: Systemy pomocy OEM, Android 8.x wymagał użycia: oem_#### z getpwnam i podobnymi funkcjami, jak także w miejscach, które obsługują wyszukiwania z użyciem getpwnam (na przykład init skryptów). W Androidzie 9 możesz: użyj znajomych z getpwnam i getgrnam w Bionic dla z identyfikatorów Androida (AID) na przyjazne nazwy i odwrotnie.

Korzystanie z funkcji systemu plików

Aby włączyć funkcje systemu plików, utwórz sekcję ograniczeń config.fs. Na przykład w polu device/x/y/config.fs, dodaj tę sekcję:

[system/bin/foo_service]
mode: 0555
user: AID_VENDOR_FOO
group: AID_SYSTEM
caps: SYS_ADMIN | SYS_NICE

Po utworzeniu pliku ustaw TARGET_FS_CONFIG_GEN tak, aby wskazywał ten plik w folderze BoardConfig.mk. Na przykład w polu device/x/y/BoardConfig.mk ustaw te:

TARGET_FS_CONFIG_GEN += device/x/y/config.fs

Po wykonaniu usługi vendor_foo uruchamia się z możliwościami CAP_SYS_ADMIN i CAP_SYS_NICE bez połączeń setuid i setgid. Dodatkowo Zasada SELinux usługi vendor_foo nie jest już dostępna wymaga funkcji setuid i setgid oraz może być Usunięto.

Konfigurowanie zastąpień (Android 6.x-7.x)

W Androidzie 6.0 przeniesiono folder fs_config i powiązaną strukturę definicje (system/core/include/private/android_filesystem_config.h) do system/core/libcutils/fs_config.c, gdzie można je zaktualizować lub zastąpione przez pliki binarne zainstalowane w /system/etc/fs_config_dirs i /system/etc/fs_config_files. Korzystanie z oddzielnego dopasowania i analizy reguły dla katalogów i plików (które mogą używać dodatkowych wyrażeń glob); umożliwia obsługę katalogów i plików w dwóch różnych tabelach. Definicje struktur w tym języku (system/core/libcutils/fs_config.c) nie są zezwalał jedynie na odczyt katalogów i plików w środowisku wykonawczym, ale host mógł użyć funkcji tych samych plików w czasie kompilacji, aby utworzyć obrazy systemu plików ${OUT}/system/etc/fs_config_dirs i ${OUT}/system/etc/fs_config_files

Mimo że metoda zastąpienia, która polega na rozszerzeniu systemu plików, została zastąpiona przez modułowy system konfiguracji w Androidzie 8.0, nadal możesz używać starego jeśli jest taka potrzeba. W sekcjach poniżej znajdziesz szczegółowe informacje o generowaniu i uwzględnianiu zastąpić pliki i skonfigurować system plików.

Generuj pliki zastąpień

Wyrównane pliki binarne można generować /system/etc/fs_config_dirs i /system/etc/fs_config_files za pomocą Narzędzie fs_config_generate w usłudze build/tools/fs_config. narzędzie korzysta z funkcji biblioteki libcutils (fs_config_generate()) do zarządzania wymaganiami dotyczącymi DAC w buforze. i definiuje reguły pliku dołączanego, by uporządkować reguły DAC.

Aby użyć tej funkcji, utwórz plik dołączany w device/vendor/device/android_filesystem_config.h , które pełnią funkcję zastąpienia. Plik musi używać funkcji Format structure fs_path_config zdefiniowany w system/core/include/private/android_filesystem_config.h z następujące inicjacje struktury dla katalogów i symboli plików:

  • W przypadku katalogów użyj formatu android_device_dirs[].
  • W przypadku plików użyj formatu android_device_files[].

Gdy nie są używane: android_device_dirs[] i android_device_files[], możesz zdefiniować NO_ANDROID_FILESYSTEM_CONFIG_DEVICE_DIRS i NO_ANDROID_FILESYSTEM_CONFIG_DEVICE_FILES (zobacz przykład poniżej). Możesz też określić zastąpienie plik, używając funkcji TARGET_ANDROID_FILESYSTEM_CONFIG_H na tablicy z wymuszoną nazwą bazową android_filesystem_config.h

Uwzględnij pliki zastąpień

Aby dołączyć pliki, upewnij się, że PRODUCT_PACKAGES zawiera fs_config_dirs lub fs_config_files, aby mógł zainstaluj je w aplikacji /system/etc/fs_config_dirs i /system/etc/fs_config_files. System kompilacji Liczba wyszukiwań niestandardowych kategorii „android_filesystem_config.h” w $(TARGET_DEVICE_DIR), gdzie jest BoardConfig.mk. Jeśli ten plik istnieje w innym miejscu, ustaw zmienną konfiguracji tablicy TARGET_ANDROID_FILESYSTEM_CONFIG_H, aby wskazać tę lokalizację.

Konfigurowanie systemu plików

Aby skonfigurować system plików w Androidzie 6.0 lub nowszym:

  1. Utwórz $(TARGET_DEVICE_DIR)/android_filesystem_config.h .
  2. Dodaj fs_config_dirs lub fs_config_files do PRODUCT_PACKAGES w pliku konfiguracji płyty (np. $(TARGET_DEVICE_DIR)/device.mk).

Przykład zastąpienia

Ten przykład przedstawia poprawkę, która zastępuje system/bin/glgps demon, aby dodać obsługę blokady uśpienia device/vendor/device. Zachowaj o których warto pamiętać:

  • Każdy wpis struktury to tryb, uid, gid, możliwości i nazwa. system/core/include/private/android_filesystem_config.h to jest dołączany automatycznie, aby udostępnić plik manifestu #defines (AID_ROOT, AID_SHELL, CAP_BLOCK_SUSPEND).
  • Sekcja android_device_files[] zawiera działanie pozwalające na: zablokuj dostęp do usługi system/etc/fs_config_dirs, gdy nie jest określony, który stanowi dodatkową ochronę DAC w przypadku braku treści w katalogu. nadpisania. Jest to jednak słaba ochrona. czy ktoś ma kontrolę nad /system, mogą zwykle robić, co zechcą.
diff --git a/android_filesystem_config.h b/android_filesystem_config.h
new file mode 100644
index 0000000..874195f
--- /dev/null
+++ b/android_filesystem_config.h
@@ -0,0 +1,36 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ * implied. See the License for the specific language governing
+ * permissions and limitations under the License.
+ */
+
+/* This file is used to define the properties of the file system
+** images generated by build tools (eg: mkbootfs) and
+** by the device side of adb.
+*/
+
+#define NO_ANDROID_FILESYSTEM_CONFIG_DEVICE_DIRS
+/* static const struct fs_path_config android_device_dirs[] = { }; */
+
+/* Rules for files.
+** These rules are applied based on "first match", so they
+** should start with the most specific path and work their
+** way up to the root. Prefixes ending in * denotes wildcard
+** and will allow partial matches.
+*/
+static const struct fs_path_config android_device_files[] = {
+  { 00755, AID_ROOT, AID_SHELL, (1ULL << CAP_BLOCK_SUSPEND),
"system/bin/glgps" },
+#ifdef NO_ANDROID_FILESYSTEM_CONFIG_DEVICE_DIRS
+  { 00000, AID_ROOT, AID_ROOT, 0, "system/etc/fs_config_dirs" },
+#endif
+};


diff --git a/device.mk b/device.mk
index 0c71d21..235c1a7 100644
--- a/device.mk
+++ b/device.mk
@@ -18,7 +18,8 @@ PRODUCT_PACKAGES := \
     libwpa_client \
     hostapd \
     wpa_supplicant \
-    wpa_supplicant.conf
+    wpa_supplicant.conf \
+    fs_config_files

 ifeq ($(TARGET_PREBUILT_KERNEL),)
 ifeq ($(USE_SVELTE_KERNEL), true)

Migracja systemów plików z wcześniejszych wersji

Przy migracji systemów plików z Androida 5.x i starszych pamiętaj, że: Android 6.x

  • Usuwa niektóre elementy obejmujące, struktury i wbudowane definicje.
  • Wymaga odniesienia do libcutils zamiast uruchamiania bezpośrednio od system/core/include/private/android_filesystem_config.h. Prywatne pliki wykonywalne producenta urządzenia, które zależą od system/code/include/private_filesystem_config.h w przypadku pliku lub struktury katalogów lub fs_config muszą dodać libcutils zależności między bibliotekami.
  • Wymaga kopii prywatnej gałęzi producenta urządzenia system/core/include/private/android_filesystem_config.h z dodatkowa treść do przeniesienia w istniejących celach device/vendor/device/android_filesystem_config.h
  • Zastrzega sobie prawo do stosowania obowiązkowej kontroli dostępu SELinux (MAC) do plików konfiguracji w systemie docelowym, implementacji obejmujących niestandardowe docelowe pliki wykonywalne za pomocą funkcji fs_config() muszą zapewniać dostęp.