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
Empfehlungen für dich
- Hinweis: Der Linktext wird angezeigt, wenn JavaScript deaktiviert ist.
- Intent-Weiterleitung