Qu’est-ce qu’un Deep Link Android ?
Les Deep Links Android permettent à une application mobile d’ouvrir directement une page ou une fonctionnalité interne depuis un lien web.
Par exemple :
myapp://produit/123peut ouvrir directement l’activité “produit 123” dans l’application myapp.myapp://auth?code=xyzpeut servir à gérer une redirection OAuth après connexion.
Cette fonctionnalité permet d’offrir une expérience fluide à l’utilisateur :
L’utilisateur clique sur un lien dans le navigateur → l’app s’ouvre directement.
On retrouve les deep links dans des cas comme l’authentification OAuth, les liens d’invitation, le suivi de colis, etc.
Cependant, si les deep links sont mal configurés, ils peuvent devenir une porte d’entrée pour des attaques.
Cas concret rencontré chez un client
Lors d’un audit, nous avons trouvé une application Android qui utilisait l’authentification OAuth via Microsoft.
Le scénario normal :
L’utilisateur lance l’app.
Il est redirigé vers la page de connexion Microsoft.
Après login, Microsoft renvoie vers : `
myapp://auth?code=XXXX`- L’app récupère le code, demande un jeton d’accès et connecte l’utilisateur.
C’est un scénario courant d’authentification via des fournisseurs tiers. Voyons maintenant comment il peut être exploité.
Tout d’abord, analysons le AndroidManifest.xml pour découvrir l’intent permettant cette fonctionnalité :
L’activité encadrée ci-dessus permet la réception du code OAuth généré par le provider Microsoft.
Un attaquant pourrait utiliser le même intent-filter et déclarer pouvoir réceptionner les URL deep link contenant myapp://msauth. Exemple :
Maintenant que l’application légitime et l’application malveillante sont toutes deux installées, un utilisateur souhaitant se connecter via OAuth verrait le comportement suivant :
Maintenant que nous avons capturé le code, l’attaquant peut appeler le serveur OAuth pour obtenir un access token et accéder aux données du compte de l’utilisateur.
Mitigation et bonnes pratiques de sécurité pour les Deep Links
La solution consiste à transformer les deep links classiques en App Links, qui garantissent qu’une seule application valide pourra gérer le lien.
Concrètement :
Utiliser App Links
Définir
android:autoVerify="true"dans leintent-filter.Utiliser uniquement les schémas https.
Héberger le fichier
.well-known/assetlinks.jsonsur le domaine associé.
Exemple de intent-filter sécurisé :
Fichier assetlinks.json attendu sur :
https://www.exemple.com/.well-known/assetlinks.json
Exemple du contenu du fichier :
[{
"relation": ["delegate_permission/common.handle_all_urls"],
"target": {
"namespace": "android_app",
"package_name": "com.example.myapp",
"sha256_cert_fingerprints": ["14:6D:E9:83:C5:73:06:50:D8:EE:B9:95:2F:34:FC:64:16:A0:83:42:E6:1D:BE:A8:8A:04:96:B2:3F:CF:44:E5"]
}
}]
Android vérifiera automatiquement :
Le domaine web → correspond au
intent-filterLe package + certificat → correspond à l’application légitime
Ainsi, seule l’application validée pourra recevoir la redirection, empêchant toute application tierce de l’intercepter.



