Webview loadurl injection
WebView loadurlインジェクション
説明
Webview.loadurlは、指定されたURLをWebViewセッションにロードします。WebViewのURLはさまざまなスキームやパスを受け入れるため、安全でないコンテンツの読み込みやフィッシング攻撃につながったり、場合によってはリモートコード実行 (RCE) の脆弱性が悪用されたりする可能性があります。
Websettingsクラスを使用してJavaScriptやローカルファイルへのアクセスを有効にするなど、いくつかの設定によってWebViewセッションの機能が制御されます。
攻撃者は、悪意のあるHTMLやJavaScriptを作成することで、この脆弱性を悪用できます。フィッシング攻撃では、偽のログインフォームを装ってユーザーの認証情報を盗む可能性があります。
以下は、Intentから信頼できないURLを受け入れる脆弱なJavaコードの例です。
public class VulnerableBrowserActivity extends Activity {
@override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// Create a new wevbiew session.
WebView webView = (WebView) findViewById(R.id.webview);
// Enable javascript.
WebSettings settings = webView.getSettings();
settings.setJavaScriptEnabled(true);
// Accept url from untrusted intent.
String url = getIntent().getStringExtra("URL");
webView.loadUrl(url);
}
}
推奨事項
信頼できるコンテンツのみがアクセス可能であることを保証するために、すべての信頼できないURLに対して適切な入力検証を行う必要があります。たとえば、アプリケーションがローカルアセットをロードしている場合、ロードされるURLのリストをホワイトリストに登録する必要があります。
また、JavaScriptやファイルへのアクセスなど、不要な設定をすべて削除して、Webviewの設定を堅牢化する必要があります。
public class WhitelistBrowserActivity extends Activity {
private static WHITELISTED_URLS = ImmutableList.of(
"url1",
"url2");
@override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
WebView webView = (WebView) findViewById(R.id.webview);
String url = getIntent().getStringExtra("url");
if (!WHITELISTED_URLS.contains(url)) { /* Note: "https".startsWith("http") == true */
url = "about:blank";
}
webView.loadUrl(url);
}
}
リンク
- DRD02-J. Do not allow WebView to access sensitive local resource through file scheme
- Webview loadurl (Android documentation)
- Websettings (Android documentation)
標準
- OWASP_MASVS_L1:
- MSTG_PLATFORM_7
- MSTG_PLATFORM_2
- OWASP_MASVS_L2:
- MSTG_PLATFORM_7
- MSTG_PLATFORM_2
- PCI_STANDARDS:
- REQ_2_2
- REQ_6_2
- REQ_6_3
- REQ_11_3
- OWASP_MASVS_v2_1:
- MASVS_CODE_4
- MASVS_PLATFORM_2
- SOC2_CONTROLS:
- CC_2_1
- CC_3_4
- CC_4_1
- CC_7_1
- CC_7_2
- CC_7_4
- CC_7_5