Fixierte Broadcasts

OWASP-Kategorie: MASVS-PLATFORM: Plattforminteraktion

Übersicht

Android-Apps und das Android-System können Streams als Messaging-System verwenden, um andere Apps über Ereignisse zu informieren, die für sie interessant sein könnten. Sticky-Broadcasts sind eine spezielle Art von Broadcast, bei der die gesendeten Intent-Objekte nach Abschluss der Übertragung im Cache verbleiben. Das System kann persistente Intents bei späteren Registrierungen von Empfängern noch einmal übertragen. Leider weist die Sticky Broadcasts API eine Reihe von Sicherheitsmängeln auf. Aus diesem Grund wurde sie in Android 5.0 (API-Level 21) eingestellt.

Jeder kann auf angepinnte Übertragungen zugreifen

Festgehaltene Übertragungen können nicht auf Empfänger mit bestimmten Berechtigungen beschränkt werden. Sie sind daher nicht für die Übertragung vertraulicher Informationen geeignet. Man könnte meinen, dass die Angabe des Namens des Anwendungspakets in der Übertragung Intent die Anzahl 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);

In diesem Beispiel erhalten nur Empfänger im Paket com.example.myapp die Absicht, wenn die Übertragung gesendet wird. Der Paketnamenfilter wird jedoch nicht angewendet, wenn der Intent aus dem Sticky-Cache noch einmal gesendet wird. Wenn Sie einen Empfänger mit der Methode registerReceiver() registrieren, werden alle Intents im Sticky-Cache, die mit dem angegebenen Filter übereinstimmen, unabhängig vom Paketnamen, in dem sich der Empfänger befindet, noch einmal an den Empfänger gesendet.

Jeder kann anhängende Übertragungen senden

Zum Senden von fixierten Übertragungen 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. Broadcastempfä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 und nicht mit Berechtigungen übertragen werden.

Jeder kann angepinnte Übertragungen ändern

Wenn eine Absicht Teil einer dauerhaften Übertragung ist, ersetzt sie alle vorherigen Instanzen mit derselben Aktion, denselben Daten, demselben Typ, derselben Kennung, derselben Klasse und denselben Kategorien im Sticky-Cache. Daher kann ein Angreifer die zusätzlichen Daten in einer Sticky Intent einer legitimen App ganz einfach überschreiben, die dann an andere Empfänger weitergesendet werden.

Mit der Methode sendStickyOrderedBroadcast() gesendete Broadcasts werden jeweils nur an einen Empfänger gesendet, damit Empfänger mit höherer Priorität die Broadcasts nutzen können, bevor sie an Empfänger mit niedrigerer Priorität gesendet werden. Wenn jeder Empfänger nacheinander ausgeführt wird, kann er ein Ergebnis an den nächsten Empfänger weitergeben, z. B. durch Aufrufen von setResultData(), oder er kann die Übertragung abbrechen, um zu verhindern, dass nachfolgende Empfänger die Übertragung empfangen. Ein Angreifer, der dauerhaft geordnete Broadcasts von einer legitimen App empfangen kann, kann einen Empfänger mit hoher Priorität erstellen, um die Broadcastergebnisdaten zu manipulieren oder Broadcasts vollständig zu löschen.

Positiv beeinflussen

Die Auswirkungen variieren je nachdem, wie Sticky-Broadcasts verwendet werden und welche Daten an die Broadcastempfänger übergeben werden. Im Allgemeinen kann die Verwendung von Sticky-Broadcasts zur Offenlegung sensibler Daten, zur Manipulation von Daten, zum unbefugten Zugriff auf die Ausführung von Aktionen in einer anderen App und zu einem Denial-of-Service-Angriff führen.

Abhilfemaßnahmen

Fest angepinnte Übertragungen sollten nicht verwendet werden. Wir empfehlen, nicht persistente 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 Namens des Anwendungspakets für die Intents festlegen, wer nicht anhängende Übertragungen empfangen kann. Wenn eine Übertragung nicht an Komponenten außerhalb einer App gesendet werden muss, verwenden Sie LiveData, das das Observer-Muster implementiert.

Weitere Informationen zum Schützen von Übertragungen findest du auf der Seite Übertragungen.