Catégorie OWASP : MASVS-STORAGE : stockage
Présentation
Ce document aborde plusieurs problèmes liés à l'inclusion de fichiers qui partagent des mesures d'atténuation similaires. Ces problèmes concernent les failles découlant de l'accès aux fichiers dans les classes WebView. Ils vont de WebSettings
dangereux autorisant l'accès aux fichiers ou activant JavaScript à une méthode WebKit qui crée une demande de sélection de fichier. Ce document devrait vous être utile si vous recherchez des conseils pour résoudre les problèmes liés à WebView qui découlent de l'utilisation du schéma file://
, de l'accès illimité aux fichiers locaux et du script intersites.
Plus concrètement, ce document aborde les thèmes suivants :
WebSettings
est une classe contenant des méthodes qui gèrent les états des paramètres pour les WebView. Ces méthodes peuvent ouvrir des WebViews à différentes attaques qui seront décrites plus loin. Dans ce document, nous allons examiner les méthodes qui permettent d'accéder aux fichiers et le paramètre qui permet d'exécuter JavaScript :- Les méthodes
setAllowFileAccess
,setAllowFileAccessFromFileURLs
etsetAllowUniversalAccessFromFileURLs
peuvent être utilisées pour accorder l'accès aux fichiers locaux à l'aide d'une URL de schéma de fichier (file://
). Toutefois, elles peuvent être exploitées par des scripts malveillants pour accéder à des fichiers locaux arbitraires auxquels l'application a accès, tels que leur propre dossier/data/
. C'est pourquoi ces méthodes ont été signalées comme non sécurisées et ont été abandonnées dans l'API 30 au profit d'alternatives plus sûres, telles queWebViewAssetLoader
. - La méthode
setJavascriptEnabled
peut être utilisée pour activer l'exécution de JavaScript dans les WebViews. Les applications sont ainsi vulnérables aux failles XSS basées sur des fichiers. Les utilisateurs et leurs données sont exposés à des risques, en particulier lorsque les classes WebView sont configurées pour autoriser le chargement de fichiers locaux ou de contenu Web non fiable pouvant contenir du code exécutable, pour autoriser l'accès à des fichiers pouvant être créés ou modifiés par des sources externes, ou pour autoriser l'exécution de JavaScript par les classes WebView. WebChromeClient.onShowFileChooser
est une méthode appartenant au packageandroid.webkit
, qui fournit des outils de navigation Web. Cette méthode peut être utilisée pour permettre aux utilisateurs de sélectionner des fichiers dans une WebView. Toutefois, cette fonctionnalité peut être utilisée de manière abusive, car les WebViews n'appliquent aucune restriction sur le fichier sélectionné.
Impact
L'impact de l'inclusion de fichiers peut dépendre des WebSettings configurés dans WebView. Des autorisations de fichier trop larges peuvent permettre aux pirates informatiques d'accéder aux fichiers locaux et de voler des données sensibles, des informations permettant d'identifier personnellement l'utilisateur (PII) ou des données d'application privées. L'activation de l'exécution de JavaScript peut permettre aux pirates informatiques d'exécuter JavaScript dans une WebView ou sur l'appareil d'un utilisateur. Les fichiers sélectionnés à l'aide de la méthode onShowFileChooser
peuvent compromettre la sécurité des utilisateurs, car la méthode ou WebView ne peuvent pas s'assurer que la source du fichier est fiable.
Risque : accès risqué aux fichiers via file://
L'activation de setAllowFileAccess
, setAllowFileAccessFromFileURLs
et setAllowUniversalAccessFromFileURLs
peut permettre à des intents malveillants et à des requêtes WebView avec un contexte file://
d'accéder à des fichiers locaux arbitraires, y compris aux cookies WebView et aux données privées de l'application. De plus, la méthode onShowFileChooser
peut permettre aux utilisateurs de sélectionner et de télécharger des fichiers provenant de sources non fiables.
Ces méthodes peuvent toutes entraîner l'exfiltration d'informations permettant d'identifier personnellement l'utilisateur, d'identifiants de connexion ou d'autres données sensibles, en fonction de la configuration de l'application.
Stratégies d'atténuation
Valider les URL des fichiers
Si votre application nécessite d'accéder à des fichiers via des URL file://
, il est important de n'autoriser que les URL spécifiques connues pour être légitimes, en évitant les erreurs courantes.
Utiliser WebViewAssetLoader
Utilisez WebViewAssetLoader
au lieu des méthodes mentionnées. Cette méthode utilise le schéma http(s)//:
au lieu d'un schéma file://
pour accéder aux ressources du système de fichiers local et n'est pas vulnérable à l'attaque décrite.
Kotlin
val assetLoader: WebViewAssetLoader = Builder()
.addPathHandler("/assets/", AssetsPathHandler(this))
.build()
webView.setWebViewClient(object : WebViewClientCompat() {
@RequiresApi(21)
override fun shouldInterceptRequest(view: WebView?, request: WebResourceRequest): WebResourceResponse {
return assetLoader.shouldInterceptRequest(request.url)
}
@Suppress("deprecation") // for API < 21
override fun shouldInterceptRequest(view: WebView?, url: String?): WebResourceResponse {
return assetLoader.shouldInterceptRequest(Uri.parse(url))
}
})
val webViewSettings: WebSettings = webView.getSettings()
// Setting this off for security. Off by default for SDK versions >= 16.
webViewSettings.allowFileAccessFromFileURLs = false
// Off by default, deprecated for SDK versions >= 30.
webViewSettings.allowUniversalAccessFromFileURLs = false
// Keeping these off is less critical but still a good idea, especially if your app is not
// using file:// or content:// URLs.
webViewSettings.allowFileAccess = false
webViewSettings.allowContentAccess = false
// Assets are hosted under http(s)://appassets.androidplatform.net/assets/... .
// If the application's assets are in the "main/assets" folder this will read the file
// from "main/assets/www/index.html" and load it as if it were hosted on:
// https://appassets.androidplatform.net/assets/www/index.html
webView.loadUrl("https://appassets.androidplatform.net/assets/www/index.html")
Java
final WebViewAssetLoader assetLoader = new WebViewAssetLoader.Builder()
.addPathHandler("/assets/", new AssetsPathHandler(this))
.build();
webView.setWebViewClient(new WebViewClientCompat() {
@Override
@RequiresApi(21)
public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {
return assetLoader.shouldInterceptRequest(request.getUrl());
}
@Override
@SuppressWarnings("deprecation") // for API < 21
public WebResourceResponse shouldInterceptRequest(WebView view, String url) {
return assetLoader.shouldInterceptRequest(Uri.parse(url));
}
});
WebSettings webViewSettings = webView.getSettings();
// Setting this off for security. Off by default for SDK versions >= 16.
webViewSettings.setAllowFileAccessFromFileURLs(false);
// Off by default, deprecated for SDK versions >= 30.
webViewSettings.setAllowUniversalAccessFromFileURLs(false);
// Keeping these off is less critical but still a good idea, especially if your app is not
// using file:// or content:// URLs.
webViewSettings.setAllowFileAccess(false);
webViewSettings.setAllowContentAccess(false);
// Assets are hosted under http(s)://appassets.androidplatform.net/assets/... .
// If the application's assets are in the "main/assets" folder this will read the file
// from "main/assets/www/index.html" and load it as if it were hosted on:
// https://appassets.androidplatform.net/assets/www/index.html
webview.loadUrl("https://appassets.androidplatform.net/assets/www/index.html");
Désactiver les méthodes WebSettings dangereuses
Les valeurs des méthodes setAllowFileAccess()
, setAllowFileAccessFromFileURLs()
et setAllowUniversalAccessFromFileURLs()
sont définies par défaut sur TRUE
au niveau d'API 29 et inférieur, et sur FALSE
au niveau d'API 30 et supérieur.
Si vous devez configurer d'autres WebSettings
, il est préférable de désactiver explicitement ces méthodes, en particulier pour les applications ciblant des niveaux d'API inférieurs ou égaux à 29.
Risque : XSS basé sur des fichiers
Si la méthode setJavacriptEnabled
est définie sur TRUE
, JavaScript peut être exécuté dans une WebView. Combiné à l'accès aux fichiers activé comme indiqué précédemment, cela permet d'effectuer des attaques XSS basées sur des fichiers en exécutant du code dans des fichiers arbitraires ou des sites Web malveillants ouverts dans la WebView.
Stratégies d'atténuation
Empêcher les classes WebView de charger des fichiers locaux
Comme pour le risque précédent, vous pouvez éviter les attaques XSS basées sur des fichiers si setAllowFileAccess()
, setAllowFileAccessFromFileURLs()
et setAllowUniversalAccessFromFileURLs()
sont définis sur FALSE
.
Empêcher les WebView d'exécuter JavaScript
Définissez la méthode setJavascriptEnabled
sur FALSE
afin que JavaScript ne puisse pas être exécuté dans les WebViews.
S'assurer que les classes WebView ne chargent pas de contenu non approuvé
Il est parfois nécessaire d'activer ces paramètres dans les WebViews. Dans ce cas, il est important de s'assurer que seul le contenu de confiance est chargé. Limiter l'exécution de JavaScript à ce que vous contrôlez et interdire le JavaScript arbitraire est un bon moyen de s'assurer que le contenu est fiable. Sinon, empêcher le chargement du trafic en texte clair garantit que les classes WebView avec des paramètres dangereux ne peuvent au moins pas charger d'URL HTTP. Pour ce faire, vous pouvez utiliser le fichier manifeste en définissant android:usesCleartextTraffic
sur False
ou en définissant un Network Security Config
qui interdit le trafic HTTP.
Ressources
- Page de référence de l'API setAllowUniversalAccessFromFileURLs
- Page de référence de l'API setAllowFileAccessFromFileURLs
- Page de référence de l'API WebViewAssetLoader
- Documentation CodeQL
- Blog Oversecured
- Page de référence onShowFileChooser