OWASP-Kategorie: MASVS-STORAGE: Storage
Übersicht
In diesem Dokument werden mehrere Probleme im Zusammenhang mit der Dateieinbindung behandelt, für die ähnliche Maßnahmen zur Risikominimierung 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 Dateiauswahl
anfordert. 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:
WebSettingsist eine Klasse mit Methoden, die die Einstellungswerte für WebViews verwalten. Diese Methoden können WebViews für verschiedene Angriffe öffnen, die später beschrieben werden. In diesem Dokument werden die Methoden behandelt, die sich auf den Zugriff auf Dateien beziehen, sowie die Einstellung, mit der JavaScript ausgeführt werden kann:- Mit den Methoden
setAllowFileAccess,setAllowFileAccessFromFileURLsundsetAllowUniversalAccessFromFileURLskann der Zugriff auf lokale Dateien über eine URL mit dem Dateischema (file://) gewährt werden. 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 Ordner/data/. Aus diesem Grund wurden diese Methoden als unsicher gekennzeichnet und in API 30 zugunsten sichererer Alternativen wieWebViewAssetLoaderverworfen. - Mit der
setJavascriptEnabledMethode kann die Ausführung von JavaScript in WebViews aktiviert werden. Dadurch sind Anwendungen für dateibasiertes XSS anfällig. Insbesondere wenn die Konfiguration das Laden lokaler Dateien oder nicht vertrauenswürdiger Webinhalte zulässt, die ausführbaren Code enthalten können, den Zugriff auf Dateien ermöglicht, die von externen Quellen erstellt oder geändert werden können, oder WebViews die Ausführung von JavaScript erlaubt, werden Nutzer und ihre Daten gefährdet. WebChromeClient.onShowFileChooserist eine Methode des Paketsandroid.webkit, das Webbrowser-Tools bereitstellt. Mit dieser Methode können Nutzer Dateien in einer WebView auswählen. Diese Funktion kann jedoch missbraucht werden, da WebViews keine Einschränkungen für die Auswahl von Dateien erzwingen.
Auswirkungen
Die Auswirkungen der Dateieinbindung können davon abhängen, welche WebSettings in WebView konfiguriert sind. Zu weit gefasste Dateiberechtigungen können Angreifern den Zugriff auf lokale Dateien ermöglichen und ihnen den Diebstahl sensibler Daten, personenbezogener Daten (personenidentifizierbare Informationen) oder privater App-Daten ermöglichen. 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 Methode onShowFileChooser ausgewählt wurden, können die Sicherheit von Nutzern gefährden, da die Methode oder WebView nicht sicherstellen kann, dass die Dateiquelle vertrauenswürdig ist.
Risiko: Riskanter Zugriff auf Dateien über file://
Wenn setAllowFileAccess, setAllowFileAccessFromFileURLs und
setAllowUniversalAccessFromFileURLs aktiviert sind, können schädliche 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 Methode onShowFileChooser Dateien aus nicht vertrauenswürdigen Quellen auswählen und herunterladen.
Je nach Anwendungskonfiguration können diese Methoden alle zur Exfiltration personenbezogener Daten, Anmeldedaten oder anderer sensibler Daten führen.
Maßnahmen zur Risikominimierung
Datei-URLs validieren
WebViewAssetLoader verwenden
Verwenden Sie WebViewAssetLoader anstelle der genannten Methoden. Diese Methode verwendet das Schema http(s)//: anstelle eines file://-Schemas, um auf Assets des lokalen Dateisystems zuzugreifen, und ist 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 in API-Level 29 und niedriger standardmäßig auf TRUE und in API-Level 30 und höher auf FALSE gesetzt.
Wenn andere WebSettings konfiguriert werden müssen, sollten Sie diese Methoden explizit deaktivieren, insbesondere für Apps, die auf API-Level 29 oder niedriger ausgerichtet sind.
Risiko: Dateibasiertes XSS
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 dateibasiertes XSS durch die Ausführung von Code in beliebigen Dateien oder schädlichen Websites möglich, die in der WebView geöffnet werden.
Maßnahmen zur Risikominimierung
Verhindern, dass WebViews lokale Dateien laden
Wie beim vorherigen Risiko kann dateibasiertes XSS 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 können Sie verhindern, dass Klartext-Traffic geladen wird, damit WebViews mit gefährlichen Einstellungen zumindest keine HTTP-URLs laden können. Dies kann entweder über das Manifest erfolgen, indem Sie android:usesCleartextTraffic auf
False setzen, oder indem Sie eine Network Security Config festlegen, die HTTP-Traffic nicht zulässt.
Ressourcen
- API-Referenzseite für setAllowUniversalAccessFromFileURLs
- API-Referenzseite für setAllowFileAccessFromFileURLs
- API-Referenzseite für WebViewAssetLoader
- CodeQL-Dokumentation
- Oversecured-Blog
- Referenzseite für onShowFileChooser