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_ADMINReferenzimplementierung
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:
- android-3.18:
- android-4.1:
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:
- android-3.18:
- android-4.1:
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.