Ausstehende Intents

OWASP-Kategorie: MASVS-PLATFORM: Plattforminteraktion

Übersicht

Ein PendingIntent ist eine Referenz auf ein vom System verwaltetes Token. Anwendung A kann ein PendingIntent an Anwendung B übergeben, damit Anwendung B vordefinierte Aktionen im Namen von Anwendung A ausführen kann, unabhängig davon, ob Anwendung A noch aktiv ist.

Risiko: Veränderbare ausstehende Intents

Ein PendingIntent kann veränderlich sein. Das bedeutet, dass der innere Intent, der die Aktion angibt, von Anwendung B gemäß der in der fillIn()-Dokumentation beschriebenen Logik aktualisiert werden kann. Mit anderen Worten: Die nicht ausgefüllten Felder eines PendingIntent können von einer schädlichen App geändert werden und Zugriff auf ansonsten nicht exportierte Komponenten der angreifbaren Anwendung gewähren.

Positiv beeinflussen

Die Auswirkungen dieser Sicherheitslücke variieren je nach Implementierung der anvisierten nicht exportierten Funktionen der App.

Abhilfemaßnahmen

Allgemein

Achten Sie darauf, dass Aktion, Komponente und Paket festgelegt sind, um die schwerwiegendsten Sicherheitslücken zu vermeiden:

Kotlin

val intent = Intent(intentAction)

// Or other component setting APIs e.g. setComponent, setClass
intent.setClassName(packageName, className)

PendingIntent pendingIntent =
    PendingIntent.getActivity(
        context,
        /* requestCode = */ 0,
        intent, /* flags = */ PendingIntent.FLAG_IMMUTABLE
    )

Java

Intent intent = new Intent(intentAction);

// Or other component setting APIs e.g. setComponent, setClass
intent.setClassName(packageName, className);

PendingIntent pendingIntent =
        PendingIntent.getActivity(
            getContext(),
            /* requestCode= */ 0,
            intent, /* flags= */ 0);

Flag IMMUTABLE

Wenn Ihre App auf Android 6 (API-Level 23) oder höher ausgerichtet ist, geben Sie die Veränderlichkeit an. Dies kann beispielsweise mit FLAG_IMMUTABLE erfolgen, um zu verhindern, dass leere Felder von einer schädlichen Anwendung ausgefüllt werden:

Kotlin

val pendingIntent =
    PendingIntent.getActivity(
        context,
        /* requestCode = */ 0,
        Intent(intentAction),
        PendingIntent.FLAG_IMMUTABLE)

Java

PendingIntent pendingIntent =
        PendingIntent.getActivity(
            getContext(),
            /* requestCode= */ 0,
            new Intent(intentAction),
            PendingIntent.FLAG_IMMUTABLE);

Unter Android 11 (API-Level 30) und höher müssen Sie angeben, welche Felder veränderbar sein sollen. Dadurch werden versehentliche Sicherheitslücken dieses Typs minimiert.

Ressourcen


Risiko: Ausstehende Intents wiedergeben

Ein PendingIntent kann nur dann wiederholt werden, wenn das Flag FLAG_ONE_SHOT nicht gesetzt ist. Es ist wichtig, FLAG_ONE_SHOT zu verwenden, um Wiederholungsversuche zu verhindern (Ausführen von Aktionen, die nicht wiederholbar sein sollten).

Positiv beeinflussen

Die Auswirkungen dieser Sicherheitslücke variieren je nach Implementierung der Empfängerseite der Intent-Nachricht. Eine schädliche App, die ein PendingIntent ausnutzt, das ohne Festlegen des Flags FLAG_ONE_SHOT erstellt wurde, kann den Intent erfassen und wiederverwenden, um Aktionen zu wiederholen, die nur einmal ausgeführt werden sollten.

Abhilfemaßnahmen

Für ausstehende Intents, die nicht mehrmals ausgelöst werden sollen, sollte das Flag FLAG_ONE_SHOT verwendet werden, um Replay-Angriffe zu vermeiden.

Kotlin

val pendingIntent =
      PendingIntent.getActivity(
          context,
          /* requestCode = */ 0,
          Intent(intentAction),
          PendingIntent.FLAG_IMMUTABLE or PendingIntent.FLAG_ONE_SHOT)

Java

PendingIntent pendingIntent =
        PendingIntent.getActivity(
            getContext(),
            /* requestCode= */ 0,
            new Intent(intentAction),
            PendingIntent.FLAG_IMMUTABLE | PendingIntent.FLAG_ONE_SHOT);

Ressourcen


Ressourcen