Catégorie OWASP : MASVS-STORAGE : stockage
Présentation
Ce document traite de plusieurs problèmes liés à l'inclusion de fichiers qui partagent des mesures d'atténuation similaires. Ces problèmes portent sur les failles liées à l'accès aux fichiers dans les WebViews. Ils vont de WebSettings
dangereux permettant l'accès aux fichiers ou l'activation de JavaScript à une méthode WebKit qui crée une requête de sélection de fichiers. Ce document devrait vous aider si vous recherchez des conseils pour résoudre les problèmes dans WebView liés à l'utilisation du schéma file://
, à l'accès illimité aux fichiers locaux et au script intersites.
Plus précisément, ce document traite des sujets suivants:
WebSettings
est une classe contenant des méthodes qui gèrent les états des paramètres pour les WebViews. Ces méthodes peuvent ouvrir les WebViews à différentes attaques, qui seront décrites plus tard. Dans ce document, nous allons examiner les méthodes concernant l'accès aux fichiers et le paramètre permettant d'exécuter JavaScript:- Les méthodes
setAllowFileAccess
,setAllowFileAccessFromFileURLs
etsetAllowUniversalAccessFromFileURLs
peuvent être utilisées pour accorder l'accès à des 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 son propre dossier/data/
. Pour cette raison, 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
permet d'activer l'exécution de JavaScript dans les WebViews. Les applications sont ainsi vulnérables aux XSS basés sur les fichiers. En particulier lorsqu'elles sont configurées pour autoriser le chargement de fichiers locaux ou de contenus Web non approuvés 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 les WebViews à exécuter JavaScript, les utilisateurs et leurs données sont exposés à des risques. 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 pas de restrictions 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 à des pirates informatiques d'accéder aux fichiers locaux et de dérober 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 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 peut pas s'assurer que la source de fichier est fiable.
Risque: accès risqué aux fichiers via file://
L'activation de setAllowFileAccess
, setAllowFileAccessFromFileURLs
et setAllowUniversalAccessFromFileURLs
peut autoriser les intents et les requêtes WebView malveillants avec un contexte file://
à accéder à des fichiers locaux arbitraires, y compris aux cookies WebView et aux données privées de l'application. De plus, l'utilisation de la méthode onShowFileChooser
peut permettre aux utilisateurs de sélectionner et de télécharger des fichiers à partir de sources non approuvées.
Selon la configuration de l'application, ces méthodes peuvent toutes entraîner l'exfiltration d'informations permettant d'identifier l'utilisateur, d'identifiants de connexion ou d'autres données sensibles.
Stratégies d'atténuation
Valider les URL de fichiers
Si votre application nécessite l'accès à des fichiers via des URL file://
, il est important de n'ajouter à la liste d'autorisation que des URL spécifiques connues pour être légitimes, afin d'éviter 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 éléments 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 versions antérieures, et sur FALSE
au niveau d'API 30 et versions ultérieures.
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 les fichiers
Définir la méthode setJavacriptEnabled
sur TRUE
permet d'exécuter JavaScript dans une WebView. En combinaison avec l'accès aux fichiers activé comme indiqué précédemment, le XSS basé sur les fichiers est possible via l'exécution de code dans des fichiers arbitraires ou des sites Web malveillants ouverts dans la WebView.
Stratégies d'atténuation
Empêcher les WebView de charger des fichiers locaux
Comme pour le risque précédent, les attaques XSS basées sur des fichiers peuvent être évitées si setAllowFileAccess()
, setAllowFileAccessFromFileURLs()
et setAllowUniversalAccessFromFileURLs()
sont définis sur FALSE
.
Empêcher les WebViews d'exécuter JavaScript
Définissez la méthode setJavascriptEnabled
sur FALSE
afin que JavaScript ne puisse pas être exécuté dans les WebViews.
Assurez-vous que les 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 fiable est chargé. Limiter l'exécution de JavaScript à ce que vous contrôlez et interdire le code JavaScript arbitraire est un bon moyen de s'assurer que le contenu est fiable. Sinon, en empêchant le chargement du trafic en texte clair, vous vous assurez que les WebView avec des paramètres dangereux ne peuvent 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 surprotégé
- sur la page de référence onShowFileChooser