OWASP-Kategorie:MASVS-PLATFORM: Platform Interaction
Übersicht
Ein PendingIntent ist ein Verweis 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 ermöglichen den Zugriff auf ansonsten nicht exportierte Komponenten der anfälligen Anwendung.
Auswirkungen
Die Auswirkungen dieser Sicherheitslücke variieren je nach Implementierung der nicht exportierten Zielfunktion der App.
Gegenmaßnahmen
Allgemein
Achten Sie darauf, dass Aktion, Komponente und Paket festgelegt sind, um die schlimmsten 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 nicht ausgefüllte 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 vermieden.
Ressourcen
Risiko: Wiederholung ausstehender Intents
Eine PendingIntent kann wiederholt werden, sofern das Flag FLAG_ONE_SHOT nicht gesetzt ist. Es ist wichtig, FLAG_ONE_SHOT zu verwenden, um Wiederholungsversuche zu verhindern (Aktionen auszuführen, die nicht wiederholbar sein sollten).
Auswirkungen
Die Auswirkungen dieser Sicherheitslücke variieren je nach Implementierung des Empfängers des Intents. Eine schädliche App, die einen PendingIntent ausnutzt, der ohne das Flag FLAG_ONE_SHOT erstellt wurde, könnte den Intent erfassen und wiederverwenden, um Aktionen zu wiederholen, die nur einmal ausgeführt werden sollten.
Gegenmaßnahmen
Für Pending Intents, die nicht mehrmals ausgelöst werden sollen, sollte das Flag FLAG_ONE_SHOT verwendet werden, um Wiederholungsversuche 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 Sie
- Hinweis: Linktext wird angezeigt, wenn JavaScript deaktiviert ist.
- Intent-Weiterleitung