Webview Attacks
Last updated
Last updated
Un aspect critique du développement Android implique la gestion correcte des WebViews. Ce guide met en évidence les configurations clés et les pratiques de sécurité pour atténuer les risques associés à l'utilisation de WebView.
Par défaut, les WebViews permettent l'accès aux fichiers. Cette fonctionnalité est contrôlée par la méthode setAllowFileAccess()
, disponible depuis Android API niveau 3 (Cupcake 1.5). Les applications avec l'autorisation android.permission.READ_EXTERNAL_STORAGE peuvent lire des fichiers depuis le stockage externe en utilisant un schéma d'URL de fichier (file://chemin/vers/fichier
).
Accès universel à partir d'URL de fichier : Cette fonctionnalité obsolète permettait des requêtes entre origines à partir d'URL de fichier, posant un risque de sécurité important en raison des attaques potentielles de type XSS. Le paramètre par défaut est désactivé (false
) pour les applications ciblant Android Jelly Bean et plus récent.
Pour vérifier ce paramètre, utilisez getAllowUniversalAccessFromFileURLs()
.
Pour modifier ce paramètre, utilisez setAllowUniversalAccessFromFileURLs(boolean)
.
Accès aux fichiers à partir d'URL de fichier : Cette fonctionnalité, également obsolète, contrôlait l'accès au contenu à partir d'autres URL de schéma de fichier. Comme l'accès universel, son paramètre par défaut est désactivé pour une sécurité renforcée.
Utilisez getAllowFileAccessFromFileURLs()
pour vérifier et setAllowFileAccessFromFileURLs(boolean)
pour définir.
Pour désactiver l'accès au système de fichiers tout en accédant toujours aux ressources et aux actifs, la méthode setAllowFileAccess()
est utilisée. Avec Android R et supérieur, le paramètre par défaut est false
.
Vérifiez avec getAllowFileAccess()
.
Activez ou désactivez avec setAllowFileAccess(boolean)
.
La classe WebViewAssetLoader est l'approche moderne pour charger des fichiers locaux. Elle utilise des URL http(s) pour accéder aux ressources et aux actifs locaux, se conformant à la politique Same-Origin, facilitant ainsi la gestion de CORS.
Il s'agit d'une fonction courante utilisée pour charger des URL arbitraires dans un webview :
Bien sûr, un attaquant potentiel ne devrait jamais pouvoir contrôler l'URL qu'une application va charger.
JavaScript : Désactivé par défaut dans les WebViews, il peut être activé via setJavaScriptEnabled()
. Il est conseillé de faire preuve de prudence car activer JavaScript sans les protections appropriées peut introduire des vulnérabilités de sécurité.
Intent Scheme : Les WebViews peuvent gérer le schéma intent
, ce qui peut potentiellement conduire à des exploits s'ils ne sont pas gérés avec soin. Une vulnérabilité exemple impliquait un paramètre WebView exposé "support_url" qui pouvait être exploité pour exécuter des attaques de script entre sites (XSS).
Exemple d'exploitation en utilisant adb:
Une fonctionnalité est fournie par Android qui permet à JavaScript dans un WebView d'invoquer des fonctions d'application Android natives. Cela est réalisé en utilisant la méthode addJavascriptInterface
, qui intègre JavaScript avec les fonctionnalités natives d'Android, appelé un pont JavaScript WebView. Il est conseillé de faire preuve de prudence car cette méthode permet à toutes les pages dans le WebView d'accéder à l'objet Interface JavaScript enregistré, ce qui pose un risque de sécurité si des informations sensibles sont exposées via ces interfaces.
Une prudence extrême est requise pour les applications ciblant les versions d'Android inférieures à 4.2 en raison d'une vulnérabilité permettant l'exécution de code à distance via JavaScript malveillant, exploitant la réflexion.
Les interfaces JavaScript peuvent interagir avec le code natif, comme le montrent les exemples où une méthode de classe est exposée à JavaScript:
JavaScript Bridge est activé en ajoutant une interface à la WebView :
Potentiel d'exploitation via JavaScript, par exemple, via une attaque XSS, permet d'appeler des méthodes Java exposées :
Pour atténuer les risques, limitez l'utilisation du pont JavaScript au code livré avec l'APK et empêchez le chargement de JavaScript à partir de sources distantes. Pour les anciens appareils, définissez le niveau API minimum à 17.
Une méthode documentée permet d'atteindre une RCE par réflexion en exécutant une charge utile spécifique. Cependant, l'annotation @JavascriptInterface
empêche l'accès non autorisé aux méthodes, limitant la surface d'attaque.
Le débogage à distance est possible avec Chrome Developer Tools, permettant l'interaction et l'exécution arbitraire de JavaScript dans le contenu de WebView.
Le débogage à distance peut être activé pour tous les WebViews dans une application en :
Pour activer conditionnellement le débogage en fonction de l'état de débogage de l'application :
Démontre l'exfiltration de fichiers arbitraires en utilisant un XMLHttpRequest :