Потенциально опасные настройки WebView
![]() |
Критичность: ИНФО |
| Способ обнаружения: DAST, WEBVIEW |
Описание
WebView — это компонент Android, который позволяет встраивать веб-контент непосредственно в интерфейс приложения. Его поведение управляется объектом WebSettings, который включает десятки флагов. Часть из них расширяет возможности загружаемого веб-контента (исполнение JavaScript, доступ к файловой системе, кеширование, доступ к содержимому через content://, смешанный HTTP/HTTPS-контент). Stingray фиксирует факт включения таких настроек как информационную находку: сама по себе настройка не является уязвимостью, но требует ручной проверки в контексте того, какой контент загружается в WebView.
Пример конфигурации, попадающей под наблюдение:
WebView webView = findViewById(R.id.webview);
WebSettings settings = webView.getSettings();
settings.setJavaScriptEnabled(true);
settings.setDomStorageEnabled(true);
settings.setAllowContentAccess(true);
Проблема
Расширенные настройки WebView становятся уязвимостью, когда в компонент попадает недоверенный контент:
- Исполнение постороннего кода — при включённом JavaScript загрузка непроверенного контента открывает путь к XSS и эксплуатации JavaScript-мостов.
- Доступ к данным приложения — настройки доступа к файлам и
content://могут позволить веб-странице обращаться к ресурсам песочницы приложения. - Накопление чувствительных данных — кеш, DOM Storage, cookies и база данных WebView могут сохранять конфиденциальную информацию в открытом виде.
- Понижение защиты канала — разрешённый смешанный контент (
MIXED_CONTENT_ALWAYS_ALLOW) позволяет подгружать ресурсы по HTTP на HTTPS-странице, что открывает MITM.
Информационный характер находки означает, что окончательная оценка риска требует анализа источника загружаемого контента и совокупности включённых настроек. Ниже приведён полный набор мер по приведению WebView к безопасной конфигурации — применяйте те, что соответствуют сценарию.
Рекомендации
-
Включайте только необходимый минимум возможностей. Если функциональность не требует JavaScript — оставьте его выключенным (
setJavaScriptEnabled(false)— значение по умолчанию). Каждый включённый флаг расширяет поверхность атаки, поэтому исходите из принципа «запрещено всё, что явно не разрешено». -
Отключите доступ WebView к файловой системе, если он не нужен. Дефолты зависят от версии API:
setAllowFileAccessFromFileURLs/setAllowUniversalAccessFromFileURLs—falseначиная с API 16;setAllowFileAccess—trueпо умолчанию и становитсяfalseлишь приtargetSdkVersion ≥ 30(Android 11). Полагаться на дефолты не стоит — выставляйте флаги явно: -
Загружайте локальные ресурсы через
WebViewAssetLoader, а не по схемеfile://. Загрузчик отдаёт упакованные ассеты через виртуальныйhttps-домен, сохраняя изоляцию источников (Same-Origin Policy):WebViewAssetLoader assetLoader = new WebViewAssetLoader.Builder() .addPathHandler("/assets/", new WebViewAssetLoader.AssetsPathHandler(this)) .build(); webView.setWebViewClient(new WebViewClientCompat() { @Override public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) { return assetLoader.shouldInterceptRequest(request.getUrl()); } }); -
Запретите смешанный контент на HTTPS-страницах:
-
Ограничьте навигацию доверенными доменами. Реализуйте
WebViewClient.shouldOverrideUrlLoading()с allow-list разрешённых схем и хостов; запрещайтеjavascript:,file:,data:,content:и неизвестные схемы. Не передавайте внешние ссылки на открытие «как есть». -
Загружайте контент только по HTTPS и не игнорируйте TLS-ошибки. В
onReceivedSslError()всегда вызывайтеhandler.cancel(), никогда —handler.proceed(). -
Минимизируйте JavaScript-мосты. Не используйте
addJavascriptInterface()для недоверенного контента. Если нужен канал native↔web — применяйтеWebViewCompat.addWebMessageListener()с явным списком разрешённых источников (allowedOriginRules) вместо@JavascriptInterface. -
Включите Google Safe Browsing для защиты от вредоносных и фишинговых страниц:
-
Управляйте чувствительными данными WebView. Отключайте кеширование секретных страниц и очищайте состояние при выходе из чувствительных сценариев:
Также отключите хранение паролей/форм (webView.clearCache(true); webView.clearFormData(); WebStorage.getInstance().deleteAllData(); CookieManager.getInstance().removeAllCookies(null);setSavePassword(false),setSaveFormData(false)на старых API) и сторонние cookies (CookieManager.setAcceptThirdPartyCookies(webView, false)). -
Поддерживайте System WebView в актуальном состоянии. Уязвимости движка закрываются обновлением системного WebView; для доступа к новым механизмам безопасности на старых API используйте библиотеку
androidx.webkit. -
Применяйте защиту на стороне контента. Для страниц под вашим контролем задавайте строгую политику
Content-Security-Policy, ограничивающую источники скриптов и ресурсов, — это снижает последствия возможного XSS.
Ссылки
- https://developer.android.com/develop/ui/views/layout/webapps/webview
- https://developer.android.com/reference/android/webkit/WebSettings
- https://developer.android.com/reference/androidx/webkit/WebViewAssetLoader
- https://developer.android.com/develop/ui/views/layout/webapps/managing-webview
- https://developer.android.com/privacy-and-security/risks/insecure-webview-mixed-content
- https://mas.owasp.org/MASTG/tests/android/MASVS-PLATFORM/MASTG-TEST-0033/
- https://cwe.mitre.org/data/definitions/200.html
- https://cwe.mitre.org/data/definitions/79.html
