Recipe Name:
Android WebView best practices: Set mixed content mode
Description:
WebView setting with security implications
Level:
error
Language:
  • java
Tags:
  • security
  • framework specific
  • Android
  • mobile
  • Android security set
Documentation

The Android best practices and secure coding guidelines make recommendations for WebView and its configuration.

Regardless where the URL originates from, it is 'best practice' to verify that the URL does not target local resources. This can easily be achieved by checking the start of the string for file:. It is considered best practice to also check the URL to be loaded against a white list. The settings below should also be considered to improve the overall security of the application:

Before
WebView wv = new WebView(context);
wv.loadUrl(url);
After
WebView wv = new WebView(context);
WebSettings = ws = wv.getSettings();
ws.setJavaScriptEnabled(false);
ws.setAllowFileAccess(false);
ws.setGeolocationEnabled(false);
ws.setAllowContentAccess(false);
int never = WebSettings.MIXED_CONTENT_NEVER_ALLOW
ws.setMixedContentMode(never);

if( !url.startsWith("file:"))
    wv.loadUrl(url);

Additionally avoid using the following settings (Deprecated since API level 30) to prevent malicious scripts from accessing arbitrary local files or launching XSS attacks.

ws.setAllowFileAccessFromFileURLs(true);
ws.setAllowUniversalAccessFromFileURLs(true);
Recipe
id: scw:android:missing-mixed-content-mode
version: 10
metadata:
  name: 'Android WebView best practices: Set mixed content mode'
  shortDescription: WebView setting with security implications
  level: error
  language: java
  enabled: true
  descriptionFile: descriptions/AndroidWebViewbestpractices.html
  tags: security;framework specific;Android;mobile;Android security set
search:
  instanceCreation:
    not:
      followedBy:
        methodcall:
          followedBy:
            methodcall:
              name: setMixedContentMode
          name: getSettings
    type: android.webkit.WebView
availableFixes:
- name: Set mixed content mode to MIXED_CONTENT_NEVER_ALLOW
  actions:
  - addMethodCall:
      name: getSettings().setMixedContentMode
      arguments:
      - android.webkit.WebSettings.MIXED_CONTENT_NEVER_ALLOW
      position: first-available-spot