Search
Write a publication
Pull to refresh

Android. Кража данных через клавиатуру: миф или реальность?

Level of difficultyEasy
Reading time4 min
Views2.1K

Привет, Хабр!

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

И перед прочтением статьи, хотелось бы напомнить, что она написана только в образовательных целях и не несёт побуждений к противозаконным действиям, а также не является инструкцией к уголовно наказуемой краже данных. Данная статья поднимает вопрос защиты от возможных атак на данные пользователей вашего приложения.
В статье осознанно опущена кодовая реализация атакующей стороны и представлен лишь вектор возможной атаки без конкретной реализации, чтобы показать способы защиты от нее.
Незаконное получение конфиденциальных данных уголовно-наказуемо.

Ну а теперь после длинного дисклеймера перейдем к сути.

План:

  1. Введение

  2. Атака с помощью оверлея поверх всех приложения и защита от нее

  3. Атака с помощью сервиса специальных возможностей и защита от нее

  4. Заключение

Введение

Однажды, слушая доклад по Android-разработке я наткнулся на один интересный вид атаки, а именно TapJacking. Сильно углубляться в подробности этой атаки и защиты от нее я не буду: она отлично описана на этой странице в документации Гугла.

Однако такая атака для меня стала находкой, и тут же возникла другая мысль: а возможно ли, что вредоносное приложение на устройстве похожим способом как-то будет считывать всё, что вводит пользователь?

Сразу родились 2 идеи, как такое возможно реализовать:

  • Путем наложения прозрачного оверлея на экране, который будет считывать все touch'и пользователя и слать их на сервер

  • Каким-то способом считывать в другом сервисе данные с ввода клавиатуры и слать их на сервер

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

Атака с помощью оверлея поверх всех приложения и защита от нее

Идея данной атаки проста: вредоносное приложение должно в какой-то момент накладывать прозрачный оверлей поверх всех приложений, который будет считывать все нажатия пользователя и передавать их фоново на удаленный сервер. Учитывая, что большинство пользователей не меняет внешний вид своих клавиатур, то несложно будет сопоставить координаты нажатий и вводимые символы.

В чем же заключается угроза?

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

За несколько часов был разработан прототип атакующего приложения, который успешно отображался поверх окон других приложений, но здесь нас ждал первый нюанс: приложение могло либо перехватывать координаты касаний на прозрачном оверлее и передавать их на сервер, но при этом пользователь не мог взаимодействовать с приложением под оверлеем. Либо пользователь все таки мог взаимодействовать с оверлеем, но сам оверлей никак не мог перехватить координаты касаний.

Получается замкнутый круг, который мне быстро решить не удалось.

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

Атака с помощью сервиса специальных возможностей и защита от нее

После неудачной попытки атаковать себя же (я и сам своего рода стратег), в голову пришла другая идея: а что если система сама будет сообщать о вводе пароля?

И, порывшись немного в документации, я нашел такую возможность: Android предоставляет сервисам для специальных возможностей, уникальные возможности: не только считывать касания пользователя, но и сразу считывать введённый пользователем текст! Теперь картинка сложилась в голове, и был сделан прототип атакующего ПО.

Единственный нюанс: для работы такого приложения необходимо явно дать разрешение в разделе настроек "Специальные возможности", иначе ничего не произойдёт. Кто-то скажет, что это маловероятно и об этом не нужно беспокоиться, но я вижу другую картинку: ребенок качает игру с непроверенного ресурса и ему высвечивается окно со словами: "дайте разрешение на следующем экране, чтобы продолжить игру". И вот, родители сами того не подозревая, имеют на устройстве сервис, который тянет каждое нажатие клавиатуры в сеть.

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

Назревает логичный вопрос: а как защититься от такой атаки?

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

  • Для Android View: setImportantForAccessibility(
    View.IMPORTANT_FOR_ACCESSIBILITY_NO)
    или соответствующий xml-атрибут android:importantForAccessibility="no"

  • Для Compose: Modifier.clearAndSetSemantics()

После установки данных атрибутов из поля ввода невозможно считывать сервисом специальных возможностей то, что вводит пользователь.

Кстати, интересный факт, что если на поле стоит тип password, то считывать с него данные невозможно. Но невозможно до тех пор, пока вы не нажмёте на кнопку "показать пароль", которая зачастую снимает inputType==paasword. Одно нажатие - и ваш пароль ушел к злоумышленнику

Заключение

Несмотря на то, что атаку через оверлей воспроизвести не удалось, атака через сервис специальных возможностей возможна, и, на мой взгляд, защищаться от неё стоит, так как без 2ФА учётные данные можно будет перехватить.

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

Считаете ли вы защиту от данной атаки обязанностью разработчика (ведь кажется именно он должен обеспечить сохранность ваших конфиденциальных данных в приложении)? Или ответственность за выдачу разрешений лежит целиком и полностью на пользователе? Делитесь своим мнением.

Only registered users can participate in poll. Log in, please.
Стоит ли защищаться от атаки через сервис специальных возможностей?
71.43% Да, приложение должно обеспечивать безопасность данных пользователя, насколько это возможно10
28.57% Нет, это проблемы пользователя4
14 users voted. 3 users abstained.
Tags:
Hubs:
+1
Comments11

Articles