Читал новость? Да-да, «новая уязвимость, которая представляет опасность для всех устройств на базе Android, вплоть до новейшей версии 7.1.2» и прочие страшные слова и их комбинации? Отлично, стало быть, проблема есть, а вот исходников в публичном доступе пока не просматривается. А это значит, что в этой статье тебя ждет самый настоящий 0day!
 

Insecure By-Design?

Компания Google стремится сделать Android подходящим для любых задач, наделяя платформу самыми разными функциями. Иногда это может выйти боком — так в этот раз и произошло. Группа товарищей из США в мае текущего года публично презентовала новый вид атак на Android под именем Cloak and Dagger.

Исследователи внимательно просмотрели стандартный SDK разработчика и смогли реализовать не совсем то, что задумывала компания Google. По их словам, получив всего два разрешения в системе (одно из которых не требует подтверждения от пользователя, а второе можно получить скрытно с помощью первого), приложение сможет сделать практически все, что захочет.

Атака вышла впечатляющей, сами исследователи предложили с десяток возможных вариантов — от создания фейковых окон популярных приложений до кражи паролей. По следам презентации ты мог видеть не только нашу статью, но и отчет Касперского — в них достаточно красок и эмоций.

WARNING

Материал адpесован специалистам по безопасности и тем, кто собираeтся ими стать. Вся информация предоставлена исключительно в ознакомительных целях. Ни редакция, ни автор не несут ответственности за любой возможный вред, причиненный материалами данной статьи.

 

Show me the code

Авторы подробно рассказали о сути происходящего, но не показали самого интересного — исходников приложения, реализующего такие атаки. А когда приходится верить людям на слово, сразу возникают подозрения в достоверности сказанного — может, сама атака не такая уж и серьезная или вообще неосуществима?

Чтобы развеять твои (да и свои собственные) сомнения, я решил протестировать основные возможности, которые описали исследователи: продвинутый кейлоггер, фишинговые окна и «подталкивание» пользователей к нажатию нужных клавиш.

Тут не придется, как в уязвимости Stagefright, переполнять буфер и генерировать payload — все доступно в стандартном API. Будем пользоваться только разрешением SYSTEM_ALERT_WINDOW и сервисом специальных возможностей Accessibility service.

 

SYSTEM_ALERT_WINDOW

Как ты, наверное, знаешь, в Android все приложения работают внутри песочниц. Это позволяет разработчику быть уверенным, что к данным его приложения никто не получит доступ со стороны, — конечно, если сам пользователь еще не организовал root-доступ к устройству.

Для атаки Cloak and Dagger используется одно малознакомое пользователям разрешение — SYSTEM_ALERT_WINDOW. Оно позволяет вывести на экран так называемое системное окно: View-элемент, который отобразится поверх любого другого UI, даже если это будет Activity из стороннего приложения. При этом перекрытые Activity об этом не узнают и продолжат работать так, как будто ничего и не произошло.

В документации Google называет это разрешение специальным и настоятельно не рекомендует им пользоваться. Впрочем, не все так щепетильны — Facebook с помощью его выводит уведомления о новых сообщениях.

Но самое интересное, что это разрешение даже не надо подтверждать, — любое установленное из Google Play приложение может создавать системные окна, если разрешение SYSTEM_ALERT_WINDOW заявлено в его манифесте.

Установка из Google Play
Установка из Google Play
 

Создаем системное окно

Как ты уже понял, системное окно — это очень круто. С его помощью можно вывести данные поверх вообще любого элемента Android, даже если это будет окно системных настроек или телефонный звонок.

Перекрываем системным окном голосовой звонок
Перекрываем системным окном голосовой звонок

Чтобы вывести такое окно, понадобится класс WindowManager — системный сервис, отвечающий за стек всех View-элементов, которые отображены на экране. Подключиться к нему, как и любому другому системному сервису, можно совершенно свободно с помощью метода getSystemService.

WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE);

Для вывода окна нужно задать параметры будущего UI, системным оно становится благодаря параметру TYPE_SYSTEM_ALERT.

WindowManager.LayoutParams params =
    new WindowManager.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT,
            WindowManager.LayoutParams.TYPE_SYSTEM_ALERT,...

Дизайн системного окна задается с помощью привычной XML-верстки, никаких дополнительных ограничений нет. Для трансформации из макета в View-элемент применяется класс LayoutInflater. Вызов метода addView поместит на экран еще один слой графики — наше системное окно.

LayoutInflater inflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);
LinearLayout mOverlay = (LinearLayout) inflater.inflate(R.layout.fake_keyboard, null);
WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE);
wm.addView(mOverlay, params);

Продолжение статьи доступно только подписчикам

Вариант 1. Оформи подписку на «Хакер», чтобы читать все статьи на сайте

Подписка позволит тебе в течение указанного срока читать ВСЕ платные материалы сайта, включая эту статью. Мы принимаем оплату банковскими картами, электронными деньгами и переводами со счетов мобильных операторов. Подробнее о подписке

Вариант 2. Купи одну статью

Заинтересовала статья, но нет возможности оплатить подписку? Тогда этот вариант для тебя! Обрати внимание: этот способ покупки доступен только для статей, опубликованных более двух месяцев назад.


3 комментария

Подпишитесь на ][, чтобы участвовать в обсуждении

Обсуждение этой статьи доступно только нашим подписчикам. Вы можете войти в свой аккаунт или зарегистрироваться и оплатить подписку, чтобы свободно участвовать в обсуждении.

Check Also

Tips’n’Tricks из арсенала андроидовода. Самые интересные, полезные и нестандартные трюки с Android

Многие годы мы рассказывали про самые разные способы оптимизировать, модифицировать и твик…