WebViews – unsichere Dateieinschlüsse

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 und setAllowUniversalAccessFromFileURLs 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 wie WebViewAssetLoader 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 Paket android.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