Intereting Posts
Какие шрифты установлены по умолчанию на Android? Анализ памяти Android Какова полезность третьего аргумента View.resolveSizeAndState ()? Как создать форму с твердым, угловым, штриховым кодом в Java-коде? ActionBarSherlock – тип android.support.v4.app.Fragment не может быть разрешен. Это косвенно ссылается на требуемые файлы .class Как запустить приложение при запуске? Android Parcelable – запись и чтение ArrayList <IA>, когда IA является интерфейсом Как создать JQuery Slider-подобную функцию на веб-приложении iPhone / Android? Android Studio Ошибка «reg» не распознается как внутренняя или внешняя команда Класс Android LocationClient устарел, но используется в документации Светодиод уведомления Android не использует мой цвет Android.support.v7.internal.widget.ActionBarOverlayLayout не может быть создан Android Browser – Javascript window.innerWidth возвращает неправильное значение Jelly Bean Issue – wifiManager.getConnectionInfo (). GetSSID () – extra "" ListView с CHOICE_MODE_MULTIPLE с использованием CheckedText в пользовательском представлении

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) для всех оконных (интерфейсных) функций и переопределив их в mustOverrideUrlLoading. Как ни странно, в некоторых случаях необходимо использовать window.open (), или отображение пауз в веб-браузере (например, javascript останавливается?), А в других случаях следует использовать location.replace или просто отображать «interface: // specialdata Msgstr "не удалось найти сообщение.

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

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

Solutions Collecting From Web of "Android JavascriptInterface Security?"

Пример доступа к файлам sdcard из javascript:

 <html> <head> <script> function getContents(inputStream) { var contents = ""; var b = inputStream.read(); var i = 1; while(b != -1) { var bString = String.fromCharCode(b); contents += bString; b = inputStream.read(); } return contents; } function execute(cmdArgs) { // go_back_js_interface_name is the registered java interface. // it is an object, but is not iterable with for (var i in interface) {...}. return go_back_js_interface_name.getClass().forName("java.lang.Runtime").getMethod("getRuntime",null).invoke(null,null).exec(cmdArgs); } var p = execute(["ls","/mnt/sdcard/"]); document.write(getContents(p.getInputStream())); </script> </head> <body> Test </body> </html> 

Таким образом, код, который запускается в WebView, изолирован по умолчанию – то есть он не может выполнять опасные родные вещи, такие как запись в файловую систему или доступ к адресной книге и т. Д.

Большинство javaScript попадают в эту категорию, и в случае показа пользовательского диалога нет никакой опасности.

AddJavaScriptInterface позволяет вам подвергать родной материал телефона javascript, и существует опасность того, что если вы не напишете свой javaScriptInterface правильно, вы можете в конечном итоге подвергнуть телефон человека реальной опасности от хакера.

Я думаю, что проще всего понять пример.

Скажем, вы пишете интерфейс javaScript, где вы можете вызвать функцию из javaScript, которая записывает файл в путь в файловой системе Android. например:

 writeToFile(data, safepath); 

Javascript все исходит от вашего сервера, но хакер компрометирует ваш сервер и изменяет HTML / JavaScript, который загружается в ваш WebView для запуска:

 writeToFile(dangerousdata, pathtosomeotherfile); 

Теперь я не изучил макет пакета android достаточно хорошо, чтобы узнать, какой файл я бы хотел перезаписать / изменить, если бы я был хакером, но у нас были небольшие взломы с друзьями на наших собственных машинах linux, когда я был Младший, и вы бы использовали такой вызов, чтобы переписать что-то вроде SSH-бинарного файла – тогда вы сможете регистрировать все пароли, которые будут входить. Если бы вы могли делать что-то вроде перезаписывания или расширения оригинального apk своим собственным, вы могли бы Превратите телефон человека в сервер, на который вы могли бы войти в систему удаленно (я не уверен, что это возможно из-за того, как приложения изолированы). Даже если все, что вы могли бы сделать, это перезаписать критический файл данных, который может заставить пользователя дать вам (хакеру в этом случае) доступ к учетным данным безопасности, паролям и т. Д.

Было много лет назад, когда мы обнаружили дыру в процессе sendmail на Linux-машине, которая позволила нам запустить оболочку. Мы вошли на наш сервер в качестве почтового пользователя. Вы не могли бы сделать многое, как пользователь почты, но как только вы были на машине, это дало вам возможность оглянуться на другие недостатки.

Таким образом, вы можете делать то, что хотите сделать безопасно, просто убедитесь, что вы сделали этот интерфейс JavaScript очень простым и немым – он записывает только один файл в одном месте, а данные, которые вы пишете, – это текст или что-то, что не получается Интерпретируется позже. Для диалогов я делаю это все время – не нужны никакие специальные собственные вызовы. Это отличный способ сделать страницу, которую вы можете обновить после того, как пользователь установит ваше приложение.

Надеюсь, это полезно!

Исправление:

Для приложений под управлением Android 4.2 все общедоступные методы, которые аннотируются с помощью JavascriptInterface, могут быть доступны из JavaScript.

Поэтому, если вы разрабатываете приложение для SDK версии 17 или выше , вы должны добавить аннотацию @JavascriptInterface к любому методу, который вы хотите использовать для своего JavaScript.

Если вы не предоставляете аннотацию, этот метод недоступен на вашей веб-странице при работе на Android 4.2 или выше.

Чтобы узнать больше нажмите здесь

OverView

Чтобы избежать проблемы безопасности addJavaScriptInterface () , вам необходимо разработать протокол связи между собственным кодом и JavaScript.

Ниже приведена простая схема протокола связи.

В JavaScript

Чтобы упростить протокол связи, каждый вызов функции, который вы хотите обработать Android, должен подчиняться следующему шаблону

 /* classname string method name string params jsonObject */ value=classname+":"+methodname+"?"+"params"; window.promt(value,""); 

В Java

Можно переопределить onJsPrompt () в WebChromeClient .

 WebChromeClient.onJsPrompt(WebView view, String origin, String message, String defaultValue, final JsPromptResult result){ //Parse className //Parse methodName //Parse params //Create an instance of the target class by reflection. Call the target method with params. //Return true if all params in message valid, otherwise return false. } 

Кордова каркас

Это также работает с плагином Cordova . Хотя Кордова более сложна, она добавляет функцию обратного вызова к «JS to Native Call» и разрешает вызов собственного кода JavaScript

Эта ошибка безопасности работает со всем собственным интерфейсом, кроме уровня api> = 17.