Benutzerdefinierte App-Berechtigung festlegen

In diesem Dokument wird beschrieben, wie App-Entwickler die Sicherheitsfunktionen von Android, um eigene Berechtigungen zu definieren. Durch das Definieren benutzerdefinierter Berechtigungen kann eine App ihre Ressourcen und Funktionen für andere Apps freigeben. Weitere Informationen zu Berechtigungen finden Sie in der Berechtigungsübersicht.

Hintergrund

Android ist ein privilegiertes Betriebssystem, App wird mit einer eindeutigen Systemidentität ausgeführt (Linux-Nutzer-ID und -Gruppe). ID). Teile des Systems werden auch in verschiedene Identitäten unterteilt. So werden Apps voneinander und vom System isoliert.

Durch das Definieren von Berechtigungen können Apps ihre Funktionen für andere Apps freigeben die andere Apps anfordern können. Sie können auch Berechtigungen definieren, die automatisch für alle anderen Apps verfügbar gemacht werden, die mit demselben Zertifikat signiert sind.

App-Signatur

Alle APKs müssen mit einem Zertifikat signiert sein, dessen privater Schlüssel vom Entwickler gehalten wird. Das Zertifikat muss nicht von einer Zertifizierungsstelle signiert sein. Es ist zulässig und üblich, dass Android-Apps selbst signierte Zertifikate verwenden. Der Zweck der um App-Autoren zu unterscheiden. So kann das System Apps Zugriff auf Berechtigungen auf Signaturebene gewähren oder verweigern und die Anfrage einer App, dieselbe Linux-Identität wie eine andere App zu erhalten, gewähren oder ablehnen.

Signaturberechtigungen nach der Herstellung des Geräts erteilen

Ab Android 12 (API-Ebene 31) können Sie mit dem Attribut knownCerts für Berechtigungen auf Signaturebene zum Zeitpunkt der Deklaration auf die Hash-Werte bekannter Signaturzertifikate verweisen.

Sie können das Attribut knownCerts deklarieren und das Flag knownSigner verwenden in der protectionLevel Ihrer App Attribut für eine bestimmte Berechtigung auf Signaturebene. Anschließend gewährt das System diese Berechtigung einer anfragenden App, wenn einer der Unterzeichner in der Signaturabfolge der anfragenden App, einschließlich des aktuellen Unterzeichners, mit einem der Digests übereinstimmt, die im Attribut knownCerts mit der Berechtigung deklariert sind.

Mit dem Flag knownSigner können Geräte und Apps anderen Apps Signaturberechtigungen gewähren, ohne dass die Apps bei der Geräteherstellung und -lieferung signiert werden müssen.

Nutzer-IDs und Dateizugriff

Bei der Installation weist Android jedem Paket eine eindeutige Linux-Nutzer-ID zu. Die Identität bleibt während der Lebensdauer des Pakets auf diesem Gerät konstant. Auf einem anderen Gerät hat dasselbe Paket möglicherweise ein anderes UID: Wichtig ist, dass jedes Paket eine eigene UID auf einer bestimmten .

Da die Sicherheitsdurchsetzung auf Prozessebene erfolgt, kann der Code von zwei Paketen normalerweise nicht im selben Prozess ausgeführt werden, da sie als unterschiedliche Linux-Nutzer ausgeführt werden müssen.

Allen von einer App gespeicherten Daten wird die User-ID dieser App zugewiesen. Normalerweise können andere Pakete nicht darauf zugreifen.

Weitere Informationen zum Sicherheitsmodell von Android finden Sie unter Sicherheit bei Android Übersicht.

Berechtigungen definieren und durchsetzen

Um Ihre eigenen Berechtigungen zu erzwingen, müssen Sie diese zuerst in Ihren AndroidManifest.xml mit einem oder mehreren <permission>-Elemente.

Namenskonvention

Das System erlaubt nicht, dass mehrere Pakete eine Berechtigung mit demselben Namen deklarieren, es sei denn, alle Pakete sind mit demselben Zertifikat signiert. Wenn ein Paket eine Berechtigung deklariert, kann das System auch keine Nutzern erlauben, andere Pakete mit demselben Berechtigungsnamen zu installieren, es sei denn, diese Pakete mit demselben Zertifikat wie das erste Paket signiert sind.

Wir empfehlen, den Berechtigungen den Paketnamen einer App voranzustellen. Verwenden Sie dazu Reverse-Domain-ähnliche Benennung, gefolgt von .permission. und eine Beschreibung der Capability, die die Berechtigung repräsentiert, SNAKE_CASE oben. Beispiel: com.example.myapp.permission.ENGAGE_HYPERSPACE.

Wenn Sie dieser Empfehlung folgen, lassen sich Namenskollisionen vermeiden und der Inhaber und die Absicht einer benutzerdefinierten Berechtigung lassen sich klar identifizieren.

Beispiel

Beispiel: Eine App, die steuern muss, welche anderen Apps eine solche App starten können, seiner Aktivitäten kann wie folgt eine Berechtigung für diesen Vorgang deklarieren:

<manifest
  xmlns:android="http://schemas.android.com/apk/res/android"
  package="com.example.myapp" >
    
    <permission
      android:name="com.example.myapp.permission.DEADLY_ACTIVITY"
      android:label="@string/permlab_deadlyActivity"
      android:description="@string/permdesc_deadlyActivity"
      android:permissionGroup="android.permission-group.COST_MONEY"
      android:protectionLevel="dangerous" />
    ...
</manifest>

Das Attribut protectionLevel ist erforderlich und teilt dem System mit, wie Nutzer über Apps informieren, für die eine Berechtigung erforderlich ist, oder darüber, welche Apps die Berechtigung haben, wie in der verlinkten Dokumentation beschrieben.

Die android:permissionGroup ist optional und dient nur dazu, dem System die Anzeige von Berechtigungen zu erleichtern. für den Nutzer. In den meisten Fällen legen Sie hier eine Standardsystemgruppe fest (in android.Manifest.permission_group aufgeführt). Sie können aber auch eine Gruppe selbst definieren, wie im folgenden Abschnitt beschrieben. Wir empfehlen die Verwendung einer vorhandenen Gruppe, da dies die Berechtigungs-UI, die dem Nutzer angezeigt wird.

Sie müssen sowohl ein Label als auch eine Beschreibung für die Berechtigung angeben. Dies sind Stringressourcen, die Nutzer sehen, wenn sie sich eine Liste der Berechtigungen (android:label) oder Details zu einer einzelnen Berechtigung (android:description) ansehen. Das Label ist kurz: Es beschreibt in wenigen Worten die Hauptfunktion, die durch die Berechtigung geschützt wird. Die Beschreibung ist ein beschreiben, was ein Inhaber mit der Berechtigung tun kann. Unsere ist eine Beschreibung aus zwei Sätzen, wobei der erste Satz Mit der Berechtigung wird der Nutzer im zweiten Satz darauf hingewiesen, die schiefgehen können, wenn einer App die Berechtigung gewährt wird.

Hier sehen Sie ein Beispiel für ein Label und eine Beschreibung für die CALL_PHONE Berechtigung:

<string name="permlab_callPhone">directly call phone numbers</string>
<string name="permdesc_callPhone">Allows the app to call non-emergency
phone numbers without your intervention. Malicious apps may cause unexpected
calls on your phone bill.</string>

Berechtigungsgruppe erstellen

Wie im vorherigen Abschnitt gezeigt, können Sie das Attribut android:permissionGroup verwenden, um dem System zu helfen, Berechtigungen für den Nutzer zu beschreiben. In den meisten Fällen legen Sie dafür eine Standard- Systemgruppe (aufgeführt in android.Manifest.permission_group) Sie können aber auch Ihre eigene Gruppe mit <permission-group>.

Das Element <permission-group> definiert ein Label für eine Reihe von Berechtigungen, sowohl für die im Manifest mit <permission>-Elementen deklarierten als auch für die an anderer Stelle deklarierten. Dies wirkt sich nur darauf aus, wie die Berechtigungen für den Nutzer gruppiert werden. Die <permission-group> nicht die Berechtigungen angibt, die zur Gruppe gehören, aber erhält die Gruppe einen Namen.

Sie können der Gruppe eine Berechtigung zuweisen, indem Sie den Gruppennamen <permission> des Elements permissionGroup .

Die <permission-tree> deklariert einen Namespace für eine Gruppe von Berechtigungen, die in Code.

Benutzerdefinierte Empfehlungen für Berechtigungen

Sie können benutzerdefinierte Berechtigungen für Ihre Apps festlegen und benutzerdefinierte Berechtigungen anfordern aus anderen Apps generieren, indem Sie <uses-permission>-Elemente definieren. Sie sollten jedoch sorgfältig abwägen, ob dies erforderlich ist.

  • Wenn Sie eine Suite von Apps entwerfen, Versuchen Sie, die Apps so zu gestalten, dass jede Berechtigung nur definiert ist, einmal. Dieser Schritt ist erforderlich, wenn nicht alle Apps mit demselben Zertifikat. Auch wenn alle Apps mit demselben Zertifikat signiert sind, Es empfiehlt sich, jede Berechtigung nur einmal zu definieren.
  • Wenn die Funktion nur für Apps verfügbar ist, die mit demselben als bereitstellende App verwenden möchten, müssen Sie möglicherweise keine benutzerdefinierten mithilfe von Signaturprüfungen. Wenn eine Ihrer Apps eine Anfrage an eine andere Ihrer Apps sendet, kann die zweite App prüfen, ob beide Apps mit demselben Zertifikat signiert sind, bevor sie der Anfrage nachkommt.

Wenn eine benutzerdefinierte Berechtigung erforderlich ist, überlegen Sie, ob nur Anwendungen vom selben Entwickler wie die App, die die Berechtigungsprüfung durchführt, z. B. bei der Implementierung einer sicheren prozessübergreifenden Kommunikation zwischen zwei Apps vom selben Entwickler. In diesem Fall sollten Sie Signaturberechtigungen. Unterschriftenberechtigungen sind für Nutzer transparent und es werden keine vom Nutzer bestätigten Berechtigungen verwendet, die für Nutzer verwirrend sein können.

Lesen Sie weiter zu:

<uses-permission>
API-Referenz für das Manifest-Tag, in dem die erforderlichen Systemberechtigungen Ihrer App deklariert werden.

Das könnte Sie auch interessieren:

Android-Sicherheit – Übersicht
Detaillierte Informationen zum Sicherheitsmodell der Android-Plattform.