Funktionen für den Inaktivmodus

Mit Capabilities können Linux-Prozesse die meisten root-ähnlichen Berechtigungen entfernen und dabei die Teilmenge der Berechtigungen beibehalten, die sie zum Ausführen ihrer Funktion benötigen. Die ursprüngliche Implementierung von Capabilities verhinderte, dass fork+exec'd Prozesse Capabilities erben konnten, es sei denn, für die auszuführenden Dateien waren Dateiberechtigungen konfiguriert. Dateiberechtigungen stellen wiederum ein Sicherheitsrisiko dar da jeder Prozess, der eine Datei mit Dateiberechtigungen ausführt, diese Berechtigungen erhalten kann.

Mit Ambient Capabilities können Systemdienste, die von init gestartet werden, Capabilities in ihren .rc Dateien konfigurieren. So wird die Konfiguration in einer einzigen Datei zusammengefasst, anstatt sie in der fs_config.c Datei aufzuteilen. Das bedeutet, dass Sie für jeden von init gestarteten Dienst die .rc Datei verwenden können, die mit dem Dienst verknüpft ist, um Capabilities für diesen Dienst zu konfigurieren.

Ambient Capabilities sind der bevorzugte Mechanismus zum Festlegen von Capabilities 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 Capabilities zu verwenden, anstatt Dateisystem-Capabilities mit dem Abschnitt „caps“ in config.fs Dateien zu konfigurieren.

Wenn Sie Capabilities für Dienste festlegen, die nicht von init gestartet werden, konfigurieren Sie Dateisystem-Capabilities weiterhin mit fs_config.c.

Ambient Capabilities aktivieren

Verwenden Sie das capabilities Schlüsselwort in init, um Ambient Capabilities für einen bestimmten Dienst zu aktivieren. Aktuelle Details zur init-Sprache finden Sie in der README.md-Datei von init.

Wenn Sie beispielsweise Ambient Capabilities für den AOSP-Dienst wificond aktivieren möchten, werden in der .rc-Datei für den wificond Dienst der entsprechende Nutzer und die entsprechenden Gruppen eingerichtet und dem Dienst mit dem capabilities Schlüsselwort die angegebenen Capabilities 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 gemeinsamen Android-Kernel Zweige zurückportiert.

Der Hauptpatch für Ambient Capabilities https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=58319057b7847667f0c9585b9de0e8932b0fdb08 wurde in die folgenden Versionen zurückportiert:

Ein kleiner Sicherheitspatch https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=b7f76ea2ef6739ee484a165ffbac98deb855d3d3 wurde in die folgenden Versionen zurückportiert:

Validierung

Bionic Einheitentests umfassen Einheitentests für Ambient Capabilities. Darüber hinaus können Sie das Schlüsselwort „capabilities“ in Android init für einen Dienst verwenden und dann prüfen, ob der Dienst die erwarteten Capabilities erhält, um diese Funktion zur Laufzeit zu testen.