Capabilitys ermöglichen es Linux-Prozessen, die meisten Root-ähnlichen Privilegien aufzugeben, während die Teilmenge der Privilegien beibehalten wird, die sie benötigen, um ihre Funktion auszuführen. Die ursprüngliche Implementierung von Capabilities machte es Fork+Exec'd-Prozessen unmöglich, Capabilities zu erben, es sei denn, für die ausgeführten Dateien waren File Capabilities konfiguriert. Dateifähigkeiten wiederum stellen ein Sicherheitsrisiko dar, da jeder Prozess, der eine Datei mit Dateifähigkeiten ausführt, in der Lage sein wird, diese Fähigkeiten zu erlangen.
Umgebungsfunktionen ermöglichen es Systemdiensten, die von init gestartet werden, Funktionen in ihren .rc
Dateien zu konfigurieren, wodurch die Konfiguration in eine einzige Datei gebracht wird, anstatt die Konfiguration in der Datei fs_config.c
. Das bedeutet, dass Sie für jeden von init gestarteten Dienst die mit dem Dienst .rc
-Datei verwenden können, um Funktionen für diesen Dienst zu konfigurieren.
Umgebungsfunktionen sind der bevorzugte Mechanismus zum Festlegen von Funktionen für Dienste, die von init gestartet werden (diese Methode hält alle Aspekte für die Dienstkonfiguration in einer einzigen .rc
-Datei). Wir empfehlen, Umgebungsfunktionen zu verwenden, anstatt Dateisystemfunktionen mithilfe des caps-Abschnitts in den config.fs
Dateien zu konfigurieren.
Wenn Sie Funktionen für Dienste festlegen, die nicht von init gestartet wurden , konfigurieren Sie die Dateisystemfunktionen weiterhin mit fs_config.c
.
Umgebungsfunktionen aktivieren
Um Ambient-Fähigkeiten für einen bestimmten Dienst zu aktivieren, verwenden Sie das capabilities
Schlüsselwort in init. Einzelheiten zur aktuellen Init-Sprache finden Sie in der init README.md .
Um beispielsweise Ambient-Fähigkeiten für den AOSP-Dienst wificond
zu aktivieren, richtet die .rc-Datei für den wificond
-Dienst den entsprechenden Benutzer und die entsprechenden Gruppen ein und weist dem Dienst die angegebenen Fähigkeiten mit dem Schlüsselwort capabilities
:
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 allgemeine Android-Kernel https://android.googlesource.com/kernel/common/
Erforderliche Patches
Erforderliche Patches wurden auf alle relevanten gemeinsamen Android-Kernel-Zweige zurückportiert.
Der Patch für die Hauptumgebungsfähigkeiten https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=58319057b7847667f0c9585b9de0e8932b0fdb08 wurde zurückportiert in:
- android-3.18:
- android-4.1:
Ein kleiner Sicherheitsfix https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=b7f76ea2ef6739ee484a165ffbac98deb855d3d3 wurde zurückportiert in:
- android-3.18:
- android-4.1:
Validierung
Bionic-Unit-Tests umfassen Unit-Tests für Umgebungsfähigkeiten. Darüber hinaus würde die Verwendung des Schlüsselworts „capabilities“ in Android init für einen Dienst und die anschließende Überprüfung, ob der Dienst die erwarteten Fähigkeiten erhält, Laufzeittests dieser Funktion ermöglichen.