Berechtigungsbasierte Zugriffssteuerung auf exportierte Komponenten

OWASP-Kategorie: MASVS-PLATFORM: Plattforminteraktion

Übersicht

Eine Android-Berechtigung ist eine String-ID, die im Manifest der App deklariert wird, um Zugriff auf eingeschränkte Daten oder Aktionen anzufordern, die vom Android-Framework zur Laufzeit erzwungen werden.

Die Android-Berechtigungsstufen geben das potenzielle Risiko an, das mit der Berechtigung verbunden ist:

  • Normal: Berechtigungen mit geringem Risiko, die bei der Installation automatisch gewährt werden
  • Schädlich: Berechtigungen mit hohem Risiko, die den Zugriff auf vertrauliche Nutzerdaten ermöglichen könnten und eine ausdrückliche Nutzergenehmigung zur Laufzeit erfordern
  • Signatur: Wird nur für Apps gewährt, die mit demselben Zertifikat signiert sind wie die App, in der die Berechtigung erklärt wird. Wird in der Regel für System-Apps oder Interaktionen zwischen Apps desselben Entwicklers verwendet.

Sicherheitslücken im Zusammenhang mit berechtigungsbasierten Zugriffssteuerungen treten auf, wenn eine Komponente einer App (z. B. Aktivität, Empfänger, Inhaltsanbieter oder Dienst) alle folgenden Kriterien erfüllt:

  • Die Komponente ist mit keinem android:permission in der Manifest verknüpft.
  • Die Komponente führt eine sensible Aufgabe aus, für die eine Berechtigung vorhanden ist, die der Nutzer bereits genehmigt hat.
  • Die Komponente wird exportiert.
  • Die Komponente führt keine manuellen Berechtigungsprüfungen (auf Manifest- oder Codeebene) durch.

In diesem Fall kann eine schädliche App sensible Aktionen ausführen, indem sie die Berechtigungen der angreifbaren Komponente missbraucht und die Berechtigungen der angreifbaren App an die schädliche App weiterleitet.

Positiv beeinflussen

Der Export von angreifbaren Komponenten kann dazu verwendet werden, Zugriff auf vertrauliche Ressourcen zu erhalten oder vertrauliche Aktionen auszuführen. Die Auswirkungen dieses unerwünschten Verhaltens hängen vom Kontext der angreifbaren Komponente und ihren Berechtigungen ab.

Abhilfemaßnahmen

Berechtigungen für vertrauliche Aufgaben erzwingen

Wenn Sie eine Komponente mit vertraulichen Berechtigungen exportieren, müssen für alle eingehenden Anfragen dieselben Berechtigungen erforderlich sein. Die Android Studio IDE verfügt über Lint-Prüfungen für Empfänger und Dienste, um diese Sicherheitslücke zu erkennen und die erforderlichen Berechtigungen zu empfehlen.

Entwickler können Berechtigungen für eingehende Anfragen anfordern, indem sie sie entweder in der Datei Manifest deklarieren oder wie in den folgenden Beispielen auf Codeebene bei der Implementierung des Dienstes angeben.

XML

<manifest ...>
    <uses-permission android:name="android.permission.READ_CONTACTS" />

    <application ...>
        <service android:name=".MyExportService"
                 android:exported="true"
                 android:permission="android.permission.READ_CONTACTS" />

        </application>
</manifest>

Kotlin

class MyExportService : Service() {

    private val binder = MyExportBinder()

    override fun onBind(intent: Intent): IBinder? {
        // Enforce calling app has the required permission
        enforceCallingPermission(Manifest.permission.READ_CONTACTS, "Calling app doesn't have READ_CONTACTS permission.")
        // Permission is enforced, proceed with export logic
        return binder
    }

    // Inner class for your Binder implementation
    private inner class MyExportBinder : Binder() {
        // Permission is enforced, proceed with export logic
    }
}

Java

public class MyExportService extends Service {

    @Override
    public IBinder onBind(Intent intent) {
        // Enforce calling app has the required permission
        enforceCallingPermission(Manifest.permission.READ_CONTACTS, "Calling app doesn't have READ_CONTACTS permission.");

        return binder;

    }

    // Inner class for your Binder implementation
    private class MyExportBinder extends Binder {
        // Permission is enforced, proceed with export logic

    }
}

Komponente nicht exportieren

Exportieren Sie Komponenten mit Zugriff auf vertrauliche Ressourcen nur, wenn es unbedingt erforderlich ist. Dazu müssen Sie android:exported in der Datei Manifest auf false für Ihre Komponente festlegen. Ab API-Level 31 wird dieses Attribut standardmäßig auf false festgelegt.

XML

<activity
    android:name=".MyActivity"
    android:exported="false"/>

Signaturbasierte Berechtigungen anwenden

Verwenden Sie signaturbasierte Berechtigungen, wenn Sie Daten zwischen zwei Anwendungen freigeben, die Sie verwalten oder deren Eigentümer Sie sind. Für diese Berechtigungen ist keine Nutzerbestätigung erforderlich. Stattdessen wird geprüft, ob die Apps, die auf die Daten zugreifen, mit demselben Signaturschlüssel signiert sind. Diese Einrichtung bietet eine optimierte und sicherere Nutzererfahrung. Beachten Sie bei der Deklaration benutzerdefinierter Berechtigungen die entsprechenden Sicherheitsrichtlinien.

XML

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.myapp">
    <permission android:name="my_custom_permission_name"
                android:protectionLevel="signature" />

Endpunkte für einzelne Aufgaben

Implementieren Sie Ihre App gemäß dem Designprinzip Aufgabentrennung. Jeder Endpunkt sollte nur eine kleine Anzahl bestimmter Aufgaben mit bestimmten Berechtigungen ausführen. Diese gute Designpraxis ermöglicht es dem Entwickler auch, detaillierte Berechtigungen für jeden Endpunkt anzuwenden. Erstellen Sie beispielsweise keinen einzelnen Endpunkt, der sowohl für den Kalender als auch für Kontakte verwendet wird.

Ressourcen