Mit Funktionen können Linux-Prozesse die meisten Root-ähnlichen Berechtigungen entfernen und gleichzeitig die Teilmenge der Berechtigungen beibehalten, die für die Ausführung ihrer Funktion erforderlich sind. Die ursprüngliche Implementierung von Funktionen machte es für Prozesse, die mit „fork+exec“ gestartet wurden, unmöglich, Funktionen zu erben, es sei denn, für die ausgeführten Dateien waren Dateifunktionen konfiguriert. Dateifunktionen stellen wiederum ein Sicherheitsrisiko dar, da jeder Prozess, der eine Datei mit Dateifunktionen ausführt, diese Funktionen erhalten kann.
Mit Ambient-Funktionen können von init gestartete Systemdienste Funktionen in ihren .rc
-Dateien konfigurieren. Die Konfiguration erfolgt also in einer einzigen Datei und nicht in der fs_config.c
-Datei. Das bedeutet, dass Sie für jeden Dienst, der von init gestartet wird, die dem Dienst zugeordnete .rc
-Datei verwenden können, um Funktionen für diesen Dienst zu konfigurieren.
Ambient-Funktionen sind der bevorzugte Mechanismus zum Festlegen von Funktionen für Dienste, die von init gestartet werden. Bei dieser Methode werden alle Aspekte der Dienstkonfiguration in einer einzigen .rc
-Datei gespeichert. Wir empfehlen, Ambient-Funktionen zu verwenden, anstatt Dateisystemfunktionen im Abschnitt „caps“ von config.fs
-Dateien zu konfigurieren.
Wenn Sie Berechtigungen für Dienste festlegen, die nicht von init gestartet werden, konfigurieren Sie die Dateisystemberechtigungen weiterhin mit fs_config.c
.
Ambient-Funktionen aktivieren
Verwenden Sie das Schlüsselwort capabilities
in init, um Ambient-Funktionen für einen bestimmten Dienst zu aktivieren. Aktuelle Informationen zur Init-Sprache finden Sie in der README.md-Datei für Init.
Wenn Sie beispielsweise Ambient-Funktionen für den AOSP-Dienst wificond
aktivieren möchten, werden in der .rc-Datei für den Dienst wificond
der entsprechende Nutzer und die entsprechenden Gruppen eingerichtet und dem Dienst werden mit dem Keyword capabilities
die angegebenen Funktionen zugewiesen:
service wificond /system/bin/wificond class main user wifi group wifi net_raw net_admin capabilities NET_RAW NET_ADMIN
Referenzimplementierung
Die Referenzimplementierung ist der gemeinsame Android-Kernel https://android.googlesource.com/kernel/common/.
Erforderliche Patches
Erforderliche Patches wurden auf alle relevanten Android Common Kernel-Branches zurückportiert.
Der Haupt-Patch für Ambient-Funktionen https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=58319057b7847667f0c9585b9de0e8932b0fdb08 wurde in folgenden Versionen backportiert:
- android-3.18:
- android-4.1:
Eine kleine Sicherheitskorrektur https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=b7f76ea2ef6739ee484a165ffbac98deb855d3d3 wurde in folgende Versionen zurückportiert:
- android-3.18:
- android-4.1:
Zertifizierungsstufe
Bionic-Unittests umfassen Unittests für Ambient-Funktionen. Darüber hinaus würde die Verwendung des Schlüsselworts „capabilities“ in der Android-Initialisierung für einen Dienst und die anschließende Prüfung, ob der Dienst die erwarteten Funktionen erhält, Laufzeittests dieser Funktion ermöglichen.