In diesem Artikel wird beschrieben, wie Android mit Kompatibilitätsproblemen bei Richtlinien umgeht. mit Plattform-OTAs, bei denen sich die SELinux-Einstellungen der neuen Plattform von den Einstellungen des alten Anbieters unterscheiden können. SELinux-Einstellungen.
Treble-basiertes SELinux-Richtliniendesign berücksichtigt binäre Unterscheidung
zwischen der Plattform- und der Anbieter-Richtlinie; wird das Schema
komplexer, wenn Anbieterpartitionen
Abhängigkeiten generieren, z. B.
platform
< vendor
< oem
Ab Android 8.0 wird die globale SELinux-Richtlinie in private und öffentlichen Komponenten. Öffentliche Komponenten bestehen aus der Richtlinie und den zugehörigen die für eine Plattformversion garantiert verfügbar sind. Diese Richtlinie wird Erstellern von Anbieterrichtlinien angezeigt, damit sie Anbietern die Möglichkeit geben können, eine Anbieterrichtliniendatei, die in Kombination mit der von der Plattform bereitgestellten Richtlinie zu einer voll funktionsfähigen Richtlinie für ein Gerät führt.
- Für die Versionsverwaltung wird die exportierte Plattformrichtlinie so geschrieben: attributes.
- Um das Schreiben von Richtlinien zu erleichtern, werden exportierte Typen in versionierte Attribute im Rahmen des Richtlinienerstellungsprozesses verwenden. Öffentlich Typen können auch direkt bei Label-Entscheidungen des Anbieters verwendet werden. Kontextdateien.
Android verwaltet eine Zuordnung zwischen exportierten Betontypen in der Plattform. und die entsprechenden versionierten Attribute für jede Plattform . Dadurch wird sichergestellt, dass beim Kennzeichnen von Objekten mit einem Typ nicht gegen das Verhalten verstößt, das in einer früheren Version. Diese Zuordnung wird verwaltet, indem eine Zuordnungsdatei für <ph type="x-smartling-placeholder"></ph> jede Plattformversion, die Informationen zur Mitgliedschaft der einzelnen Plattformen enthält. Typ, der in Public Policy exportiert wurde.
Objektinhaberschaft und -labels
Bei der Anpassung der Richtlinien unter Android 8.0 und höher müssen die Eigentumsrechte klar definiert werden.
für jedes Objekt, um Plattform und Anbieterrichtlinie voneinander zu trennen. Wenn beispielsweise
die Anbieter-Labels /dev/foo
und die Plattform,
/dev/foo
in einem nachfolgenden OTA-Update tritt ein undefiniertes Verhalten auf. Für
SELinux, äußert sich dies als Labeling-Konflikt. Der Geräteknoten darf nur einen
einzelnes Label, das in das zuletzt angewendete Label aufgelöst wird. Daraus ergeben sich folgende Konsequenzen:
- Für Prozesse, die Zugriff auf das nicht angewendete Label benötigen, den Zugriff auf die Ressource verlieren.
- Prozesse, die Zugriff auf die Datei erhalten, funktionieren möglicherweise nicht mehr, weil die Geräteknoten wurde erstellt.
Systemeigenschaften können auch Namenskonflikte verursachen, die zu undefiniertes Verhalten auf dem System (sowie für SELinux-Labeling). Kollisionen zwischen Plattform- und Anbieterlabels können für jedes Objekt auftreten, das ein SELinux einschließlich Eigenschaften, Diensten, Prozessen, Dateien und Sockets. Um dies zu vermeiden die Eigentumsrechte für diese Objekte klar zu definieren.
Neben Labelkonflikten können sich auch SELinux-Typ-/Attributnamen überschneiden. Eine Kollision von Typ/Attributnamen führt immer zu einem Richtlinien-Compiler-Fehler.
Namenstaktung für Typ/Attribut
SELinux lässt nicht mehrere Deklarationen desselben Typs bzw. desselben Attributs zu. Richtlinie
mit doppelten Deklarationen kann die Kompilierung nicht erfolgreich sein. Um Typ- und
Konflikte bezüglich Attributnamen haben, sollten alle Anbieterdeklarationen mit einem Namespace versehen sein.
beginnend mit vendor_
.
type foo, domain; → type vendor_foo, domain;
Systemeigenschaft und Prozessbeschriftung
Labelkonflikte vermeiden Sie am besten mit Attribut-Namespaces. Bis Plattform-Properties einfach identifizieren und Namenskonflikte bei der Umbenennung oder Exportierte Plattform-Properties hinzufügen, achten Sie darauf, dass alle Anbieter-Properties ihre eigene Präfixe:
Immobilienart | Zulässige Präfixe |
---|---|
Steuerelementeigenschaften | ctl.vendor. ctl.start$vendor. ctl.stop$vendor. init.svc.vendor.
|
schreibgeschützt | vendor. |
schreibgeschützt | ro.vendor. ro.boot. ro.hardware.
|
dauerhaft | persist.vendor. |
Anbieter können weiterhin ro.boot.*
verwenden, das aus dem Kernel stammt
cmdline) und ro.hardware.*
(eine offensichtliche hardware-bezogene Eigenschaft).
Alle Anbieterdienste in Init-RC-Dateien sollten vendor.
haben
für Dienste in Init-RC-Dateien von Nicht-Systempartitionen. Ähnliche Regeln sind
auf die SELinux-Labels für die Anbietereigenschaften (vendor_
) angewendet
für die Eigenschaften der Anbieter).
Eigentümerschaft von Dateien
Dateikollisionen zu vermeiden, ist schwierig, da Plattform und Anbieter stellen beide häufig Labels für alle Dateisysteme bereit. Anders als bei der Typbenennung Die Namensvermittlung von Dateien ist nicht praktikabel, da viele von ihnen vom Kernel. Folgen Sie der Benennungsanleitung für Dateisysteme, um diese Konflikte zu vermeiden. in diesem Abschnitt. Für Android 8.0 sind dies Empfehlungen ohne technische die Durchsetzung der Richtlinien. Künftig werden diese Empfehlungen durch das Vendor Test Suite (VTS):
System (/system)
Nur das System-Image muss Labels für /system
-Komponenten haben
über file_contexts
, service_contexts
usw. Wenn Labels
Für /system
werden in Richtlinie /vendor
Komponenten hinzugefügt, ein
OTA-Updates nur für Framework möglich.
Anbieter (/vendor)
Die AOSP SELinux-Richtlinie kennzeichnet bereits Teile der Partition vendor
mit Labels
mit denen die Plattform interagiert, wodurch das Schreiben von SELinux-Regeln für die Plattform
Prozesse, die in der Lage sind, mit anderen zu kommunizieren und/oder auf Teile von vendor
zuzugreifen
-Partition an. Beispiele:
Pfad „/vendor “ |
Von der Plattform bereitgestelltes Label | Plattformprozesse abhängig vom Label |
---|---|---|
/vendor(/.*)?
|
vendor_file
|
Alle HAL-Clients im Framework, ueventd usw.
|
/vendor/framework(/.*)?
|
vendor_framework_file
|
dex2oat , appdomain usw.
|
/vendor/app(/.*)?
|
vendor_app_file
|
dex2oat , installd , idmap usw.
|
/vendor/overlay(/.*)
|
vendor_overlay_file
|
system_server , zygote , idmap usw.
|
Daher müssen bestimmte Regeln eingehalten werden (durchgeführt
neverallows
), wenn Sie zusätzlichen Dateien in vendor
Labels hinzufügen
Partition:
vendor_file
muss das Standardlabel für alle Dateien in Partitionvendor
. Gemäß den Plattformrichtlinien ist dies für den Zugriff erforderlich Passthrough-HAL-Implementierungen.- Alle neuen
exec_types
in der Partitionvendor
hinzugefügt über die SEPolicy des Anbieters muss das Attributvendor_file_type
haben. Dieses wird durch "Niezulassen" erzwungen. - Vermeiden Sie Labels, um Konflikte mit zukünftigen Plattform-/Framework-Updates zu vermeiden.
Andere Dateien als
exec_types
in der Partitionvendor
- Alle Bibliotheksabhängigkeiten für durch AOSP identifizierte HALs desselben Prozesses müssen
mit dem Label
same_process_hal_file.
Procfs (/proc)
Dateien in /proc
dürfen nur mit dem genfscon
gekennzeichnet werden
. In Android 7.0 werden sowohl die
Plattform
und Anbieter
Richtlinie genfscon
verwendet, um Dateien in procfs
mit einem Label zu versehen.
Empfehlung:Nur Label für Plattformrichtlinien /proc
.
Wenn vendor
-Prozesse Zugriff auf Dateien in /proc
benötigen, die
sind derzeit mit dem Standardlabel (proc
) gekennzeichnet, Anbieterrichtlinie
sollten sie nicht explizit beschriften, sondern stattdessen die allgemeine
proc
, um Regeln für Anbieterdomains hinzuzufügen. Dadurch kann die Plattform
Updates zur Unterstützung zukünftiger Kernel-Schnittstellen, die über
procfs
und kennzeichnen Sie sie explizit nach Bedarf.
Debugfs (/sys/kernel/debug)
Debugfs
kann sowohl in file_contexts
als auch in
genfscon
In Android 7.0 bis Android 10 werden Plattform- und Anbieterlabel
debugfs
In Android 11 kann debugfs
nicht
auf Geräten in der Produktion
auf sie zugegriffen wird oder diese bereitgestellt werden. Gerätehersteller sollten
debugfs
entfernen.
Tracef (/sys/kernel/debug/tracing)
Tracefs
kann sowohl in file_contexts
als auch in
genfscon
In Android 7.0 werden nur die Plattformlabels
tracefs
Empfehlung: Nur die Plattform darf tracefs
kennzeichnen.
Sysfs (/sys)
Dateien in /sys
können mit beiden Labels versehen werden: file_contexts
und genfscon
. In Android 7.0 verwenden Plattform und Anbieter
file_contexts
und genfscon
, um Dateien mit Labels zu versehen
sysfs
Empfehlung:Die Plattform kann das Label sysfs
verwenden.
Knoten, die nicht gerätespezifisch sind. Andernfalls kann nur der Anbieter Dateien mit Labels versehen.
tmpfs (/dev)
Dateien in /dev
haben möglicherweise ein Label in file_contexts
. In
Hier finden Sie Android 7.0 sowohl Plattform- als auch Anbieter-Labeldateien.
Empfehlung:Der Anbieter kann nur Dateien mit Labels versehen,
/dev/vendor
(z.B. /dev/vendor/foo
,
/dev/vendor/socket/bar
).
Rootfs (/)
Dateien in /
haben möglicherweise ein Label in file_contexts
. In Android
7.0, sowohl Plattform- als auch Anbieter-Labeldateien.
Empfehlung:Nur das System kann Dateien in /
Labels hinzufügen.
Daten (/data)
Daten werden mithilfe einer Kombination aus file_contexts
und
seapp_contexts
.
Empfehlung:Anbieter-Labeling außerhalb der Domain nicht zulassen
/data/vendor
Andere Teile des Produkts dürfen nur von der Plattform gekennzeichnet werden.
/data
Kompatibilitätsattribute
Die SELinux-Richtlinie ist eine Interaktion zwischen Quell- und Zieltypen für bestimmte Objektklassen und Berechtigungen. Alle betroffenen Objekte (Prozesse, Dateien usw.) der SELinux-Richtlinie nur einen Typ haben, dieser kann jedoch mehrere Attribute.
Die Richtlinien werden hauptsächlich in Bezug auf die vorhandenen Typen verfasst:
allow source_type target_type:target_class permission(s);
Dies funktioniert, da bei der Richtlinienerstellung alle Arten von Kenntnissen berücksichtigt wurden. Sie können jedoch wenn in der Anbieter- und Plattformrichtlinie bestimmte Typen verwendet werden, und das Label einer Änderungen an Objekten nur in einer dieser Richtlinien vornehmen, kann die andere Richtlinien Richtlinien, auf die sich der zuvor gewährte oder verlorene Zugriff verlassen hat. Beispiel:
File_contexts: /sys/A u:object_r:sysfs:s0 Platform: allow p_domain sysfs:class perm; Vendor: allow v_domain sysfs:class perm;
Mögliche Änderung in:
File_contexts: /sys/A u:object_r:sysfs_A:s0
Die Anbieterrichtlinie bleibt unverändert, aber die v_domain
würde den Zugriff aufgrund fehlender Richtlinien für die neue sysfs_A
verlieren.
Typ.
Durch das Definieren einer Richtlinie in Bezug auf Attribute können wir dem zugrunde liegenden Objekt -Typ mit einem Attribut, das der Richtlinie sowohl für die Plattform als auch Code des Anbieters. Dies kann für alle Typen durchgeführt werden, um effektiv eine attribute-policy, wobei konkrete Typen nie verwendet werden. In der Praxis Dies ist nur für die Richtlinienabschnitte erforderlich, die sich zwischen den Plattformen und Anbieter, die als öffentliche Plattformrichtlinien definiert und bereitgestellt werden. die als Teil der Anbieterrichtlinie erstellt wird.
Die Definition einer öffentlichen Richtlinie als versionierte Attribute erfüllt zwei Richtlinien Kompatibilitätsziele:
- Achten Sie darauf, dass der Anbietercode auch nach dem Plattformupdate funktioniert. Erreicht durch Hinzufügen von Attributen zu konkreten Typen für Objekte, die zu auf denen der Anbietercode basiert.
- Einstellung der Richtlinie: Erreicht durch eindeutige die Richtliniensätze in Attribute unterteilen, die entfernt werden können, sobald der Version, der sie entsprechen, wird nicht mehr unterstützt. Entwicklung kann können Sie auf der Plattform fortfahren, in dem Wissen, dass die alte Richtlinie noch in der und wird bei einem Upgrade automatisch entfernt.
Beschreibbarkeit von Richtlinien
Um das Ziel zu erreichen, keine Kenntnis bestimmter Versionsänderungen für
Richtlinienentwicklung umfasst Android 8.0 eine Zuordnung zwischen
Richtlinientypen und deren Attribute. Typ foo
ist zugeordnet
um foo_vN
zuzuordnen, wobei N
der Wert
Version ausgerichtet. vN
entspricht dem
PLATFORM_SEPOLICY_VERSION
-Build-Variable und hat das Format
MM.NN
, wobei MM
der SDK-Nummer der Plattform entspricht
NN
ist eine plattformspezifische Version.
Attribute in öffentlichen Richtlinien sind nicht versioniert, sondern sind als API auf welche Plattform und Anbieterrichtlinie erstellt werden kann, um die Schnittstelle zwischen den beiden aufrechtzuerhalten. und Partitionen stabil sein. Sowohl Plattform- als auch Anbieterrichtlinien-Autoren können weiterhin Texte erstellen, in der heutigen Fassung.
Öffentliche Plattformrichtlinien, die als allow source_foo target_bar:class
perm;
exportiert wurden, sind in der Anbieterrichtlinie enthalten. Währenddessen
Compilation (einschließlich der
Version), wird er in die Richtlinie umgewandelt, die an die
Zulieferunternehmen des Geräts (im transformierten Common Intermediate)
Sprache (CIL):
(allow source_foo_vN target_bar_vN (class (perm)))
Da die Anbieterrichtlinien der Plattform immer voraus sind, sollten Sie sich früheren Versionen. Die Plattformrichtlinien müssen jedoch wissen, wie weit der Anbieter zurückliegen darf. Richtlinie ist, Attribute für seine Typen einschließen und die Richtlinie festlegen, die versionierte Attribute ein.
Richtlinienunterschiede
Attribute werden automatisch erstellt, indem _vN
am Ende hinzugefügt wird
der einzelnen Typen geschieht nichts, ohne die Attribute den Typen der Version zuzuordnen.
Unterschiede. Android unterhält eine Zuordnung zwischen Versionen für Attribute und einer
die Zuordnung von Typen zu diesen Attributen. Dies erfolgt in der oben genannten Zuordnung
Dateien mit Anweisungen wie (CIL):
(typeattributeset foo_vN (foo))
Plattformupgrades
Im folgenden Abschnitt werden Szenarien für Plattformupgrades beschrieben.
Gleiche Typen
Dieses Szenario tritt auf, wenn die Labels in den Richtlinienversionen von einem Objekt nicht geändert werden.
Dies ist für die Quell- und Zieltypen gleich und gilt auch für
/dev/binder
mit dem Label binder_device
in allen
Veröffentlichungen. Sie wird in der transformierten Richtlinie so dargestellt:
binder_device_v1 … binder_device_vN
Beim Upgrade von v1
auf v2
muss die Plattformrichtlinie
enthalten:
type binder_device; -> (type binder_device) (in CIL)
In der v1-Zuordnungsdatei (CIL):
(typeattributeset binder_device_v1 (binder_device))
In der v2-Zuordnungsdatei (CIL):
(typeattributeset binder_device_v2 (binder_device))
In der v1-Anbieterrichtlinie (CIL):
(typeattribute binder_device_v1) (allow binder_device_v1 …)
In der Anbieterrichtlinie der Version 2 (CIL):
(typeattribute binder_device_v2) (allow binder_device_v2 …)
Neue Typen
Dieses Szenario tritt auf, wenn auf der Plattform ein neuer beim Hinzufügen neuer Funktionen oder beim Härten von Richtlinien.
- Neue Funktion: Wenn der Typ ein Objekt mit einem Label versieht, das zuvor nicht existiert (z. B. ein neuer Serviceprozess), wurde der Anbietercode nicht zuvor direkt damit interagieren, damit keine entsprechende Richtlinie existiert. Das neue dem Typ entsprechendes Attribut besitzt kein Attribut in der vorherigen Version und benötigen daher keinen Eintrag in der Zuordnungsdatei, Version.
- Richtlinienhärtung. Wenn der Typ eine Richtlinie darstellt
zur Härtung erforderlich ist, muss das neue Attribut „type“ auf eine Kette von Attributen zurückverweisen.
entsprechend dem vorherigen (ähnlich dem vorherigen Beispiel,
/sys/A
vonsysfs
bissysfs_A
). Anbieter basiert auf einer Regel, die den Zugriff aufsysfs
ermöglicht, und benötigt um diese Regel als Attribut des neuen Typs aufzunehmen.
Beim Upgrade von v1
auf v2
muss die Plattformrichtlinie
enthalten:
type sysfs_A; -> (type sysfs_A) (in CIL) type sysfs; (type sysfs) (in CIL)
In der v1-Zuordnungsdatei (CIL):
(typeattributeset sysfs_v1 (sysfs sysfs_A))
In der v2-Zuordnungsdatei (CIL):
(typeattributeset sysfs_v2 (sysfs)) (typeattributeset sysfs_A_v2 (sysfs_A))
In der v1-Anbieterrichtlinie (CIL):
(typeattribute sysfs_v1) (allow … sysfs_v1 …)
In der Anbieterrichtlinie der Version 2 (CIL):
(typeattribute sysfs_A_v2) (allow … sysfs_A_v2 …) (typeattribute sysfs_v2) (allow … sysfs_v2 …)
Entfernte Typen
Dieses (seltene) Szenario tritt auf, wenn ein Typ entfernt wird. Dies kann passieren, wenn der zugrunde liegendes Objekt:
- Bleibt, erhält aber ein anderes Label.
- Sie wird von der Plattform entfernt.
Während der Richtlinienlockerung wird ein Typ entfernt und das Objekt mit diesem Typ gekennzeichnet erhält ein anderes, bereits vorhandenes Label. Dies stellt eine Zusammenführung von Attributzuordnungen: Der Anbietercode muss weiterhin auf die zugrunde liegende durch das Attribut ersetzen, das er zuvor hatte. Der Rest des Systems muss jedoch mit dem neuen Attribut auf sie zugreifen können.
Wenn das Attribut, auf das es umgestellt wurde, neu ist, ist die Umbenennung wie im Fall des neuen Typs, außer dass bei Verwendung eines vorhandenen Labels der Hinzufügen des alten Attributs neuer Typ würden andere Objekte, die ebenfalls als mit diesem Typ neu zugänglich sind. Das ist im Wesentlichen das, was der Plattform und gilt als akzeptabler Kompromiss Kompatibilität.
(typeattribute sysfs_v1) (allow … sysfs_v1 …)
Beispielversion 1: Typen minimieren (sysfs_A entfernen)
Beim Upgrade von v1
auf v2
muss die Plattformrichtlinie
enthalten:
type sysfs; (type sysfs) (in CIL)
In der v1-Zuordnungsdatei (CIL):
(typeattributeset sysfs_v1 (sysfs)) (type sysfs_A) # in case vendors used the sysfs_A label on objects (typeattributeset sysfs_A_v1 (sysfs sysfs_A))
In der v2-Zuordnungsdatei (CIL):
(typeattributeset sysfs_v2 (sysfs))
In der v1-Anbieterrichtlinie (CIL):
(typeattribute sysfs_A_v1) (allow … sysfs_A_v1 …) (typeattribute sysfs_v1) (allow … sysfs_v1 …)
In der Anbieterrichtlinie der Version 2 (CIL):
(typeattribute sysfs_v2) (allow … sysfs_v2 …)
Beispielversion 2: Vollständig entfernen (foo type)
Beim Upgrade von v1
auf v2
muss die Plattformrichtlinie
enthalten:
# nothing - we got rid of the type
In der v1-Zuordnungsdatei (CIL):
(type foo) #needed in case vendors used the foo label on objects (typeattributeset foo_v1 (foo))
In der v2-Zuordnungsdatei (CIL):
# nothing - get rid of it
In der v1-Anbieterrichtlinie (CIL):
(typeattribute foo_v1) (allow foo …) (typeattribute sysfs_v1) (allow sysfs_v1 …)
In der Anbieterrichtlinie der Version 2 (CIL):
(typeattribute sysfs_v2) (allow sysfs_v2 …)
Neue Klasse/neue Berechtigungen
Dieses Szenario tritt auf, wenn bei einem Plattformupgrade neue Richtlinienkomponenten eingeführt werden
die in früheren Versionen nicht vorhanden waren. So hat Android zum Beispiel
servicemanager
-Objektmanager, der die Elemente zum Hinzufügen, Suchen und Auflisten erstellt hat
und Anbieter-Daemons, die sich beim
servicemanager
benötigte Berechtigungen, die nicht
verfügbar. In Android 8.0 können neue Klassen und Richtlinien nur
über die Plattformrichtlinie hinzugefügt werden.
Berechtigungen.
Alle Domains zulassen, die durch eine Anbieterrichtlinie hätten erstellt oder erweitert werden können Um die neue Klasse ohne Hindernisse verwenden zu können, muss die Plattformrichtlinie einen ähnlich wie diese:
allow {domain -coredomain} *:new_class perm;
Möglicherweise ist sogar eine Richtlinie erforderlich, die den Zugriff für alle Benutzeroberflächen zulässt (öffentliche Richtlinie). um sicherzustellen, dass das Anbieter-Image Zugriff erhält. Wenn dies zu inakzeptablen (wie es bei Änderungen des Service Manager der Fall sein kann), möglicherweise erzwungen.
Kurs/Berechtigungen entfernt
Dieses Szenario tritt ein, wenn ein Objektmanager (z. B. der
ZygoteConnection
-Objektmanager) und sollte keine Probleme verursachen. Die
Objekt-Manager-Klasse und Berechtigungen können in der Richtlinie definiert bleiben, bis die
wird sie nicht mehr verwendet. Hierzu werden die Definitionen
in die entsprechende Zuordnungsdatei ein.
Anbieteranpassung für neue/mit neuen Labels versehene Typen
Neue Anbietertypen stehen bei der Entwicklung von Anbieterrichtlinien im Mittelpunkt zur Beschreibung neuer Prozesse, Binärdateien, Geräte, Subsysteme und gespeicherter Daten. Als müssen Sie die Erstellung anbieterdefinierter Typen zulassen.
Da die Anbieterrichtlinie immer die älteste auf dem Gerät ist, ist es nicht nötig,
Alle Anbietertypen werden in der Richtlinie automatisch in Attribute konvertiert. Die Plattform
nicht auf die in der Anbieterrichtlinie
beschrifteten Angaben basiert, da die Plattform
Wissen darüber; Die Plattform stellt jedoch die Attribute und
Typen, die zur Interaktion mit Objekten dieser Typen verwendet werden, z. B.
domain
, sysfs_type
usw.). Damit die Plattform
weiterhin korrekt mit diesen Objekten, den Attributen und Typen
müssen angemessen angewendet werden und es müssen ggf. spezifische Regeln
anpassbare Domains (z. B. init
).
Attributänderungen für Android 9
Für Geräte, die auf Android 9 upgraden, können die folgenden Attribute verwendet werden, Geräte die Einführung mit Android 9 nicht gestattet ist.
Attribute mit Verstößen
Android 9 enthält die folgenden domainbezogenen Attribute:
data_between_core_and_vendor_violators
Attribut für alle Domains, die gegen die Anforderung verstoßen, dass keine Dateien freigegeben werden, indem Pfad zwischenvendor
undcoredomains
. Plattform- und Anbieterprozesse sollten zur Kommunikation keine Dateien auf dem Laufwerk verwenden (instabiles ABI). Empfehlung: <ph type="x-smartling-placeholder">- </ph>
- Der Anbietercode sollte
/data/vendor
verwenden. /data/vendor
sollte nicht vom System verwendet werden.
- Der Anbietercode sollte
system_executes_vendor_violators
Attribut für alle Systemdomains (außerinit
undshell domains
) die gegen die Anforderung verstoßen, keine Anbieter-Binärprogramme auszuführen. Ausführung von Die Binärdateien des Anbieters haben eine instabile API. Die Plattform sollte keine Binärdateien des Anbieters ausführen . Empfehlung: <ph type="x-smartling-placeholder">- </ph>
- Solche Plattformabhängigkeiten von Anbieter-Binärdateien müssen sich hinter HIDL HALs befinden.
ODER
coredomains
, die Zugriff auf die Binärdateien des Anbieters benötigen, sollten wurden in die Anbieterpartition verschoben und sind daher nicht mehrcoredomain
.
- Solche Plattformabhängigkeiten von Anbieter-Binärdateien müssen sich hinter HIDL HALs befinden.
Nicht vertrauenswürdige Attribute
Nicht vertrauenswürdige Apps, die beliebigen Code hosten, sollten keinen Zugriff auf HwBinder haben -Dienste, ausgenommen solche, die für den Zugriff über solche Apps als ausreichend sicher eingestuft werden (siehe „sichere Dienste“ unten). Dies sind die beiden Hauptgründe:
- HwBinder-Server führen keine Clientauthentifizierung durch, da HIDL derzeit werden keine UID-Informationen des Aufrufers preisgegeben. Selbst wenn HIDL solche Daten preisgegeben hat, HwBinder-Dienste arbeiten entweder auf einer Ebene unterhalb der von Apps (wie HALs) oder sich für die Autorisierung nicht auf die App-Identität verlassen. Aus Sicherheitsgründen wird dass jeder HwBinder-Dienst alle Clients zur Durchführung von Vorgängen befugt ist, die im Rahmen des Dienstes angeboten werden.
- HAL-Server (eine Teilmenge der HwBinder-Dienste) enthalten Code mit
Häufigkeit von Sicherheitsproblemen als bei
system/core
Komponenten und Zugriff auf die unteren Ebenen des Stacks (bis hin zur Hardware) haben, immer mehr Möglichkeiten, das Android-Sicherheitsmodell zu umgehen.
Sichere Dienste
Zu den sicheren Diensten gehören:
same_process_hwservice
Diese Dienste werden (per Definition) ausgeführt in den Prozess des Clients und haben somit denselben Zugriff wie die Client-Domain in den der Prozess ausführt.coredomain_hwservice
Diese Dienste stellen keine Risiken dar mit Grund 2 verknüpft ist.hal_configstore_ISurfaceFlingerConfigs
Dieser Dienst ist die speziell für die Nutzung durch beliebige Domains entwickelt wurden.hal_graphics_allocator_hwservice
Diese Vorgänge sind auch vomsurfaceflinger
Binder-Dienst angeboten, welche Apps zulässig sind um darauf zuzugreifen.hal_omx_hwservice
Dies ist eine HwBinder-Version desmediacodec
Binder-Dienst, auf die Apps zugreifen dürfen.hal_codec2_hwservice
Dies ist eine neuere Version vonhal_omx_hwservice
.
Verwendbare Attribute
Alle hwservices
, die nicht als sicher gelten, haben das Attribut
untrusted_app_visible_hwservice
. Die entsprechenden HAL-Server haben
das Attribut untrusted_app_visible_halserver
Geräte werden gestartet
mit Android 9 DÜRFEN KEINES verwenden
Attribut „untrusted
“.
Empfehlung:
- Nicht vertrauenswürdige Apps sollten stattdessen mit einem Systemdienst kommunizieren, der mit dem
Anbieter HIDL HAL. Apps können beispielsweise mit
binderservicedomain
und dann mitmediaserver
kommunizieren (binderservicedomain
) spricht wiederum mithal_graphics_allocator
.ODER
- Apps, die direkten Zugriff auf
vendor
HALs benötigen, sollten ihre eigenen eigene anbieterdefinierte sepolicy-Domain.
Dateiattributtests
Android 9 umfasst Build-Zeittests, mit denen sichergestellt wird, dass alle Dateien in bestimmten
haben die entsprechenden Attribute (z. B. alle Dateien in
sysfs
haben das erforderliche Attribut sysfs_type
).
Plattform-öffentliche Richtlinien
Die plattformweite öffentliche Richtlinie bildet den Kern der Einhaltung von Android 8.0.
Architekturmodell zu erstellen, ohne einfach die Union der Plattformrichtlinien wahren zu müssen
Version 1 und 2. Für Anbieter gilt eine Untergruppe von Plattformrichtlinien,
verwendbare Typen und Attribute sowie Regeln zu diesen Typen und Attributen enthält.
das dann Teil der Anbieterrichtlinie wird (d.h.
vendor_sepolicy.cil
.
Typen und Regeln werden in der vom Anbieter generierten Richtlinie automatisch übersetzt
in attribute_vN
, sodass alle von der Plattform bereitgestellten Typen
sind versionierte Attribute, allerdings sind Attribute nicht versioniert. Die Plattform ist
die konkreten Typen, die sie bereitstellt, in die entsprechenden
Attribute verwenden, um sicherzustellen, dass die Anbieterrichtlinie weiterhin funktioniert und die Regeln
die für eine bestimmte Version bereitgestellt werden. Die Kombination aus
Die öffentliche Plattformrichtlinie und die Anbieterrichtlinie entsprechen der Android 8.0-Architektur.
dass unabhängige Plattform- und
Lieferanten-Builds möglich sind.
Zuordnung zu Attributketten
Wenn Sie Attribute für die Zuordnung zu Richtlinienversionen verwenden, wird ein Typ einem Attribut oder mehrere Attribute, wodurch sichergestellt wird, dass Objekte, die mit diesem Typ gekennzeichnet sind, über die ihren vorherigen Typen entsprechen.
Das Ziel, Versionsinformationen vor dem
Richtlinienautor zu verbergen, bedeutet,
die versionierten Attribute automatisch generiert und dem
Typen geeignet sind. Bei statischen Typen ist dies unkompliziert:
type_foo
verweist auf type_foo_v1
.
Bei einer Änderung des Objektlabels wie sysfs
→ sysfs_A
oder
mediaserver
→ audioserver
, das Erstellen dieser Zuordnung ist
nicht trivial sind (und in den Beispielen oben beschrieben). Administratoren für Plattformrichtlinien
müssen bestimmen, wie die Zuordnung an Übergangspunkten für Objekte erstellt wird.
erfordert, dass Sie die Beziehung zwischen
Objekten und den ihnen zugewiesenen
und bestimmen, wann dies geschieht. Aus Gründen der Abwärtskompatibilität
die Komplexität auf der Plattformseite verwaltet werden muss.
Sie ist die einzige Partition,
das zu höheren Umsätzen führen kann.
Versionserhöhungen
Der Einfachheit halber veröffentlicht die Android-Plattform eine sepolicy-Version, wenn eine neue
Release-Zweig ausgeschnitten. Wie oben beschrieben, ist die Versionsnummer in
PLATFORM_SEPOLICY_VERSION
und hat das Format MM.nn
,
Dabei entspricht MM
dem SDK-Wert und nn
ist ein
privater Wert bewahrt in /platform/system/sepolicy.
z. B. 19.0
für Kitkat, 21.0
für Lollipop,
22.0
für Lollipop-MR1 23.0
für Marshmallow,
24.0
für Nougat, 25.0
für Nougat-MR1,
26.0
für Oreo, 27.0
für Oreo-MR1 und
28.0
für Android 9.
Uprevs sind nicht immer ganze Zahlen. Für
Wenn z. B. ein MR auf eine Version stößt, erfordert eine inkompatible Änderung der
system/sepolicy/public
, aber nicht auf einen API-Bump,
Version könnte lauten: vN.1
. Die in der Entwicklung befindliche Version
ist ein 10000.0
, das beim Versand nie verwendet werden kann.
Bei einem Upgrade wird die älteste Android-Version möglicherweise eingestellt. Für die Eingabe bei eine Version eingestellt wird, kann Android die Anzahl der Geräte die diese Android-Version ausführen und noch eine wichtige Plattform erhält, Aktualisierungen. Wenn die Anzahl unter einem bestimmten Grenzwert liegt, wird diese Version eingestellt.
Auswirkungen auf die Leistung von mehrere Attribute
Wie unter https://github.com/SELinuxProject/cil/issues/9 beschrieben, viele Attribute, die einem Typ zugewiesen sind, führen zu Leistungsproblemen wenn ein Richtlinien-Cache-Fehler auftritt.
Es wurde bestätigt, dass es sich dabei um ein Problem bei Android handelt. Deshalb ändert sich wurden unter Android 8.0 vorgenommen, um Attribute zu entfernen, die vom Policy Compiler sowie das Entfernen nicht verwendeter Attribute. Diese Änderungen wurden behoben Leistungsabfälle.
Öffentliche Richtlinie (System_ext) und öffentliche Produktrichtlinien
Ab Android 11 dürfen system_ext und Produktpartitionen
ihre festgelegten öffentlichen Typen in die Anbieterpartition exportieren. Plattform bewerten
öffentlichen Richtlinien entsprechen, verwendet der Anbieter Typen und Regeln, die automatisch in
die versionierten Attribute, z.B. von type
in
type_N
, wobei N
die Version ist
der Plattform, auf der
die Anbieterpartition basiert.
Wenn die system_ext- und Produktpartitionen auf derselben Plattformversion basieren
N
generiert das Build-System grundlegende Zuordnungsdateien zu
system_ext/etc/selinux/mapping/N.cil
und
product/etc/selinux/mapping/N.cil
, die Identitäten enthalten
Zuordnungen von type
zu type_N
. Das Zulieferunternehmen kann
Zugriff auf type
mit dem versionierten Attribut type_N
.
Wenn nur system_ext und Produktpartitionen aktualisiert werden,
N
bis N+1
(oder höher), während die
bleibt der Anbieter bei N
, verliert er möglicherweise den Zugriff auf den
der system_ext- und Produktpartitionen. Um Ausfälle zu vermeiden,
system_ext und Produktpartitionen sollten Zuordnungsdateien aus konkreten
in type_N
-Attribute ein. Jeder Partner
für die Verwaltung der Zuordnungsdateien verantwortlich,
N
Anbieter mit N+1
(oder höher)
system_ext und Produktpartitionen.
Dazu müssen Partner:
- Kopieren Sie die generierten grundlegenden Zuordnungsdateien aus
N
system_ext und Produktaufteilungen zu ihrem Quellbaum hinzufügen. - Ergänzen Sie die Zuordnungsdateien nach Bedarf.
-
Installieren Sie die
Zuordnungsdateien zu
N+1
(oder höher) system_ext und Produktaufteilungen.
Beispiel: N
system_ext hat genau eine öffentliche
Typ mit dem Namen foo_type
. Dann: system_ext/etc/selinux/mapping/N.cil
in der system_ext-Partition N
so aus:
(typeattributeset foo_type_N (foo_type)) (expandtypeattribute foo_type_N true) (typeattribute foo_type_N)
Wenn bar_type
zu „system_ext“ N+1
hinzugefügt wird und
wenn bar_type
foo_type
für
N
Anbieter, N.cil
kann aktualisiert werden von
(typeattributeset foo_type_N (foo_type))
(typeattributeset foo_type_N (foo_type bar_type))
und dann in der Partition N+1
von system_ext installiert.
N
Anbieter kann weiterhin auf N+1
zugreifen
foo_type
und bar_type
von system_ext.
Labeling von SELinux-Kontexten
Um die Unterscheidung zwischen Plattform und Anbieter zu unterstützen, erstellt das System SELinux-Kontextdateien unterschiedlich, um sie voneinander zu trennen.
Dateikontexte
Mit Android 8.0 wurden die folgenden Änderungen für file_contexts
eingeführt:
- Um zusätzlichen Kompilierungsaufwand auf dem Gerät während des Startvorgangs zu vermeiden,
file_contexts
existiert nicht mehr in Binärform. Stattdessen werden sie sind lesbare Textdateien mit regulären Ausdrücken wie{property, service}_contexts
(vor Version 7.0). file_contexts
werden auf zwei Dateien aufgeteilt: <ph type="x-smartling-placeholder">- </ph>
plat_file_contexts
- Android-Plattform
file_context
ohne gerätespezifische Labels, mit Ausnahme der Beschriftung von Teilen von/vendor
-Partition, die genau mit dass die sepolicy-Dateien ordnungsgemäß funktionieren. - Muss sich in der Partition
system
befinden unter/system/etc/selinux/plat_file_contexts
auf dem Gerät und voninit
beim Start zusammen mit dem Anbieterfile_context
.
- Android-Plattform
vendor_file_contexts
- Gerätespezifische
file_context
, erstellt aus einer Kombinationfile_contexts
in den Verzeichnissen gefunden, auf die von verweistBOARD_SEPOLICY_DIRS
imBoardconfig.mk
-Dateien. - Muss hier installiert werden
/vendor/etc/selinux/vendor_file_contexts
Zollvendor
-Partition und wird voninit
am folgenden Ort geladen: zusammen mit der Plattformfile_context
.
- Gerätespezifische
Attributkontexte
In Android 8.0 wird property_contexts
auf zwei Dateien aufgeteilt:
plat_property_contexts
- Android-Plattform
property_context
ohne gerätespezifischen Labels. - Muss sich in der Partition
system
befinden unter/system/etc/selinux/plat_property_contexts
und geladen voninit
zu Beginn zusammen mit dem Anbieterproperty_contexts
.
- Android-Plattform
vendor_property_contexts
- Gerätespezifische
property_context
, erstellt aus einer Kombinationproperty_contexts
in den Verzeichnissen gefunden, auf die von verweistBOARD_SEPOLICY_DIRS
im GerätBoardconfig.mk
-Dateien. - Muss sich in der Partition
vendor
befinden unter/vendor/etc/selinux/vendor_property_contexts
und sein voninit
beim Start zusammen mit dem Bahnsteig geladenproperty_context
- Gerätespezifische
Dienstkontexte
In Android 8.0 wird service_contexts
zwischen den folgenden
Dateien:
plat_service_contexts
- Android-plattformspezifisches
service_context
für denservicemanager
.service_context
enthält keine gerätespezifischen Labels. - Muss sich in der Partition
system
befinden unter/system/etc/selinux/plat_service_contexts
und geladen vonservicemanager
, zusammen mit dem Anbieterservice_contexts
.
- Android-plattformspezifisches
vendor_service_contexts
- Gerätespezifische
service_context
, erstellt aus einer Kombinationservice_contexts
in den Verzeichnissen gefunden, auf die von verweistBOARD_SEPOLICY_DIRS
imBoardconfig.mk
-Dateien. - Muss sich in der Partition
vendor
befinden unter/vendor/etc/selinux/vendor_service_contexts
und geladen vonservicemanager
zu Beginn, zusammen mit der Plattformservice_contexts
. - Obwohl
servicemanager
beim Booten nach dieser Datei sucht, für ein vollständig konformesTREBLE
-Gerät, dasvendor_service_contexts
DARF NICHT vorhanden sein. Das liegt daran, alle Interaktionen zwischenvendor
undsystem
Prozesse MÜSSEN durchlaufenhwservicemanager
/hwbinder
.
- Gerätespezifische
plat_hwservice_contexts
- Android-Plattform
hwservice_context
fürhwservicemanager
ohne gerätespezifische Labels. - Muss sich in der Partition
system
befinden unter/system/etc/selinux/plat_hwservice_contexts
und geladen vonhwservicemanager
zusammen mit denvendor_hwservice_contexts
.
- Android-Plattform
vendor_hwservice_contexts
- Gerätespezifische
hwservice_context
, erstellt aus einer Kombinationhwservice_contexts
in den Verzeichnissen gefunden, auf die von verweistBOARD_SEPOLICY_DIRS
imBoardconfig.mk
-Dateien. - Muss sich in der Partition
vendor
befinden unter/vendor/etc/selinux/vendor_hwservice_contexts
und sein vonhwservicemanager
beim Start zusammen mit demplat_service_contexts
.
- Gerätespezifische
vndservice_contexts
- Gerätespezifisches
service_context
für denvndservicemanager
erstellt durch Kombinationvndservice_contexts
in den Verzeichnissen gefunden, auf die von verweistBOARD_SEPOLICY_DIRS
imBoardconfig.mk
- Diese Datei muss sich in der Partition
vendor
unter folgendem Pfad befinden:/vendor/etc/selinux/vndservice_contexts
und geladen vonvndservicemanager
zu beginnen.
- Gerätespezifisches
SeApp-Kontexte
In Android 8.0 wird seapp_contexts
auf zwei Dateien aufgeteilt:
plat_seapp_contexts
- Android-Plattform
seapp_context
ohne gerätespezifische Änderungen. - Muss sich in der Partition
system
befinden unter/system/etc/selinux/plat_seapp_contexts.
- Android-Plattform
vendor_seapp_contexts
- Gerätespezifische Erweiterung für Plattform
seapp_context
entwickelt durch Kombinieren vonseapp_contexts
aus den VerzeichnissenBOARD_SEPOLICY_DIRS
in derBoardconfig.mk
-Dateien. - Muss sich in der Partition
vendor
befinden unter/vendor/etc/selinux/vendor_seapp_contexts
.
- Gerätespezifische Erweiterung für Plattform
MAC-Berechtigungen
In Android 8.0 wird mac_permissions.xml
auf zwei Dateien aufgeteilt:
- Gleis
mac_permissions.xml
<ph type="x-smartling-placeholder">- </ph>
- Android-Plattform
mac_permissions.xml
ohne gerätespezifischen Änderungen vornehmen. - Muss sich in der Partition
system
befinden unter/system/etc/selinux/.
- Android-Plattform
- Nicht-Plattform
mac_permissions.xml
<ph type="x-smartling-placeholder">- </ph>
- Gerätespezifische Plattformerweiterung
mac_permissions.xml
erstellt ausmac_permissions.xml
in den Verzeichnissen gefunden, auf die von verwiesen wirdBOARD_SEPOLICY_DIRS
imBoardconfig.mk
Dateien. - Muss sich in der Partition
vendor
befinden unter/vendor/etc/selinux/.
- Gerätespezifische Plattformerweiterung