Android JavascriptInterface Security?

Из документация: http://developer.android.com/reference/android/webkit/WebView.html#addJavascriptInterface%28java.lang.Object,%20java.lang.String%29

"Использование addJavascriptInterface () позволяет JavaScript контролировать ваше приложение. Это может быть очень полезной функцией или опасной проблемой безопасности. Когда HTML в WebView не заслуживает доверия (например, часть или весь HTML предоставлен каким-либо человеком или процессом), злоумышленник может внедрить HTML который выполнит ваш код и, возможно, любой код по выбору злоумышленника. Не используйте addJavascriptInterface (), если весь HTML в этом WebView не был написан вами. Связанный объект Java работает в другом потоке, а не в потоке, в котором он был создан.

Предположим, у меня есть интерфейс, который показывает только настраиваемое диалоговое окно или запускает загрузку на SD-карту. Будет ли это небезопасно использовать для любого URL-адреса? Как может страница атаки использовать интерфейс для запуска любого кода по выбору злоумышленника?

Обновление: Согласно документации :

Этот метод можно использовать, чтобы разрешить JavaScript управлять хостом. применение. Это мощная функция, но она также обеспечивает безопасность риск для приложений, ориентированных на уровень API JELLY_BEAN или ниже, потому что JavaScript может использовать отражение для доступа к внедренному объекту публичные поля. Использование этого метода в WebView, содержащем ненадежные контент может позволить злоумышленнику манипулировать хост-приложением в непредусмотренные способы, выполнение кода Java с разрешениями хоста применение. Будьте предельно осторожны при использовании этого метода в WebView который может содержать ненадежный контент.

Есть ли пример того, как это могло произойти? Это просто говорит о том, что DOWNLOADINTERFACE.dangerousfunction может быть вызван, если это общедоступный метод в этом классе?

Обновление:

Я тестировал на примере эксплойта ниже, сайты могут получить доступ к системе через интерфейсы в Android 4.4, 4.1 и 3.2.

Однако я не видел эту ошибку в Android 2.2 или 2.3, взлом вызывает только принудительное- близко. Как лучше всего предотвратить этот взлом, кроме отказа от JSInterface? Могу ли я включать такие поддельные функции, чтобы предотвратить несанкционированный вызов функций?

public Object getClass() {
  //throw error, return self, or something?  
}

Или все переписать с использованием ajax и перехвата вызовов? Приведет ли это к лучшей / худшей производительности?

Обновление:

Мне удалось удалить интерфейс JS и заменить его функциональность, определив команды window.open (specialurl) для всех функций window. (Interface) и переопределив те, что в shouldOverrideUrlLoading. Как ни странно, в некоторых случаях необходимо использовать window.open (), или веб-просмотр прерывает отображение (например, останавливается javascript?), А в других случаях следует использовать location.replace, иначе он просто покажет "interface: // specialdata" "не удалось найти сообщение.

(Я установил settings.setJavaScriptCanOpenWindowsAutomatically (true), поэтому window.open все время работает с JS.)

Кто-нибудь знает лучший способ переписать приложение с таким поведением?

18
задан NoBugs 5 January 2014 в 09:31
поделиться