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

В этой статье хотел бы поделиться своим опытом (или даже находкой) и обсудить одну интересную тему, а именно защиту от возможных способов украсть конфиденциальные данные пользователя на 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-правами, чтобы быть подверженным данной атаке.

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

Комментарии (8)


  1. zamir__zakiev
    14.07.2025 21:28

    Так в итоге-то пароль не своровать, если он правильно размечен. Вектора атаки по сути и нет.


    1. E-Coding Автор
      14.07.2025 21:28

      Во многих приложениях есть кнопка "показа пароля", которая сводит на нет эту правильную разметку


      1. zamir__zakiev
        14.07.2025 21:28

        Так вы же сами написали, что «сводит на нет» только если убирается inputType=password.


  1. Lx6g1ZG1
    14.07.2025 21:28

    который будет считывать все touch'и пользователя и слать их на сервер

    Клавиатуре в сети делать нечего. Поэтому это по определению не сработает для более-менее продвинутых пользователей


    1. E-Coding Автор
      14.07.2025 21:28

      Все атаки тестировал на стандартной клавиатуре на устройстве. Идея была в том, чтобы попытаться проверить атаку на любой клавиатуре (не создавать свою кастомную). А в сеть спокойно можно уйти в через какой-нибудь сервис

      Но про продвинутых пользователей согласен: вряд ли такой юзер даст осознанно разрешения сомнительным приложениям. Поэтому ЦА данной статьи - не осознанные пользователи (те же дети), которые могут на своем/родительском устройстве выдать разрешения, которые приведут к последующим проблемам