Diskretionäre Zugriffssteuerung (DAC)

Dateisystemobjekte und -dienste, die dem Build hinzugefügt werden, müssen häufig separat eindeutige IDs, auch als Android-IDs (AIDs) bezeichnet. Derzeit sind viele Ressourcen wie Dateien und Dienste verwenden unnötige (Android-definierte) AIDs. in vielen können Sie stattdessen OEM-definierte AIDs verwenden.

Bei früheren Versionen von Android (Android 7.x und niedriger) wurden die AIDs verlängert. Mechanismus mit einem gerätespezifischen android_filesystem_config.h -Datei zur Angabe von Dateisystemfunktionen und/oder benutzerdefinierten OEM-AIDs. Diese war wenig intuitiv, da es keine schönen Namen für OEM-AIIDs unterstützt. Sie müssen die numerischen Rohwerte für Nutzer- und Gruppenfelder ohne um einen Anzeigenamen mit der numerischen AID zu verknüpfen.

Neuere Versionen von Android (Android 8.0 und höher) unterstützen eine neue Methode zur Erweiterung der Dateisystemfunktionen. Diese neue Methode unterstützt die Folgendes:

  • Mehrere Quellspeicherorte für Konfigurationsdateien (ermöglicht erweiterbare Anzeigen) Build-Konfigurationen).
  • Integritätsprüfung von OEM-AID-Werten während der Build-Erstellung.
  • Generierung eines benutzerdefinierten OEM-AID-Headers, der in Quelldateien als erforderlich.
  • Verknüpfung eines Anzeigenamens mit dem tatsächlichen OEM-AID-Wert. Wird unterstützt Nicht numerische Zeichenfolgenargumente für Nutzer und Gruppe, z.B. „foo“ anstelle von „2901“.

Zu den weiteren Verbesserungen gehört die Entfernung der android_ids[] Array von system/core/libcutils/include/private/android_filesystem_config.h. Dieses Das Array ist jetzt in Bionic als vollständig privat generiertes Array vorhanden, wobei Zugriffsmethoden mit getpwnam() und getgrnam(). (Dies hat der Nebeneffekt der Erzeugung stabiler Binärprogramme, da Kern-AIDs modifiziert werden.) Für und eine README-Datei mit weiteren Details finden Sie build/make/tools/fs_config

<ph type="x-smartling-placeholder">

Android-IDs (AIDs) hinzufügen

Unter Android 8.0 wurde das Array android_ids[] vom Android- Open-Source-Projekt (AOSP): Alle AID-freundlichen Namen werden stattdessen aus system/core/libcutils/include/private/android_filesystem_config.h Headerdatei beim Generieren des android_ids[]-Arrays von Bionic. Beliebig define, die mit AID_* übereinstimmen, werden von den Tools übernommen und * wird kleingeschrieben.

Beispiel in private/android_filesystem_config.h:

#define AID_SYSTEM 1000

Wird zu:

  • Anzeigename: system
  • UID: 1000
  • gid: 1000

Fügen Sie zum Hinzufügen einer neuen AOSP-Core-AID einfach #define zum android_filesystem_config.h-Headerdatei. Die AID lautet die beim Build generiert und für Schnittstellen zur Verfügung gestellt werden, die Nutzer- und Gruppennutzer Argumente. Das Tool prüft, ob sich die neue AID nicht in der APP oder dem OEM befindet. Bereiche Änderungen an diesen Bereichen berücksichtigt werden und sollte automatisch bei Änderungen oder neuen vom OEM reservierten Bereichen neu konfigurieren.

AIDs konfigurieren

Um den neuen AIDs-Mechanismus zu aktivieren, lege TARGET_FS_CONFIG_GEN im BoardConfig.mk-Datei. Diese Variable enthält eine Liste der Dateien, sodass Sie sie bei Bedarf anhängen können.

<ph type="x-smartling-placeholder">

Konventionsgemäß verwenden Konfigurationsdateien den Namen config.fs, aber in können Sie jeden beliebigen Namen verwenden. config.fs Dateien sind im Python ConfigParser-INI-Format und fügen Sie einen Cap-Abschnitt ein (zum Konfigurieren der Datei) Systemfunktionen) und einen AIDs-Abschnitt (zur Konfiguration von OEM-AIDs).

Bereich für Obergrenzen konfigurieren

<ph type="x-smartling-placeholder">

Der Bereich Caps unterstützt die Datei Systemfunktionen für Dateisystemobjekte innerhalb des Builds (das Dateisystem muss diese Funktion ebenfalls unterstützen).

Da ein stabiler Dienst als Root in Android ausgeführt wird, Kompatibilitätstest-Suite (Compatibility Test Suite, CTS) Fehler, frühere Anforderungen zum Beibehalten einer Funktionalität beim Ausführen eines Prozess oder Dienst umfasste die Einrichtung von Ressourcen und setuid/setgid mit einer geeigneten AID verknüpfen. Mit großgeschriebenen Buchstaben können Sie diese Anforderungen überspringen und den Kernel für Sie erledigen lassen. Wenn die Steuerungsoption aktiviert ist: main() übergeben hat, verfügt Ihr Prozess bereits über die Funktionen, die er damit Ihr Dienst einen Nutzer und eine Gruppe ohne Root-Berechtigung verwenden kann (dies ist die bevorzugte zum Starten privilegierter Dienste).

Der Abschnitt Caps verwendet die folgende Syntax:

Abschnitt Wert Definition
[path] Der zu konfigurierende Dateisystempfad. Ein Pfad, der mit / endet, gilt als dir, sonst ist es eine Datei.

Es ist ein Fehler, mehrere Abschnitte mit demselben [path] in verschiedenen Dateien. In Python-Versionen <= 3.2 kann dieselbe Datei Abschnitte enthalten, die den vorherigen Abschnitt überschreiben; in Python 3.2 ist der strikte Modus aktiviert.
mode Oktal-Dateimodus Ein gültiger Oktaldateimodus mit mindestens 3 Ziffern. Wird 3 angegeben, gilt dies als 0 vorangestellt ist, sonst wird der Modus unverändert verwendet.
user AID_<Nutzer> Entweder das C define für eine gültige AID oder den Anzeigenamen Beispielsweise sind sowohl AID_RADIO als auch radio zulässig. Bis eine benutzerdefinierte AID zu definieren, siehe Konfigurieren AID-Abschnitt
group AID_<Gruppe> Identisch mit Nutzer.
caps Begrenzung* Der Name, wie angegeben in bionic/libc/kernel/uapi/linux/capability.h ohne das vorangestellte CAP_. Gemischte Groß- und Kleinschreibung zulässig. Sie können auch eine die Rohfassung: <ph type="x-smartling-placeholder">
    </ph>
  • binär (0b0101)
  • Oktal (0455)
  • Ganzzahl (42)
  • Hex (0xFF)
Trennen Sie mehrere Großbuchstaben durch Leerzeichen.

Ein Anwendungsbeispiel finden Sie unter Verwenden einer Datei Systemfunktionen.

Abschnitt „AID“ konfigurieren

Der Abschnitt „AID“ enthält OEM-AIDs und verwendet die folgende Syntax:

Abschnitt Wert Definition
[AID_<name>] <name> kann Zeichen im Satz enthalten. Großbuchstaben, Zahlen und Unterstriche. Die kleingeschriebene Version wird als angezeigten Namen. Die generierte Headerdatei für den Code-Einschluss verwendet genau AID_<name>

Es ist ein Fehler, mehrere Abschnitte mit demselben AID_<name> (Groß-/Kleinschreibung nicht berücksichtigend mit denselben Einschränkungen wie [path].

<name> muss mit einem Partitionsnamen beginnen, damit dass sie nicht mit verschiedenen Quellen in Konflikt stehen.
value <Zahl> Ein gültiger Zahlenstring im C-Stil (hexadezimal, oktal, binär und dezimal).

Es ist ein Fehler, mehrere Bereiche mit derselben Wertoption anzugeben.

Wertoptionen müssen in dem Bereich angegeben werden, der der Partition entspricht verwendet in <name>. Die Liste der gültigen Partitionen und ihrer zugehörigen Bereiche sind in system/core/libcutils/include/private/android_filesystem_config.h definiert. Folgende Optionen sind verfügbar: <ph type="x-smartling-placeholder">
    </ph>
  • Anbieterpartition <ph type="x-smartling-placeholder">
      </ph>
    • AID_OEM_RESERVED_START(2900)–AID_OEM_RESERVED_END(2999)
    • AID_OEM_RESERVED_2_START(5000)–AID_OEM_RESERVED_2_END(5999)
  • Systempartition <ph type="x-smartling-placeholder">
      </ph>
    • AID_SYSTEM_RESERVED_START(6000)–AID_SYSTEM_RESERVED_END(6499)
  • ODM-Partition <ph type="x-smartling-placeholder">
      </ph>
    • AID_ODM_RESERVED_START(6500)–AID_ODM_RESERVED_END(6999)
  • Produktaufteilung <ph type="x-smartling-placeholder">
      </ph>
    • AID_PRODUCT_RESERVED_START(7000)–AID_PRODUCT_RESERVED_END(7499)
  • Partition „system_ext“ <ph type="x-smartling-placeholder">
      </ph>
    • AID_SYSTEM_EXT_RESERVED_START(7500)–AID_SYSTEM_EXT_RESERVED_END(7999)

Anwendungsbeispiele finden Sie unter OEM definieren AID-Namen und Verwendung von OEM-AIDs.

Beispiele für die Verwendung

Die folgenden Beispiele beschreiben, wie eine OEM-AID definiert und verwendet wird Funktionen des Dateisystems zu aktivieren. OEM-AID-Namen ([AID_name]) muss mit einem Partitionsname wie "vendor_" damit sie nicht mit zukünftigen AOSP-Namen oder andere Partitionen.

OEM-AID-Namen definieren

Erstellen Sie zum Definieren einer OEM-AID eine config.fs-Datei und legen Sie AID-Wert Legen Sie beispielsweise in device/x/y/config.fs den Parameter Folgendes:

[AID_VENDOR_FOO]
value: 2900

Legen Sie nach dem Erstellen der Datei die Variable TARGET_FS_CONFIG_GEN fest und zeigen Sie in BoardConfig.mk darauf. Beispiel: Legen Sie für device/x/y/BoardConfig.mk Folgendes fest:

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

Ihre benutzerdefinierte AID kann jetzt vom System in einem neuen Build genutzt werden.

OEM-AIDs verwenden

Um eine OEM-AID zu verwenden, füge im C-Code den oemaids_headers in die zugehörige Makefile, fügen Sie #include "generated_oem_aid.h" hinzu und verwenden dann das deklarierte Kennzeichnungen. Fügen Sie beispielsweise in my_file.c Folgendes hinzu:

#include "generated_oem_aid.h"
…

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

Fügen Sie der verknüpften Datei Android.bp Folgendes hinzu:

header_libs: ["oemaids_headers"],

Wenn Sie eine Android.mk-Datei verwenden, fügen Sie Folgendes hinzu:

LOCAL_HEADER_LIBRARIES := oemaids_headers

Anzeigenamen verwenden

In Android 9 können Sie den Anzeigenamen für alle die AID-Namen unterstützt. Beispiel:

  • Führen Sie in einem chown-Befehl in some/init.rc folgende Schritte aus:
    chown vendor_foo /vendor/some/vendor_foo/file
    
  • In einem service in some/init.rc:
    service vendor_foo /vendor/bin/foo_service
        user vendor_foo
        group vendor_foo
    

Da die interne Zuordnung vom Anzeigenamen zur UID von Der Anbieter /vendor/etc/passwd und /vendor/etc/group Partition muss bereitgestellt werden.

Anzeigenamen zuordnen

Android 9 umfasst auch Unterstützung für die Verknüpfung mit einem Anzeigenname durch den tatsächlichen OEM-AID-Wert. Sie können einen nicht numerischen String verwenden Argumente für Nutzer und Gruppe, z. B. vendor_foo. anstelle von „2901“.

Von AID in Anzeigenamen umwandeln

Für OEM-AIDs, Android 8.x erforderte die Verwendung von oem_#### mit getpwnam und ähnlichen Funktionen wie an Stellen, an denen Suchanfragen mit getpwnam verarbeitet werden (z. B. init-Scripts). Mit Android 9 können Sie Verwende die getpwnam- und getgrnam-Freunde in Bionic für von Android-IDs (AIDs) in Anzeigenamen umwandeln und umgekehrt.

Dateisystemfunktionen verwenden

Um die Funktionen des Dateisystems zu aktivieren, erstellen Sie im Abschnitt config.fs-Datei. Beispiel: device/x/y/config.fs, fügen Sie den folgenden Abschnitt hinzu:

[system/bin/foo_service]
mode: 0555
user: AID_VENDOR_FOO
group: AID_SYSTEM
caps: SYS_ADMIN | SYS_NICE
<ph type="x-smartling-placeholder">

Legen Sie nach dem Erstellen der Datei fest, dass TARGET_FS_CONFIG_GEN auf diese Datei in BoardConfig.mk. Beispiel: Legen Sie für device/x/y/BoardConfig.mk Folgendes fest:

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

Wenn der Dienst vendor_foo ausgeführt wird, startet er mit den Funktionen CAP_SYS_ADMIN und CAP_SYS_NICE ohne setuid- und setgid-Aufrufe. Darüber hinaus enthält der Die SELinux-Richtlinie des vendor_foo-Dienstes wurde entfernt benötigt die Berechtigungen setuid und setgid und kann gelöscht.

Überschreibungen konfigurieren (Android 6.x bis 7.x)

Android 6.0 hat fs_config und zugehöriges Gebäude verschoben Definitionen (system/core/include/private/android_filesystem_config.h) nach system/core/libcutils/fs_config.c, wo sie aktualisiert werden können oder von Binärdateien überschrieben, die installiert sind in /system/etc/fs_config_dirs und /system/etc/fs_config_files Getrenntes Abgleichen und Parsen verwenden Regeln für Verzeichnisse und Dateien (für die zusätzliche glob-Ausdrücke verwendet werden können) kann Android Verzeichnisse und Dateien in zwei verschiedenen Tabellen verarbeiten. Strukturdefinitionen in system/core/libcutils/fs_config.c nicht hat nur das Lesen von Verzeichnissen und Dateien zur Laufzeit zugelassen, der Host könnte jedoch während der Build-Erstellung dieselben Dateien, um Dateisystem-Images zu erstellen, ${OUT}/system/etc/fs_config_dirs und ${OUT}/system/etc/fs_config_files

Während die Überschreibungsmethode zur Erweiterung des Dateisystems durch das in Android 8.0 eingeführt wurde, können Sie weiterhin die alte -Methode hinzu. In den folgenden Abschnitten wird beschrieben, wie Sie und das Dateisystem konfigurieren.

Überschreibungsdateien generieren

Sie können die ausgerichteten Binärdateien generieren /system/etc/fs_config_dirs und /system/etc/fs_config_files mit dem fs_config_generate-Tool in build/tools/fs_config. Die verwendet eine libcutils-Bibliotheksfunktion. (fs_config_generate()) zum Verwalten der DAC-Anforderungen in einem Zwischenspeicher und definiert Regeln für eine Einschlussdatei, um die DAC-Regeln zu institutionalisieren.

Erstellen Sie für die Verwendung in device/vendor/device/android_filesystem_config.h die als Überschreibung dient. Die Datei muss die Methode structure fs_path_config-Format definiert in system/core/include/private/android_filesystem_config.h mit dem folgende Strukturinitialisierungen für Verzeichnis- und Dateisymbole:

  • Verwenden Sie android_device_dirs[] für Verzeichnisse.
  • Verwenden Sie android_device_files[] für Dateien.

Wenn Sie android_device_dirs[] und android_device_files[] definieren, können Sie NO_ANDROID_FILESYSTEM_CONFIG_DEVICE_DIRS und NO_ANDROID_FILESYSTEM_CONFIG_DEVICE_FILES (siehe Beispiel unten). Sie können auch die Überschreibung angeben, Datei mit TARGET_ANDROID_FILESYSTEM_CONFIG_H im Board Konfiguration mit dem erzwungenen Basisnamen android_filesystem_config.h.

Überschreibungsdateien einschließen

Wenn Sie Dateien einschließen möchten, muss PRODUCT_PACKAGES Folgendes enthalten: fs_config_dirs und/oder fs_config_files, damit es installieren Sie sie in /system/etc/fs_config_dirs und /system/etc/fs_config_files. Das Build-System Suchanfragen nach benutzerdefiniertem android_filesystem_config.h in $(TARGET_DEVICE_DIR), wobei BoardConfig.mk vorhanden ist. Wenn diese Datei an einem anderen Ort vorhanden ist, legen Sie die Board-Konfigurationsvariable fest TARGET_ANDROID_FILESYSTEM_CONFIG_H, um auf diesen Standort zu verweisen.

Dateisystem konfigurieren

So konfigurieren Sie das Dateisystem unter Android 6.0 und höher:

  1. $(TARGET_DEVICE_DIR)/android_filesystem_config.h erstellen -Datei.
  2. Fügen Sie fs_config_dirs und/oder fs_config_files hinzu zu PRODUCT_PACKAGES in der Board-Konfigurationsdatei (z.B. $(TARGET_DEVICE_DIR)/device.mk.

Beispiel für Überschreibung

Dieses Beispiel zeigt einen Patch zum Überschreiben von system/bin/glgps. -Daemon, um Wakelock-Unterstützung in der device/vendor/device-Verzeichnis. Behalten Sie die im Hinterkopf:

  • Jeder Gebäudeeintrag umfasst Modus, UID, gid, Funktionen und Name. system/core/include/private/android_filesystem_config.h ist automatisch eingefügt, um das Manifest bereitzustellen #defines (AID_ROOT, AID_SHELL, CAP_BLOCK_SUSPEND.
  • Der Abschnitt android_device_files[] enthält eine Aktion zum unterdrücken den Zugriff auf system/etc/fs_config_dirs, wenn nicht angegeben, Dies dient als zusätzlicher DAC-Schutz für fehlende Inhalte für das Verzeichnis Überschreibungen. Dieser Schutz ist jedoch nur schwach, wenn jemand die Kontrolle /system, kann sie in der Regel alles tun, was sie wollen.
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)

Dateisysteme von früheren Releases migrieren

Beachten Sie bei der Migration von Dateisystemen von Android 5.x und niedriger, dass Android 6.x

  • Entfernt einige Einbindungen, Strukturen und Inline-Definitionen.
  • Erfordert einen Verweis auf libcutils statt einer direkten Ausführung von system/core/include/private/android_filesystem_config.h. Private ausführbare Dateien des Geräteherstellers, system/code/include/private_filesystem_config.h für die Datei oder Verzeichnisstrukturen oder fs_config muss libcutils hinzufügen Bibliotheksabhängigkeiten.
  • Vom Gerätehersteller sind Kopien der privaten Zweigstellen des system/core/include/private/android_filesystem_config.h mit zusätzliche Inhalte für vorhandene Ziele, auf die verschoben werden soll device/vendor/device/android_filesystem_config.h.
  • Behält sich das Recht vor, Mandatory Access Controls (MAC) für SELinux auf folgende Websites anzuwenden Konfigurationsdateien im Zielsystem, Implementierungen, die benutzerdefinierte Das Ziel von ausführbaren Dateien, die fs_config() verwenden, muss Zugriff gewährleisten.