Содержание статьи
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 заявлено в его манифесте.
Создаем системное окно
Как ты уже понял, системное окно — это очень круто. С его помощью можно вывести данные поверх вообще любого элемента 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. Присоединись к сообществу «Xakep.ru», чтобы читать все материалы на сайте
Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее
Вариант 2. Открой один материал
Заинтересовала статья, но нет возможности стать членом клуба «Xakep.ru»? Тогда этот вариант для тебя! Обрати внимание: этот способ подходит только для статей, опубликованных более двух месяцев назад.
Я уже участник «Xakep.ru»