Zulassungsliste mit privilegierten Berechtigungen

Privilegierte Apps sind System-Apps, die sich in einem priv-app Verzeichnis auf einer der System-Image-Partitionen befinden. Die für Android-Releases verwendeten Partitionen sind

  • Android 8.1 und niedriger - /system
  • Android 9 und höher – /system, /product, /vendor

Auf dieser Seite wird /etc/permissions/priv-app in die partition /etc/permissions/priv-app .

In der Vergangenheit hatten Gerätehersteller wenig Kontrolle darüber, welche Signatur|privilegierten Berechtigungen privilegierten Apps gewährt werden konnten. Ab Android 8.0 müssen Hersteller explizit privilegierte Berechtigungen in den XML-Dateien der Systemkonfiguration im Verzeichnis /etc/permissions erteilen. Ab Android 9 müssen Implementierer alle privilegierten Berechtigungen ausdrücklich erteilen oder verweigern, sonst startet das Gerät nicht.

Die Datei privapp-permissions.xml kann Berechtigungen nur für privilegierte Apps auf derselben Partition erteilen oder verweigern. Wenn beispielsweise eine App auf der /product -Partition privilegierte Berechtigungen anfordert, kann die Anforderung nur von einer privapp-permissions.xml -Datei gewährt oder verweigert werden, die sich ebenfalls auf /product befindet.

Zulassungslisten hinzufügen

Zulassungslisten für Apps können wie folgt in einer einzelnen XML-Datei oder in mehreren XML-Dateien im Verzeichnis frameworks/base/etc/permissions aufgelistet werden:

  • /etc/permissions/privapp-permissions- OEM_NAME .xml
  • /etc/permissions/privapp-permissions- DEVICE_NAME .xml

Es gibt keine strenge Regel für die Organisation von Inhalten. Geräteimplementierer können die Inhaltsstruktur bestimmen, solange alle Apps von /system/priv-app auf der Zulassungsliste stehen. Beispielsweise hat Google eine einzige Zulassungsliste für alle privilegierten Apps, die von Google entwickelt wurden, und empfiehlt die folgende Organisation:

  • Berechtigungen für Apps, die bereits im Baum des Android Open Source Project (AOSP) enthalten sind, sind in /etc/permissions/privapp-permissions-platform.xml aufgeführt.
  • Berechtigungen für Google-Apps sind in /etc/permissions/privapp-permissions-google.xml aufgeführt.
  • Verwenden Sie für andere Apps Dateien der Form: /etc/permissions/privapp-permissions- DEVICE_NAME .xml .

Positivlisten erstellen

Verwenden Sie das AOSP-Befehlszeilentool unter development/tools/privapp_permissions/privapp_permissions.py , um automatisch eine Zulassungsliste für alle auf dem Systemabbild verfügbaren Apps zu erstellen. So generieren Sie eine erste Version der gerätespezifischen privapp-permissions.xml :

  1. Erstellen Sie ein Systemabbild:
        . build/envsetup.sh
        lunch PRODUCT_NAME
        make -j
  2. Führen Sie das Skript privapp_permissions.py aus, um eine privapp-permissions.xml Datei zu generieren, die alle Signatur|privilegierten Berechtigungen auflistet, die für die Zulassungsliste erforderlich sind:
    development/tools/privapp_permissions/privapp_permissions.py
    Dieses Tool druckt XML-Inhalt, der entweder als einzelne Datei verwendet oder in mehrere Dateien aufgeteilt werden kann im Verzeichnispfad /etc/permissions . Wenn das Gerät bereits Zulassungslisten in den Verzeichnissen /etc/permissions enthält, druckt das Tool nur die Unterschiede (z. B. die fehlende Signatur|privilegierte Berechtigungen, die Sie der Zulassungsliste hinzufügen müssen). Dies ist auch für Audit-Zwecke nützlich: Wenn eine neue Version der App hinzugefügt wird, erkennt das Tool die erforderlichen zusätzlichen Berechtigungen.
  3. Kopieren Sie die generierten Dateien in das entsprechende /etc/permissions -Verzeichnis, wo das System die Dateien während des Bootens liest.

Anpassen von Zulassungslisten

AOSP enthält eine Zulassungslistenimplementierung, die nach Bedarf angepasst werden kann. Berechtigungen für in AOSP enthaltene Apps sind bereits in /etc/permissions/privapp-permissions-platform.xml auf der Positivliste aufgeführt.

Standardmäßig generiert das Skript privapp_permissions.py eine Ausgabe, die automatisch alle von einer privilegierten Anwendung angeforderten Berechtigungen erteilt. Wenn es Berechtigungen gibt, die verweigert werden sollten, bearbeiten Sie die XML-Datei so, dass anstelle eines „permission“-Tags ein „deny-permission“-Tag verwendet wird. Beispiel:

<!-- This XML file declares which signature|privileged permissions to grant to
privileged apps that come with the platform -->

    <permissions>
    <privapp-permissions package="com.android.backupconfirm">
    <permission name="android.permission.BACKUP"/>
    <permission name="android.permission.CRYPT_KEEPER"/>
    </privapp-permissions>

    <privapp-permissions package="com.android.cellbroadcastreceiver">

    <!-- Don't allow the application to interact across users -->

    <deny-permission name="android.permission.INTERACT_ACROSS_USERS"/>
    <permission name="android.permission.MANAGE_USERS"/>
    <permission name="android.permission.MODIFY_PHONE_STATE"/>
    <permission name="android.permission.READ_PRIVILEGED_PHONE_STATE"/>
    <permission name="android.permission.RECEIVE_EMERGENCY_BROADCAST"/>
    </privapp-permissions>
    ...

Fehlende Berechtigungen finden

Um fehlende Berechtigungen beim Hochfahren eines neuen Geräts zu finden, aktivieren Sie den Übergangsprotokollmodus:

ro.control_privapp_permissions=log

Verstöße werden in der Protokolldatei gemeldet, aber nichtprivilegierte Berechtigungen werden weiterhin gewährt. Dadurch bleibt das Gerät in einem funktionierenden Zustand, während die Liste der Verstöße bereitgestellt wird. Dies ist das Format der Fehlermeldung:

PackageManager: Privileged permission {PERMISSION_NAME} for package {PACKAGE_NAME} - not in privapp-permissions allowlist

Alle Verstöße müssen behoben werden, indem die fehlenden Berechtigungen den entsprechenden Zulassungslisten hinzugefügt werden.

  • Unter Android 8.0 und niedriger werden den betroffenen Apps die fehlenden Berechtigungen nicht gewährt, selbst wenn sie sich im Pfad priv-app “ befinden.
  • Unter Android 9 und höher führen Verletzungen ( privilegierter Berechtigungen) dazu, dass das Gerät nicht startet . Sie müssen alle privilegierten Berechtigungen explizit zulassen oder verweigern

Zulassungslisten erzwingen

Nachdem Zulassungslisten vorhanden sind, aktivieren Sie die Laufzeiterzwingung, indem Sie die Build-Eigenschaft ro.control_privapp_permissions=enforce .