Résoudre les failles liées à la redirection des intents

Ces informations sont destinées aux développeurs d'applications présentant une faille liée à la redirection des intents.

Que se passe-t-il ?

Une ou plusieurs de vos applications présentent une faille liée à la redirection des intents, qui peut permettre à des applications malveillantes d'accéder à des composants ou des fichiers d'application privés. Veuillez suivre les étapes détaillées ci-dessous pour résoudre le problème dans vos applications. Passé les délais indiqués dans la Play Console, toutes les applications présentant des failles de sécurité non résolues seront supprimées de Google Play.

Action requise​

  1. Connectez-vous à la Play Console, puis accédez à la section "Alertes" pour savoir quelles sont les applications concernées et connaître les délais à respecter pour résoudre ces problèmes.
  2. Mettez à jour les applications concernées en suivant les étapes indiquées ci-dessous.
  3. Envoyez les versions mises à jour des applications concernées.

Votre application sera à nouveau examinée. Le processus peut durer plusieurs heures. Si votre application est approuvée et publiée, aucune autre action de votre part n'est requise. Si l'application n'est pas approuvée, sa nouvelle version ne sera pas publiée et vous recevrez une notification par e-mail.

Informations supplémentaires

Utiliser un intent non approuvé pour lancer un composant (par exemple, en appelant startActivity) ou pour renvoyer des données (par exemple, en appelant setResult) est dangereux et peut entraîner les problèmes suivants, causés par des applications malveillantes : 

  1. Vol de fichiers sensibles ou de données système (comme des SMS) à partir de votre application
  2. Lancement des composants privés de votre application avec des arguments empoisonnés

Il est important que votre application n'appelle pas startActivity, startService, sendBroadcast ni setResult sur des intents peu fiables non validés ou rectifiés au préalable.

Nous vous recommandons de corriger cette faille en appliquant l'une des méthodes suivantes :

Option 1 : Faites en sorte que le composant d'application à partir duquel l'intent extrait est redirigé reste privé

Si le composant d'application concerné n'a pas besoin de recevoir les intents d'autres applications, vous pouvez faire en sorte qu'il reste privé en ajoutant android:exported="false" à votre fichier manifeste.

Option 2 : Vérifiez que l'intent extrait provient d'une source fiable

Vous pouvez utiliser des méthodes telles que getCallingActivity pour vérifier que l'activité d'origine est fiable. Par exemple :

 // vérifier que l'activité d'origine provient d'un package vérifié
 if (getCallingActivity().getPackageName().equals(“known”)) {
   Intent intent = getIntent();
   // extraire l'intent imbriqué
   Intent forward = (Intent) intent.getParcelableExtra(“key”);
   // rediriger l'intent imbriqué
   startActivity(forward);
 }

Remarque :

  • Pour éviter la faille, vous ne devez pas vous contenter de vérifier que getCallingActivity() renvoie une valeur non nulle. Les applications malveillantes peuvent fournir une valeur nulle pour cette fonction.
  • Dans le cas de l'API Google Play Services SMS Retriever Auth, la protection d'un broadcast receiver avec SEND_PERMISSION permet de garantir que l'intent provient des Services Play.

Option 3 : Vérifiez que l'intent à rediriger n'est pas dangereux

Vous devez vérifier que l'intent redirigé :

  1. ne sera envoyé à aucun composant privé de votre application, et
  2. ne sera pas envoyé au composant d'une application externe. Si la redirection est destinée à cibler une application externe, assurez-vous que l'intent n'accorde pas d'autorisation URI à l'un des fournisseurs de contenu privés de votre application ni aux données système.

Les applications peuvent utiliser des méthodes telles que resolveActivity pour vérifier quel composant servira à gérer l'intent avant de le rediriger. Par exemple :

 Intent intent = getIntent();
 // extraire l'intent imbriqué
 Intent forward = (Intent) intent.getParcelableExtra(“key”);
 // récupérer le nom du composant
 ComponentName name = forward.resolveActivity(getPackageManager());
 // vérifier que le nom du package et le nom de la classe sont ceux prévus
 if (name.getPackageName().equals(“safe_package”) &&
     name.getClassName().equals(“safe_class”)) {
   // rediriger l'intent imbriqué
   startActivity(forward);
 }

Les applications peuvent utiliser des méthodes telles que getFlags pour vérifier si un intent accorde une autorisation URI. Exemple :

 // extraire l'intent imbriqué
 Intent forward = (Intent) intent.getParcelableExtra(“key”);
 // récupérer les indicateurs
 int flags = forward.getFlags();
 // vérifier que l'intent imbriqué n'accorde aucune autorisation URI
 if ((flags & Intent.FLAG_GRANT_READ_URI_PERMISSION == 0) &&
     (flags & Intent.FLAG_GRANT_WRITE_URI_PERMISSION == 0)) {
   // rediriger l'intent imbriqué
   startActivity(forward);
 }

Les applications peuvent également supprimer les autorisations URI accordées, à l'aide de la méthode removeFlags. Exemple :

 // intent peu fiable
 Intent intent = getIntent();
 // supprimer les autorisations d'octroi d'URI dans l'intent peu fiable
 intent.removeFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
 intent.removeFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
 // transmettre l'intent peu fiable
 setResult(intent);

Comprendre les alertes et choisir une option de prévention 

L'alerte de la Play Console indique où votre application appelle startActivity, startActivityForResult, startService, sendBroadcast ou setResult à l'aide d'un intent peu fiable. Pour déterminer l'option de prévention qui vous convient le mieux, retracez l'historique de la faille et examinez les appelants de méthodes pour déterminer l'origine de l'intent peu fiable. Par exemple, pour l'option 1, remontez l'historique de la faille pour déterminer le composant à rendre privé.

Nous sommes là pour vous aider

Si vous avez des questions techniques sur cette faille, vous pouvez publier un message sur le site Stack Overflow en utilisant le tag "android-security". Pour obtenir des éclaircissements sur la procédure à suivre pour résoudre ce problème, vous pouvez contacter notre équipe d'assistance aux développeurs.

Ces informations vous-ont elles été utiles ?

Comment pouvons-nous l'améliorer ?
false
Menu principal
7918869560914816016
true
Rechercher dans le centre d'aide
true
true
true
true
true
5016068
false
false