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
- 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.
- Mettez à jour les applications concernées en suivant les étapes indiquées ci-dessous.
- 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 :
- Vol de fichiers sensibles ou de données système (comme des SMS) à partir de votre application
- 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é :
- ne sera envoyé à aucun composant privé de votre application, et
- 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.