Введение

Около 3 лет назад я реализовал и опубликовал на своем GitHub механизмы обнаружения потенциально вредоносных Android-приложений. Несмотря на прошедшее с тех пор время, эти механизмы обнаружения вредоносного ПО не получили широкого признания, тогда как банковские вредоносные программы, эксплуатирующие AccessibilityService, по-прежнему популярны.

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


Представляет ли вредоносное ПО реальную угрозу для пользователей мобильных устройств?

Согласно результатам исследования Kaspersky Security Network, опубликованным в отчете The mobile malware threat landscape in 2023 (“Ситуация с угрозами вредоносного ПО, нацеленного на мобильные устройства, в 2023 году”), Лаборатория Касперского обнаружила:

  • 33,8 млн случаев атак вредоносного, рекламного и потенциально опасного ПО на пользователей мобильных устройств;
  • осуществляли эти атаки более чем 1,3 млн вредоносных приложений;
  • почти половина этих пакетов (40,8%) была связана с рекламными угрозами, что делает их наиболее распространенной формой вредоносной активности;
  • почти 12% вредоносных приложений, около 154 000, относятся к категории банковских троянов.

На следующей диаграмме представлено количество установленных пакетов банковских троянов в период с 2020 по 2023 год:

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

На самом деле существует целый ряд крупных вредоносных кампаний, нацеленных на банки по всему миру. Было бы сложно рассказать обо всех банковских киберугрозах в одной статье, упомяну лишь о двух троянах, которые являются примерами вредоносных приложений, злоупотребляющих Android AccessibilityService:

Эти трояны могут быть обнаружены в приложениях, доступных в Google Play и сторонних магазинах приложений. Они распространяются по различным каналам связи, включая текстовые сообщения и электронные письма, которые убеждают жертву установить вредоносное ПО.

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

  • потоковую передачу данных с экрана;
  • кейлоггинг (прослушивание клавиатуры);
  • оверлейинг (изменение контента экрана);
  • чтение, отправку, блокировку SMS;
  • запись звуков;
  • доступ к файлам.

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

  • обход биометрической авторизации в легитимных приложениях;
  • обход кода 2FA;
  • передачу (похищение) учетных данных жертвы и средств из финансовых приложений.

Так является ли вредоносное ПО серьезной проблемой для пользователей Android? Безусловно.

Могут ли подобные вредоносные действия быть обнаружены легитимными мобильными приложениями, требующими защиты, например финансовыми приложениями? Хотя не все случаи обнаруживаются, ряд мошеннических операций можно предотвратить.

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


Android AccessibilityService

Цель AccessibilityService в Android не в том, чтобы облегчить жизнь разработчикам вредоносных программ. Цель этой функции  —  помочь пользователям с ограниченными возможностями в навигации и использовании устройств и приложений Android. В документации по Android указывается:

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

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

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

По соображениям безопасности, начиная с Android 13, сервисы специальных возможностей доступны только для приложений, установленных из легитимных магазинов приложений. Однако, согласно другому отчету Лаборатории Касперского, эти ограничения можно обойти. Подробнее о повышении уровня безопасности в последних версиях Android читайте далее. 


Пример сценария заражения: Anubis

С момента моего первого исследования, проведенного в 2021 году, прошло немало времени. Тем не менее мои наблюдения за процессом заражения могут помочь современным пользователям лучше понимать своего противника. Для демонстрации я использовал старый образец Anubis, вредоносная деятельность которого все еще схожа с другими банковскими троянами.

Я установил Anubis  —  самый распространенный банковский троян  —  на свое старое Android-устройство Samsung S5, которое использовалось исключительно в экспериментальных целях в имитирующей среде. Не рекомендую вам делать это без достаточных знаний в области безопасности мобильных устройств. После установки вредоносного ПО на ваше устройство наиболее безопасный подход  —  считать устройство взломанным и не использовать его для каких-либо конфиденциальных или личных действий.

Чтобы получить файл .apk, содержащий вредоносную программу Anubis, я провел онлайн-исследование и обнаружил его через несколько минут. После установки приложения через adb (Android Debug Bridge) заметил на экране мобильного устройства иконку с заголовком “pandemidestek”. Этот конкретный .apk распространялся в основном среди турецких пользователей во время пандемии COVID-19.

Итак, приложение установлено, но его вредоносные механизмы еще не активированы. После нажатия на иконку приложения оно запустилось и направило меня на экран настроек “Accessibility” (“Доступность”), как показано ниже. Кроме того, приложение постоянно отображало уведомление “Enable access…” (“Включите доступ…”) в середине экрана. Это уведомление было призвано убедить жертву еще раз нажать на иконку pandemistek для предоставления необходимого доступа.

Чтобы включить AccessibilityService для вредоносного приложения, нужно было установить флажок “Use service” (“Использовать сервис”).

И затем нажать “OK”, чтобы подтвердить действие.

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

Разрешение на телефонные звонки
Разрешение на запись звука
Разрешение на доступ к файлам

После получения разрешений приложение отобразило пользователю сайт Google, скрывая свое присутствие на устройстве.

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


Механизмы обнаружения вредоносного ПО

Возможности легитимных приложений по повышению уровня безопасности пользователей

На момент написания этой статьи Android предлагал функции идентификации устанавливаемых на устройстве приложений и сбора основных сведений об этих приложениях, таких как имя, подписи, разрешения и информация о том, использует ли приложение AccessibilityService. На основе этой информации легитимное приложение может обнаружить потенциально вредоносные приложения. Также предусмотрена возможность уведомления серверов приложения о подозрительном окружении, тем самым окружение устройства пользователя помечается как потенциально вредоносное или подверженное высокому риску мошенничества.

Обнаружение приложений, злоупотребляющих AccessibilityService

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

Начиная с Android 4 (уровень API 14), платформа предлагает приложениям метод для получения списка сервисов доступности, включенных на устройстве. Этот метод, названный getEnabledAccessibilityServiceList, является частью класса AccessibilityManager. Приведенный ниже Java-код позволяет получить список включенных сервисов доступности:

AccessibilityManager am = (AccessibilityManager) mContext.getSystemService(Context.ACCESSIBILITY_SERVICE);
List<AccessibilityServiceInfo> services = am.getEnabledAccessibilityServiceList(
AccessibilityServiceInfo.FEEDBACK_GENERIC |
AccessibilityServiceInfo.FEEDBACK_VISUAL |
AccessibilityServiceInfo.FEEDBACK_HAPTIC
);

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

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

List<AccessibilityServiceInfo> retSvcs = new ArrayList<>();
PackageManager pm = mContext.getPackageManager();
for (AccessibilityServiceInfo svc : services) {
PackageInfo packageInfo = null;
try {
packageInfo = pm.getPackageInfo(svc.getId().split("/")[0], 0);
} catch (PackageManager.NameNotFoundException e) {
// pass Exception, packageName не найдено
}

if (packageInfo == null)
continue;

if ((packageInfo.applicationInfo.flags & (ApplicationInfo.FLAG_SYSTEM | ApplicationInfo.FLAG_UPDATED_SYSTEM_APP)) == 0)
retSvcs.add(svc);
}

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

Теперь перейдем к реализации более надежных стратегий обнаружения. Проявим большую бдительность и последуем за кроликом (вспомните фильм “Матрица”, герой которого Нео обратил внимание на тайный знак  —  тату кролика на плече у гостьи,  —  что в конечном итоге привело его к более глубокому пониманию происходящего).

Обнаружение подозрительных возможностей и типов событий в AccessibilityService

Сервисы доступности используют ряд возможностей и типов событий. Возможности определяют типы действий, которые может выполнять сервис и которые можно получить с помощью метода getCapabilities класса AccessibilityServiceInfo. Типы событий определяют события, которые будут получены сервисом. Во вредоносных приложениях можно наблюдать возможность CAPABILITY_CAN_RETRIEVE_WINDOW_CONTENT, которая, как следует из ее названия, позволяет сервису получать контент окна. Что касается типов событий, то в сферу интересов этих приложений попали следующие события:

TYPE_WINDOW_STATE_CHANGED
TYPE_WINDOW_CONTENT_CHANGED
TYPE_VIEW_FOCUSED

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

Подозрительные возможности и типы событий можно обнаружить следующим образом, если предположить, что svc является экземпляром класса AccessibilityServiceInfo.

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) 
if ((svc.getCapabilities() & CAPABILITY_CAN_RETRIEVE_WINDOW_CONTENT) != 0)
Log.d("Content can be retrieved by ", svc.getId());

if ((svc.eventTypes & (TYPE_WINDOW_STATE_CHANGED | TYPE_WINDOW_CONTENT_CHANGED | TYPE_VIEW_FOCUSED)) != 0)
Log.d("Suspicious event types detected ", svc.getId());

Обнаружение возможностей оверлей-атак

Одна из атак, используемых вредоносными приложениями для похищения учетных данных жертв с мобильных устройств, известна как оверлей-атака (overlay attack). В этой схеме вредоносное приложение накладывает на экран жертвы свое окно, которое выглядит идентично интерфейсу легитимного банковского приложения. Таким образом, можно обманом заставить жертву предоставить свои учетные данные или конфиденциальную информацию. Однако для осуществления оверлей-атаки необходимо предоставить разрешение android.permission.SYSTEM_ALERT_WINDOW. Это разрешение можно проверить следующим образом, предположив, что packageInfo является объектом класса PackageInfo.

if (packageInfo.permissions != null)
for (PermissionInfo perm : packageInfo.permissions) {
if (perm.name.equals("android.permission.SYSTEM_ALERT_WINDOW")) {
Log.d("Possible overlay attack ", packageInfo.packageName);
}
}

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && packageInfo.requestedPermissions != null)
for (String permName : packageInfo.requestedPermissions) {
if (permName.equals("android.permission.SYSTEM_ALERT_WINDOW")) {
Log.d("Possible overlay attack ", packageInfo.packageName);
}
}

Обнаружение других подозрительных разрешений

Можно также обнаружить другие подозрительные разрешения, используемые потенциально вредоносными приложениями, как показано ниже:

String[] suspiciousPermissions = {
"android.permission.REQUEST_INSTALL_PACKAGES",
"android.permission.REQUEST_DELETE_PACKAGES",
"android.permission.INJECT_EVENTS",
"android.permission.CAPTURE_SECURE_VIDEO_OUTPUT",
"android.permission.INSTALL_PACKAGES",
"android.permission.KILL_BACKGROUND_PROCESSES",
"android.permission.sec.MDM_REMOTE_CONTROL",
"android.permission.FOREGROUND_SERVICE",
"android.permission.RECEIVE_BOOT_COMPLETED"
};

if (packageInfo.requestedPermissions != null) {
for (String perm : packageInfo.requestedPermissions){
for (String suspPerm : suspiciousPermissions) {
Log.d("Detected suspicious permission ", suspPerm);
}
}
}

if (packageInfo.permissions != null) {
for (PermissionInfo perm : packageInfo.permissions) {
for (String suspPerm : suspiciousPermissions) {
Log.d("Detected suspicious permission ", suspPerm); }
}
}

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

Определение факта недавней установки приложения

Еще одним полезным механизмом обнаружения вредоносного ПО может быть проверка того, было ли приложение, использующее AccessibilityService, установлено недавно, например за последние 15 минут. Если такое приложение было установлено недавно, то риск безопасности устройства выше. Я для примера использовал 15-минутный период, хотя этот порог может быть расширен.

if (Math.abs(packageInfo.firstInstallTime - System.currentTimeMillis()) > 15 * 60 * 1000)
continue;

Другие механизмы обнаружения с демонстрацией

Другие механизмы обнаружения и видео с демонстрацией реализованных проверок можно найти на Github.

Анализ рисков устройства

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

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

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


Меры по оптимизации системы безопасности Android

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

Например, начиная с Android 14 (API 34), разработчики получили возможность устанавливать атрибут accessibilityDataSensitive в представлении. Это гарантирует, что с представлением смогут взаимодействовать только сервисы доступности, специально разработанные для людей с ограниченными возможностями. Кроме того, любое приложение, использующее сервис доступности, предназначенный для людей с ограниченными возможностями, должно иметь установленный атрибут IsAccessibilityTool. Помимо этого, разработчики должны получить одобрение от Google Play через форму Permission Declaration (Разрешительная декларация), прежде чем выпускать такое приложение в легитимном магазине Google.

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


Заключение

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

Платформа Android продолжает совершенствоваться: на устройствах Android появляется все больше функций безопасности, а в Google Play улучшаются процессы выявления вредоносных приложений. В результате разработчики вредоносных программ сталкиваются с новыми проблемами, что делает их атаки менее эффективными.

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

Рекомендации для всех пользователей Android

Настоятельно рекомендую вам поделиться этими советами со всеми пользователями Android.

  • Не устанавливайте приложения из ненадежных источников, кроме Google Play.
  • Не давайте разрешения вновь установленным приложениям, если вы не уверены в их необходимости.
  • Будьте осторожны при переходе по ссылкам, полученным от неизвестных отправителей. Если у вас возникли подозрения, посоветуйтесь с технологически подкованным другом или членом семьи.

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

Читайте также:

Читайте нас в Telegram, VK и Дзен


Перевод статьи Krzysztof Pranczk: Detecting Malware Installed on Android Devices

Предыдущая статьяПовышение эффективности промпт-инжиниринга путем поиска по программам в символьной записи
Следующая статьяMap-ориентированное программирование в Java