OWASP-Kategorie:MASVS-STORAGE: Storage
Übersicht
In diesem Dokument werden mehrere Probleme im Zusammenhang mit dem Einbinden von Dateien behandelt, für die ähnliche Maßnahmen zur Risikominderung gelten. Diese Probleme beziehen sich auf Sicherheitslücken, die durch den Zugriff auf Dateien in WebViews entstehen. Sie reichen von gefährlichen WebSettings
, die den Dateizugriff ermöglichen oder JavaScript aktivieren, bis hin zu einer WebKit-Methode, die eine Dateiauswahlanfrage erstellt. Dieses Dokument kann hilfreich sein, wenn Sie Anleitungen zur Behebung von Problemen in WebView suchen, die durch die Verwendung des Schemas file://
, den uneingeschränkten Zugriff auf lokale Dateien und Cross-Site-Scripting entstehen.
Konkret werden in diesem Dokument die folgenden Themen behandelt:
WebSettings
ist eine Klasse, die Methoden zur Verwaltung der Einstellungsstatus für WebViews enthält. Diese Methoden können WebViews für verschiedene Angriffe öffnen, die später beschrieben werden. In diesem Dokument werden die Methoden beschrieben, mit denen auf Dateien zugegriffen werden kann, sowie die Einstellung, mit der JavaScript ausgeführt werden kann:- Die Methoden
setAllowFileAccess
,setAllowFileAccessFromFileURLs
undsetAllowUniversalAccessFromFileURLs
können verwendet werden, um mit einer URL des Dateischemas (file://
) Zugriff auf lokale Dateien zu gewähren. Sie können jedoch von schädlichen Skripts ausgenutzt werden, um auf beliebige lokale Dateien zuzugreifen, auf die die Anwendung Zugriff hat, z. B. auf den eigenen/data/
-Ordner. Aus diesem Grund wurden diese Methoden als unsicher gekennzeichnet und in API 30 zugunsten sichererer Alternativen wieWebViewAssetLoader
eingestellt. - Mit der Methode
setJavascriptEnabled
kann die Ausführung von JavaScript in WebViews aktiviert werden. Dadurch sind Anwendungen anfällig für File-based XSS. Insbesondere wenn sie so konfiguriert sind, dass lokale Dateien oder nicht vertrauenswürdige Webinhalte geladen werden können, die ausführbaren Code enthalten können, dass der Zugriff auf Dateien erlaubt ist, die von externen Quellen erstellt oder geändert werden können, oder dass WebViews JavaScript ausführen dürfen, sind Nutzer und ihre Daten gefährdet. WebChromeClient.onShowFileChooser
ist eine Methode, die zum Paketandroid.webkit
gehört, das Tools zum Surfen im Web bietet. Mit dieser Methode können Nutzer Dateien in einem WebView auswählen. Diese Funktion kann jedoch missbraucht werden, da in WebViews keine Einschränkungen für die Auswahl von Dateien gelten.
Positiv beeinflussen
Die Auswirkungen des Einbindens von Dateien können davon abhängen, welche WebSettings in WebView konfiguriert sind. Zu weit gefasste Dateiberechtigungen können es Angreifern ermöglichen, auf lokale Dateien zuzugreifen und vertrauliche Daten, personenbezogene Daten oder private App-Daten zu stehlen. Wenn die Ausführung von JavaScript aktiviert ist, können Angreifer JavaScript in einer WebView oder auf dem Gerät eines Nutzers ausführen. Dateien, die mit der onShowFileChooser
-Methode ausgewählt werden, können die Nutzersicherheit gefährden, da die Methode oder WebView nicht sicherstellen kann, dass die Dateiquelle vertrauenswürdig ist.
Risiko: Riskantes Zugreifen auf Dateien über „file://“
Wenn setAllowFileAccess
, setAllowFileAccessFromFileURLs
und setAllowUniversalAccessFromFileURLs
aktiviert sind, können böswillige Intents und WebView-Anfragen mit einem file://
-Kontext auf beliebige lokale Dateien zugreifen, einschließlich WebView-Cookies und privaten App-Daten. Außerdem können Nutzer mit der onShowFileChooser
-Methode Dateien aus nicht vertrauenswürdigen Quellen auswählen und herunterladen.
Diese Methoden können je nach Anwendungskonfiguration alle zum Exfiltrieren von personenbezogenen Daten, Anmeldedaten oder anderen vertraulichen Daten führen.
Maßnahmen zur Risikominderung
Datei-URLs validieren
Wenn Ihre App über file://
-URLs auf Dateien zugreifen muss, ist es wichtig, nur bestimmte URLs auf die Zulassungsliste zu setzen, die als legitim bekannt sind, und häufige Fehler zu vermeiden.
WebViewAssetLoader verwenden
Verwenden Sie WebViewAssetLoader
anstelle der genannten Methoden. Bei dieser Methode wird das http(s)//:
-Schema anstelle eines file://
-Schemas verwendet, um auf lokale Dateisystem-Assets zuzugreifen. Sie ist daher nicht anfällig für den beschriebenen Angriff.
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");
Gefährliche WebSettings-Methoden deaktivieren
Die Werte der Methoden setAllowFileAccess()
, setAllowFileAccessFromFileURLs()
und setAllowUniversalAccessFromFileURLs()
sind im API-Level 29 und niedriger standardmäßig auf TRUE
und im API-Level 30 und höher auf FALSE
festgelegt.
Wenn andere WebSettings
konfiguriert werden müssen, sollten Sie diese Methoden explizit deaktivieren, insbesondere bei Apps, die auf API-Ebenen unter oder gleich 29 ausgerichtet sind.
Risiko: File-based Cross-Site Scripting
Wenn die Methode setJavacriptEnabled
auf TRUE
gesetzt ist, kann JavaScript in einer WebView ausgeführt werden. In Kombination mit dem zuvor beschriebenen aktivierten Dateizugriff ist dateibasierte XSS durch die Ausführung von Code in beliebigen Dateien oder schädlichen Websites, die in der WebView geöffnet werden, möglich.
Maßnahmen zur Risikominderung
Verhindern, dass WebViews lokale Dateien laden
Wie beim vorherigen Risiko kann File-based Cross-Site Scripting vermieden werden, wenn setAllowFileAccess()
, setAllowFileAccessFromFileURLs()
und setAllowUniversalAccessFromFileURLs()
auf FALSE
gesetzt sind.
Verhindern, dass WebViews JavaScript ausführen
Setzen Sie die Methode setJavascriptEnabled
auf FALSE
, damit JavaScript nicht in WebViews ausgeführt werden kann.
Sicherstellen, dass WebViews keine nicht vertrauenswürdigen Inhalte laden
Manchmal ist es erforderlich, diese Einstellungen in WebViews zu aktivieren. In diesem Fall ist es wichtig, dass nur vertrauenswürdige Inhalte geladen werden. Wenn Sie die Ausführung von JavaScript auf das beschränken, was Sie kontrollieren, und beliebiges JavaScript nicht zulassen, können Sie sicherstellen, dass Inhalte vertrauenswürdig sind. Andernfalls wird durch das Verhindern des Ladens von Klartext-Traffic dafür gesorgt, dass WebViews mit gefährlichen Einstellungen zumindest keine HTTP-URLs laden können. Dies kann entweder über das Manifest erfolgen, indem android:usesCleartextTraffic
auf False
gesetzt wird, oder indem eine Network Security Config
festgelegt wird, die HTTP-Traffic blockiert.
Ressourcen
- Referenzseite für die API „setAllowUniversalAccessFromFileURLs“
- API-Referenzseite für setAllowFileAccessFromFileURLs
- API-Referenzseite für WebViewAssetLoader
- CodeQL-Dokumentation
- Blog zum Thema „Übermäßige Sicherung“
- Referenzseite zu „onShowFileChooser“