Android WebViews и мост JavaScript в Java

  1. Введение
  2. Что такое WebView?
  3. Почему мы должны заботиться о WebViews?
  4. Мост JavaScript в Java
  5. @JavascriptInterface для спасения?
  6. Безопасен ли я от атаки отражением, если у меня нет моста JavaScript-Java?
  7. Заключение

Поскольку Android WebViews - это элементы управления браузером в приложении, они допускают традиционные веб-атаки. Узнайте, как защитить от атак Android WebView.

Введение

Прошло несколько месяцев с тех пор, как я представлял на Android WebViews на OWASP AppSec EU 2015 в Амстердаме, и у меня наконец-то появилась возможность поместить контент в серию постов. В этой первой части серии я кратко расскажу о WebViews и расскажу о первой из нескольких тем, а именно о мосте JavaScript. Другие темы, включая HTTPS, SOP, обработку схемы URL и локальное хранилище, будут рассмотрены в следующих публикациях.

Что такое WebView?

WebView - это элемент управления для загрузки и отображения веб-контента, а также базовые функции браузера, такие как история навигации и среда выполнения JavaScript. Управление встроенным WebView предоставляется приложению через обратные вызовы (интерфейсы Java), с помощью которых приложение может реагировать, изменять или отклонять события (WebView также можно настраивать с помощью класса WebSettings). Два наиболее важных обратных вызовов WebChromeClient для событий браузера и WebViewClient для веб-событий. Например, приложение может перехватить загрузку страницы (событие загрузки URL) путем переопределения shouldOverrideUrlLoading () , Теоретически этот дизайн позволяет приложению перехватывать любое событие, которое загружает контент. Однако на практике это не всегда так.

Pre-KitKat (Android 4.4) WebView был в значительной степени основан на WebKit и не получал обновления программного обеспечения (если только устройство не получало OTA-обновление от оператора связи или OEM-производителя). KitKat и более поздние WebViews основаны на браузере с открытым исходным кодом Chromium. Начиная с Android 5.0 (Lollipop), WebView упакован как отдельный APK и обновляется отдельно.

Почему мы должны заботиться о WebViews?

Это «встроенный» компонент, который обеспечивает работу большинства приложений с поддержкой HTML и многих интернет-приложений. WebViews продолжают оставаться актуальной темой, но по неправильным причинам. К счастью (или к сожалению), ни одна из этих причин не нова.

Во-первых, так как WebView - это элемент управления браузером в приложении , он приглашает к традиционным атакам, связанным с сетью: захват соединений, XSS и так далее. Но WebViews обладают другими функциями (поскольку использование WebView неявно, мы будем называть их просто приложениями) . Разработчик может пробить отверстия в песочнице. Веб-контент может взаимодействовать с приложением и наоборот. Этот дизайн означает, что если существует уязвимость, то ее можно использовать в любом направлении. Более того, распространенная (даже распространенная) модель приложений заключается в объединении как локальных ресурсов, так и веб-контента в одном контейнере (то есть в самом приложении). В совокупности полученная модель угрозы становится больше, чем сумма ее частей. Обход той же политики происхождения (SOP) может привести к доступу к файловой системе устройства. Подумайте о краже пользовательских данных или куки. Неправильная обработка URL-адресов может сделать приложение посредником. Представьте себе, что удаленный злоумышленник нацелен на другие приложения (или даже само приложение), используя промежуточное приложение в качестве прокси. Мы рассмотрим их в этой и последующих публикациях.

Поскольку Android WebViews - это элементы управления браузером в приложении, они допускают традиционные веб-атаки

Рисунок 1. WebView сочетает в себе как модели угроз, стоящие перед традиционными, так и веб-приложениями.

Мост JavaScript в Java

Мост JavaScript-Java (также известный как JavascriptInterface) - это функция WebView для программной установки объекта Java на веб-страницу, доступную из JavaScript. Это показано ниже, в котором код Java внедряет объект в WebView (строки 1 и 2), а сценарий на странице вызывает открытый метод объекта (строка 4).

Это показано ниже, в котором код Java внедряет объект в WebView (строки 1 и 2), а сценарий на странице вызывает открытый метод объекта (строка 4)

Рисунок 2: Использование JavascriptInterface

Обратите внимание, что addJavascriptInterface () не имеет понятия происхождения и поэтому установленный JavascriptInterface не регулируется СОП, что делает его опасным по замыслу.

Теперь хорошо известно, что Мосты JavaScript могут быть использованы (Google). Смотрите рисунок 3 для примера. Впервые это было открыто опубликовано Нилом Бергманом. JavaScript может использовать отражение для доступа к открытым полям моста JavaScript (строки 1 и 2) для выполнения кода Java (строка 3) с разрешения хост-приложения.

JavaScript может использовать отражение для доступа к открытым полям моста JavaScript (строки 1 и 2) для выполнения кода Java (строка 3) с разрешения хост-приложения

Рисунок 3: Атака отражения JavascriptInterface

@JavascriptInterface для спасения?

Аннотация @JavascriptInterface была представлена ​​в Android 4.2, JELLY_BEAN_MR1 (Улучшения безопасности в Jelly Bean) для ограничения воздействия атаки отражением. Разработчики маркируют методы с помощью @JavascriptInterface, а среда выполнения ограничивает доступ JavaScript только к аннотированным методам. Если вы проверите это, то несанкционированный доступ к метке без метки приведет к ошибке:

I / chromium (13478): [INFO: CONSOLE (1)] "Uncaught TypeError: Object [object Object] не имеет метода 'secret'"

Тем не менее, @JavascriptInterface имеет множество предостережений. Чтобы быть эффективными против атаки отражением, приложение должно использовать аннотацию @JavascriptInterface и целевой уровень API 17 или выше (targetSdkVersion = API уровень 17), а приложение должно быть запущено на Android 4.2 или более поздней версии (интерфейс все еще может быть контролируется несанкционированным JavaScript). Если, например, приложение использует аннотацию @JavascriptInterface, предназначено для уровня API 17 и работает на 4.1 или более ранней версии (например, потому что minSdkVersion позволяет это), то приложение все еще уязвимо, так как аннотация игнорируется (мы предполагаем, что WebView имеет JavaScript включен).

Другими словами, чтобы @JavascriptInterface был полезен как исправление:

  • Эта аннотация должна использоваться только с методами, разрешенными для использования мостом JavaScript.
  • Приложение должно быть ориентировано на API версии 17 или выше.
  • Устройство должно быть Android 4.2 или выше.

Для пользователей на более ранних устройствах угроза не может быть решена напрямую, и ее смягчение осуществляется с помощью компенсирующих элементов управления (т. Е. Мер, которые предотвращают выполнение ненадежного JavaScript).

Безопасен ли я от атаки отражением, если у меня нет моста JavaScript-Java?

Короткий ответ: нет.

Давайте сначала повторим, что это значит: вы МОЖЕТЕ быть уязвимы к JavascriptInterface отражение атаки (для Android <4.2), даже если вы не устанавливаете JavascriptInterface!

Это связано с тем, что в некоторых версиях Android (4.0.0 - 4.1.2) базовый код WebView создает как минимум один встроенный интерфейс JavaScript в каждом реализованном WebView. Таким образом, каждое приложение, которое загружает содержимое WebView по HTTP (или может каким-либо иным образом загружать ненадежный JavaScript), уязвимо для этой атаки на устройстве с уязвимыми версиями Android.

Таким образом, каждое приложение, которое загружает содержимое WebView по HTTP (или может каким-либо иным образом загружать ненадежный JavaScript), уязвимо для этой атаки на устройстве с уязвимыми версиями Android

Разработчики могут использовать метод углубленной защиты, заблаговременно удаляя установленные в системе мосты.

Это создает проблему: если вы не установили эти мосты, как вы можете назвать их, чтобы удалить их? Есть три варианта, ни один из которых не является красивым:

  1. Напишите немного JavaScript для сбора JavascriptInterfaces путем сбора всех уязвимых JavascriptInterfaces с использованием метода Джошуа Дрейка (Метод Дрейка работает с перечислением переменных в DOM, проверяя, можно ли использовать каждую из них для доступа к классу java.lang.Runtime через отражение), а затем избавляюсь от них, используя еще один JavascriptInterface.
  2. Используйте отражение для доступа к списку JavascriptInterfaces.
  3. Приложения, предназначенные для ЛЕДЕНЕЦ НА ПАЛОЧКЕ и выше можно использовать JavaScript для перечисления методов внедряемых объектов Java.

Заключение

Ориентация на JELLY_BEAN_MR1 или более позднюю версию по-прежнему оставляет приложения уязвимыми для атаки отражением на устройствах до 4.2. На момент написания, это составляет примерно 20% всех устройств. Их можно исключить, задав для minSdkVersion значение 17. Если вы хотите получить доступ к этим устройствам И вам не нужны функции моста JavaScript-Java, вы можете использовать метод из предыдущего раздела для удаления скрытых JavascriptInterfaces. Если вы используете JavascriptInterface, то ненадежный скрипт, внедренный в страницу, все равно может нанести ущерб. Устраните этот риск, как обычно, например, предотвратите XSS, и убедитесь, что канал SSL надежно защищен.

Узнайте больше о тестировании безопасности мобильных приложений

Почему мы должны заботиться о WebViews?
Безопасен ли я от атаки отражением, если у меня нет моста JavaScript-Java?
Что такое WebView?
Почему мы должны заботиться о WebViews?
Безопасен ли я от атаки отражением, если у меня нет моста JavaScript-Java?
Это создает проблему: если вы не установили эти мосты, как вы можете назвать их, чтобы удалить их?