Annonces persistantes

Catégorie OWASP : MASVS-PLATFORM : interaction avec la plate-forme

Présentation

Les applications Android et le système Android peuvent utiliser des annonces comme système de messagerie pour avertir d'autres applications d'événements susceptibles de les intéresser. Les annonces persistantes sont un type spécial d'annonce pour lequel les objets d'intent envoyés restent dans le cache une fois l'annonce terminée. Le système peut retransmettre les intents persistants aux enregistrements ultérieurs de destinataires. Malheureusement, comme l'API d'annonces persistantes présente de nombreux défauts de sécurité, elle a été abandonnée dans Android 5.0 (niveau d'API 21).

Tout le monde peut accéder aux annonces persistantes

Les annonces persistantes ne peuvent pas être limitées à des destinataires disposant de certaines autorisations. Par conséquent, elles ne sont pas adaptées à la diffusion d'informations sensibles. Il peut être tentant de penser que la spécification du nom du package d'application au niveau de l'Intent de l'annonce limite l'ensemble des BroadcastReceivers :

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);

Dans cet exemple, seuls les destinataires du package com.example.myapp reçoivent l'intent lorsque l'annonce est envoyée. Toutefois, le filtre de nom de package n'est pas appliqué lorsque l'intent est rediffusé à partir du cache persistant. Lors de l'enregistrement d'un destinataire à l'aide de la méthode registerReceiver(), tous les intents du cache persistant correspondant au filtre spécifié sont retransmis à ce destinataire, quel que soit le nom de son package.

Tout le monde peut envoyer des annonces persistantes

Pour envoyer des annonces persistantes, une application ne nécessite que l'autorisation android.permission.BROADCAST_STICKY, qui est accordée automatiquement lors de l'installation de l'application. Par conséquent, les pirates informatiques peuvent envoyer n'importe quel intent à n'importe quel destinataire, ce qui peut engendrer un accès non autorisé à une autre application. Les broadcast receivers peuvent limiter les expéditeurs à ceux qui détiennent une autorisation spécifique. Cependant, ce faisant, le destinataire ne peut pas recevoir les annonces du cache persistant, car elles ne sont pas envoyées dans le contexte de l'identité d'une application et ne sont pas diffusées en fonction d'autorisations données.

Tout le monde peut modifier les annonces persistantes

Lorsqu'un intent fait partie d'une annonce persistante, il remplace toute instance précédente ayant l'action, les données, le type, l'identifiant, la classe et les catégories identiques dans le cache persistant. Par conséquent, un pirate informatique peut rapidement écraser les données supplémentaires dans un intent persistant à partir d'une application légitime, qui pourra ensuite être rediffusé à d'autres destinataires.

Les annonces envoyées à l'aide de la méthode sendStickyOrderedBroadcast() sont transmises à un destinataire à la fois. Les destinataires de priorité supérieure peuvent ainsi consommer l'annonce avant qu'elle ne soit envoyée aux destinataires de priorité inférieure. Chaque destinataire peut propager un résultat au destinataire suivant, par exemple en appelant setResultData(), ou peut annuler l'annonce, ce qui empêchera les destinataires suivants de la recevoir. Un pirate informatique qui reçoit des annonces ordonnées persistantes depuis une application légitime peut créer un destinataire de priorité élevée pour altérer les données de résultat des annonces ou pour les abandonner complètement.

Impact

L'impact varie en fonction du mode d'utilisation des annonces persistantes et des données transmises aux broadcast receivers. De manière générale, l'utilisation d'annonces persistantes peut entraîner une exposition des données sensibles, la falsification des données, un accès non autorisé à l'exécution d'un comportement dans une autre application, ainsi qu'un déni de service.

Stratégies d'atténuation

Nous vous conseillons de ne pas recourir aux annonces persistantes. Préférez des annonces non persistantes qui reposent sur un autre mécanisme, tel qu'une base de données locale, pour récupérer la valeur actuelle chaque fois que vous le souhaitez.

Les développeurs peuvent contrôler qui peut recevoir des annonces non persistantes à l'aide d'autorisations ou en définissant le nom du package d'application au niveau de l'intent. De plus, si une annonce n'a pas besoin d'être envoyée à des composants externes à une application, utilisez LiveData, qui implémente le modèle d'observateur.

Pour découvrir comment sécuriser des annonces, consultez la page de présentation des annonces.