Ces informations sont destinées aux développeurs d'applications présentant une faille permettant une attaque par traversée de répertoires.
Que se passe-t-il ?
Depuis le 16 janvier 2018, Google Play bloque la publication de nouvelles applications ou mises à jour présentant une faille permettant une attaque par traversée de répertoires. Veuillez consulter la notification dans la console Play. Passé les délais indiqués dans la console Play, toutes les applications présentant des failles de sécurité non résolues pourront être supprimées de Google Play.
Action requise
- Connectez-vous à la console Play et 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 et corrigez la faille.
- 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
Les implémentations d'openFile dans les exportations de ContentProviders peuvent présenter une faille si les paramètres URI entrants ne sont pas validés correctement. Une application malveillante peut fournir un URI modifié (par exemple, contenant la chaîne "/../") pour inciter votre application à retourner le ParcelFileDescriptor d'un fichier se trouvant en dehors du répertoire concerné, ce qui lui permet d'accéder à tout fichier accessible par votre application.
Deux stratégies sont recommandées pour corriger une faille permettant une attaque par traversée de répertoires dans un ContentProvider.
1. Si d'autres applications n'ont pas besoin d'accéder à votre ContentProvider
- Vous pouvez modifier la balise <provider> du ContentProvider concerné dans votre fichier manifeste pour définir android:exported="false". Cela empêchera les autres applications d'envoyer des intents au ContentProvider concerné.
- Vous pouvez également définir l'attribut android:permission en tant qu'élément permission avec android:protectionLevel="signature" pour empêcher les applications d'autres développeurs d'envoyer des intents au ContentProvider concerné.
2. Si d'autres applications ont besoin d'accéder à votre ContentProvider
Vous devez vous assurer que les données entrées dans openFile et contenant des caractères de traversée de répertoires ne risquent pas d'amener votre application à renvoyer des fichiers inattendus. Pour cela, vous pouvez vérifier le chemin d’accès canonique du fichier. Par exemple :
public ParcelFileDescriptor openFile (Uri uri, String mode)
throws FileNotFoundException {
File f = new File(DIR, uri.getLastPathSegment());
if (!f.getCanonicalPath().startsWith(DIR)) {
throw new IllegalArgumentException();
}
return ParcelFileDescriptor.open(f, ParcelFileDescriptor.MODE_READ_ONLY);
}
Avertissement : Notez que le fait d'appeler getLastPathSegment sur le paramètre Uri n'est pas une méthode sécurisée. Une application malveillante peut fournir un chemin d'URI encodé comme %2F..%2F..path%2Fto%2Fsecret.txt, de sorte que le résultat de getLastPathSegment soit /../../path/to/secret.txt. Par exemple, l'implémentation suivante est vulnérable aux attaques :
public ParcelFileDescriptor openFile(Uri uri, String mode){
File f = new File(DIR, uri.getLastPathSegment());
return ParcelFileDescriptor.open(f, ParcelFileDescriptor.MODE_READ_ONLY);
}
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". Si vous souhaitez obtenir des éclaircissements sur les étapes à suivre pour résoudre ce problème, vous pouvez contacter notre équipe d'assistance pour les développeurs.