OWASP-Kategorie:MASVS-PLATFORM: Platform Interaction
Übersicht
Android-Apps und das Android-System können Broadcasts als Messaging-System verwenden, um andere Apps über Ereignisse zu informieren, die für sie von Interesse sein könnten. Fixierte Broadcasts sind eine spezielle Art von Broadcasts, bei denen die gesendeten Intent-Objekte nach Abschluss des Broadcasts im Cache verbleiben. Das System kann Sticky Intents noch einmal an später registrierte Empfänger senden. Leider weist die API für Sticky Broadcasts eine Reihe von sicherheitsrelevanten Mängeln auf. Aus diesem Grund wurde sie in Android 5.0 (API-Level 21) eingestellt.
Jeder kann auf angepinnte Broadcasts zugreifen
Sticky Broadcasts können nicht auf Empfänger mit bestimmten Berechtigungen beschränkt werden. Daher sind sie nicht für die Übertragung vertraulicher Informationen geeignet. Es könnte verlockend sein, anzunehmen, dass die Angabe des Anwendungspaketnamens im Broadcast Intent die Menge der BroadcastReceivers einschränkt:
Kotlin
val intent = Intent("com.example.NOTIFY").apply {
setPackage("com.example.myapp")
}
applicationContext.sendBroadcast(intent)
Java
Intent intent = new Intent("com.example.NOTIFY");
intent.setPackage("com.example.myapp");
getApplicationContext().sendBroadcast(intent);
Im Beispiel empfangen nur Empfänger im Paket com.example.myapp die Absicht, wenn die Broadcast-Nachricht gesendet wird. Der Paketnamensfilter wird jedoch nicht angewendet, wenn der Intent aus dem Sticky-Cache neu übertragen wird. Wenn Sie einen Receiver mit der Methode registerReceiver() registrieren, werden alle Intents im Sticky-Cache, die dem angegebenen Filter entsprechen, unabhängig vom Paketnamen, in dem sich der Receiver befindet, noch einmal an den Receiver gesendet.
Jeder kann angepinnte Broadcasts senden
Zum Senden von Sticky Broadcasts benötigt eine App nur die Berechtigung android.permission.BROADCAST_STICKY, die automatisch gewährt wird, wenn die App installiert wird. Angreifer können daher beliebige Intents an beliebige Empfänger senden und so möglicherweise unbefugten Zugriff auf eine andere App erhalten. Broadcast-Empfänger können die Absender auf diejenigen beschränken, die eine bestimmte Berechtigung haben. Dadurch kann der Empfänger jedoch keine Broadcasts aus dem Sticky-Cache empfangen, da diese nicht im Kontext der Identität einer App gesendet werden und keine Berechtigungen für den Broadcast vorhanden sind.
Jeder kann angepinnte Broadcasts bearbeiten
Wenn eine Absicht Teil eines Sticky Broadcast ist, wird jede vorherige Instanz mit derselben Aktion, denselben Daten, demselben Typ, derselben Kennung, derselben Klasse und denselben Kategorien im Sticky-Cache durch diese Absicht ersetzt. Daher kann ein Angreifer die zusätzlichen Daten in einem Sticky Intent einer legitimen App problemlos überschreiben, die dann möglicherweise an andere Empfänger weitergeleitet wird.
Übertragungen, die mit der Methode sendStickyOrderedBroadcast() gesendet werden, werden jeweils an einen Empfänger gesendet, damit Empfänger mit höherer Priorität die Übertragung empfangen können, bevor sie an Empfänger mit niedrigerer Priorität gesendet wird. Da jeder Empfänger nacheinander ausgeführt wird, kann er ein Ergebnis an den nächsten Empfänger weiterleiten, z. B. durch Aufrufen von setResultData(), oder er kann den Broadcast abbrechen, wodurch verhindert wird, dass nachfolgende Empfänger den Broadcast empfangen. Ein Angreifer, der dauerhafte geordnete Broadcasts von einer legitimen App empfangen kann, kann einen Empfänger mit hoher Priorität erstellen, um die Broadcast-Ergebnisdaten zu manipulieren oder Broadcasts vollständig zu verwerfen.
Auswirkungen
Die Auswirkungen hängen davon ab, wie Sticky Broadcasts verwendet werden und welche Daten an die Broadcast-Empfänger übergeben werden. Im Allgemeinen kann die Verwendung von Sticky Broadcasts zu einer Offenlegung sensibler Daten, Datenmanipulation, unbefugtem Zugriff zur Ausführung von Verhalten in einer anderen App und zu einem Denial-of-Service führen.
Gegenmaßnahmen
Sticky Broadcasts sollten nicht verwendet werden. Es wird empfohlen, nicht klebrige Broadcasts mit einem anderen Mechanismus wie einer lokalen Datenbank zu verwenden, um den aktuellen Wert bei Bedarf abzurufen.
Entwickler können mithilfe von Berechtigungen oder durch Festlegen des Anwendungspaketnamens für den Intent steuern, wer nicht klebrige Broadcasts empfangen kann. Wenn eine Broadcast-Nachricht nicht an Komponenten außerhalb einer App gesendet werden muss, verwenden Sie LiveData, das das Observer-Muster implementiert.
Weitere Informationen zum Sichern von Übertragungen finden Sie auf der Übersichtsseite zu Übertragungen.