flawopen.com/Безопасность Android WebView/addJavascriptInterface
Android addJavascriptInterface: риски и безопасное применение
Считайте WebView с addJavascriptInterface привилегированной границей. Android внедряет объект во все frame, а приложение не может определить, какой frame вызвал метод. Если управляемый атакующим JavaScript достигнет любого frame, он сможет вызвать открытые методы с разрешениями приложения. Используйте WebView с мостом только для контролируемого приложением содержимого, а недоверенные страницы загружайте в отдельный WebView без моста.
Как мост меняет последствия XSS
Мост предоставляет JavaScript вызываемые точки входа в приложение-хост. Android открывает объект всем frame, включая iframe, а addJavascriptInterface не проверяет источник вызывающего frame. Поэтому внедрённый скрипт может обратиться к аннотированным методам; его возможности ограничены этими методами и проверками авторизации приложения. Для приложений с целевым API 16 или ниже Android описывает более опасное прежнее поведение: могут быть доступны все публичные методы. Начиная с API 17 требуется @JavascriptInterface, но аннотация не делает недоверенное содержимое безопасным.
Не допускайте мост к недоверенным страницам
webView.addJavascriptInterface( NativeBridge(), "Android" ) webView.loadUrl(untrustedUrl)
// Этот WebView предназначен только для встроенного интерфейса приложения. trustedWebView.settings.javaScriptEnabled = true trustedWebView.addJavascriptInterface( NativeBridge(), "Android" ) trustedWebView.loadUrl("file:///android_asset/index.html") // Отдельный WebView обрабатывает удалённые страницы и ввод пользователей. untrustedWebView.removeJavascriptInterface("Android") untrustedWebView.settings.javaScriptEnabled = false // Проверьте HTTPS и явный список разрешённых хостов. untrustedWebView.loadUrl(validatedHttpsUrl)
Самая надёжная граница — архитектурная: не переходите из WebView с мостом на удалённую, созданную пользователем или иным образом контролируемую атакующим страницу. Если загрузка недоверенного содержимого неизбежна, удалите интерфейс до загрузки и используйте отдельный WebView с отключённым JavaScript, если он не нужен. Android указывает, что внедрённый объект доступен всем frame, а удаление вступает в силу после следующей загрузки страницы. HTTPS защищает транспорт, но не делает хост или содержимое доверенными. Проверяйте схему и хост URL, а ссылки вне списка открывайте в системном браузере. Ограничьте методы моста, проверяйте каждый аргумент и применяйте авторизацию в нативном коде, не доверяя вызывающей странице.
Частые вопросы о безопасности мостов WebView
Нет. API 17+ ограничивает доступ публичными методами с аннотацией @JavascriptInterface, но не проверяет источник вызывающего frame и не делает содержимое под контролем атакующего доверенным. Оставляйте мост только в WebView, загружающем содержимое приложения.
Источники
- Android Developers — риски и меры защиты для нативных мостов WebView
- Android Developers — справочник API WebView.addJavascriptInterface
- Android Developers — справочник API JavascriptInterface