Описание вредоносного ПО

Triada наносит ответный удар

Введение

Старые версии Android содержали различные уязвимости, позволявшие получить root-доступ к устройству. Многие зловреды активно эксплуатировали их для повышения привилегий и закрепления в системе. Знаменитый троянец Triada также использовал этот вектор атаки. Со временем уязвимости были устранены, а в прошивках добавлены ограничения: в частности, системные разделы в новых версиях Android нельзя редактировать даже с правами суперпользователя. Интересно, что в какой-то мере это сыграло на руку злоумышленникам: хотя вредоносные программы, попавшие на устройство извне, были урезаны в правах, предустановленные зловреды в системных разделах, напротив, стали неудаляемыми. Злоумышленники активно используют эту особенность и встраивают вредоносное ПО в прошивки Android-устройств. Например, так делала одна из наших находок — загрузчик Dwphon, который был встроен в системные приложения для OTA-обновлений (over-the-air). Наше исследование в марте 2025 года показало, что троянец Triada тоже адаптировался к трудностям с повышением привилегий в новых версиях Android: злоумышленники встроили новый многоуровневый загрузчик в прошивки ряда устройств, что привело к заражению процесса Zygote и, как следствие, — любого запущенного приложения в системе.

Наши выводы в двух словах:

  • Мы обнаружили новые версии троянца Triada в устройствах, прошивки которых оказались заражены еще перед продажей. Это подделки под смартфоны известных брендов, и на момент исследования они по-прежнему были доступны на различных маркетплейсах.
  • Копия троянца попадает в каждое приложение при его запуске на зараженном устройстве. Поскольку в основе зловреда лежит модульная архитектура, атакующие получают практически безлимитный контроль над всей системой, включая возможность адаптировать функциональность под конкретные приложения.
  • Изученные полезные нагрузки в текущей версии Triada, в зависимости от приложения, в котором они работают, меняют адреса криптокошельков при попытке перевода криптовалюты, подменяют ссылки в браузерах, отправляют произвольные SMS-сообщения и перехватывают ответы на них, а также крадут учетные данные от мессенджеров и социальных сетей.

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

Цепочка заражения троянцем Triada

Цепочка заражения троянцем Triada

Решения «Лаборатории Касперского» детектируют новую версию Triada с вердиктом Backdoor.AndroidOS.Triada.z.

Системный фреймворк с вредоносной зависимостью

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

  • /system/framework/arm/binder.so
  • /system/framework/arm64/binder.so

В эталонной версии Android такого файла нет. Как выяснилось, подозрительную библиотеку загружал в Zygote — родительский процесс для любого Android-приложения — зараженный AOT-скомпилированный системный фреймворк Android ( boot-framework.oat), расположенный в той же директории.

Вредоносная зависимость в boot-framework.oat

Вредоносная зависимость в boot-framework.oat

Библиотека binder.so регистрирует нативный метод println_native для класса android.util.Log, который используется приложениями на устройстве для записи сообщений в журнал Logcat. Реализация этого метода вызывает подозрительную функцию _config_log_println.

Вызов подозрительной функции

Вызов подозрительной функции

Функция _config_log_println, в свою очередь, вызывает две другие функции, которые разворачивают в каждом запускаемом процессе три модуля, содержащихся в секции rodata вредоносной библиотеки. Одна из функций запускается в любом случае, вторая – только если версия Android на устройстве не выше 9-й.

Запуск двух вредоносных функций

Запуск двух вредоносных функций

Рассмотрим подробнее модули, которые они запускают.

1. Вспомогательный модуль

Этот модуль из секции rodata вредоносной библиотеки записывается во внутреннюю директорию приложения data под именем systemlibarm64_%N%.jar, где N — случайное число.

Загрузка вспомогательного модуля

Загрузка вспомогательного модуля

Вспомогательный модуль регистрирует ресивер, позволяющий загружать произвольные файлы с кодом, хотя в описанных ниже случаях мы не видели подобной активности. Забегая вперед, мы назвали этот модуль вспомогательным, поскольку он использовался другими полезными нагрузками для выполнения своих вредоносных функций. Так, для класса com.android.core.info.config.JvmCore из этого модуля binder.so регистрирует нативные методы, с помощью которых можно перехватывать вызовы произвольных методов в процессе, где работает зловред.

2. Бэкдор mms-core.jar

Этот модуль дважды расшифровывается XOR-методом с разными ключами из секции rodata вредоносной библиотеки, а затем сохраняется на диск по пути /data/data/%PACKAGE%/mms-core.jar и загружается с помощью DexClassLoader. После загрузки файл полезной нагрузки удаляется.

Загрузка бэкдора

Загрузка бэкдора

mms-core.jar — новая версия бэкдора, который упоминался ранее в наших отчетах. Если до этого он загружался в процесс Zygote с помощью эксплуатации и дальнейшей модификации системных файлов, то теперь зловред гарантированно попадает в Zygote, поскольку загружается зараженным системным фреймворком. Как и в предыдущих версиях, этот бэкдор скачивает и запускает другие полезные нагрузки.

3. Криптостилер или дроппер?

В самом начале своей работы библиотека binder.so читает файл /proc/%PID%/cmdline, где %PID% — идентификатор процесса в системе. Таким образом троянец определяет имя пакета запущенного приложения.

Проверка имени пакета

Проверка имени пакета

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

Криптостилер Triada

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

Точкой входа во вредоносном загрузчике является метод onCreate класса com.hwsen.abc.SDK. В последних версиях этот модуль запрашивает конфигурацию из репозитория на GitHub: при помощи генератора псевдослучайных чисел образец выбирает число 0, 1 или 2, каждому из которых соответствует адрес конкретного репозитория.

Загрузка конфигурации

Загрузка конфигурации

Все значения полей в конфигурации зашифрованы алгоритмом AES-128 в режиме ECB и закодированы с помощью Base64. Пример расшифрованной конфигурации приведен ниже.

Если поле online принимает значение true, то загрузчик скачивает полезную нагрузку с URL-адреса, указанного в поле durl. При возникающих ошибках он использует durl2 и durl3 в качестве запасных ссылок. Скачиваемая полезная нагрузка расшифровывается с помощью XOR с заданным ключом и записывается во внутреннюю директорию data приложения под именем из параметра vname. Поля pkg и method являются именем класса и методом, которые будут вызваны после загрузки криптостилера через DexClassLoader.

Скачанная полезная нагрузка пытается украсть криптовалюту жертвы разными способами. К примеру, с заданным интервалом она мониторит запущенную активность. Это необходимо троянцу для того, чтобы при попытке вывода криптовалюты поменять в соответствующих текстовых элементах адреса криптокошельков жертвы на адреса злоумышленников. Для этого в текущей активности зловред обходит в глубину все графические подэлементы текущего фрейма, таким образом определяя блокчейн, в который выводятся средства. Затем троянец подменяет адрес криптокошелька на прописанный в коде, а обработчики нажатия всех кнопок в приложении — на прокси-обработчик. Последний подменяет адрес криптокошелька еще раз, давая таким образом злоумышленникам гарантию кражи средств. Интересно, что криптостилер также заменяет элементы с картинками на сгенерированные QR-коды с адресами кошельков, подконтрольных злоумышленникам.

Подмена текстовых элементов и картинок

Подмена текстовых элементов и картинок

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

Подмена содержимого буфера обмена

Подмена содержимого буфера обмена

Дроппер

Если же библиотека binder.so запущена в приложении, не связанном с криптовалютой, она загружает другую полезную нагрузку, в которой вызывает метод onCreate класса com.system.framework.api.vp2130.services. Эта нагрузка — дроппер, который в зависимости от версии может загружать из своего содержимого до трех дополнительных модулей, закодированных с помощью Base64.

  • В первом модуле загружается класс com.android.packageinstaller.apiv21.ApiV21 в системном приложении для установки APK-файлов. Этот класс регистрирует ресивер, который позволяет другим модулям устанавливать на устройство произвольные APK, а также удалять любые приложения.
Вредоносный ресивер

Вредоносный ресивер

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

  • Во втором модуле загружается класс com.system.framework.audio.Audio для блокировки сетевых соединений. В зависимости от архитектуры системы он декодирует и загружает вспомогательную нативную библиотеку, которая с помощью библиотеки xhook перехватывает вызовы функций getaddrinfo и android_getaddrinfofornet. Эти функции реализуют протокол общения со службой dnsproxyd в Android, которая осуществляет DNS-запросы и работает по шаблону «клиент-сервер». Если злоумышленники отправили команду на блокировку конкретного домена, то его имя подменяется хуком, ведущим на 127.0.0.1, делая обращение к исходному домену невозможным.
Перехват функций для взаимодействия с dnsproxyd

Перехват функций для взаимодействия с dnsproxyd

Таким образом, к примеру, зловред может блокировать запросы к антифрод-сервисам, если они не используют самодельную реализацию DNS.

  • В третьем модуле загружается класс com.system.framework.api.init.services для скачивания произвольных полезных нагрузок. Для этого зловред регулярно отправляет запросы на командный сервер с большим количеством информации об устройстве (MAC-адрес, модель, процессор, производитель, IMEI, IMSI и т. д.), а также названием и версией приложения, в котором запущен троянец. Перед отправкой данные шифруются алгоритмом AES-128 в режиме CBC, а также кодируются при помощи Base64. В ответ C2 возвращает JSON, в котором содержится информация о полезной нагрузке, также зашифрованная с помощью AES-128 в режиме CBC. Ключ и IV передаются командным сервером зараженному устройству в том же JSON и шифруются алгоритмом RSA.
Декодирование, загрузка и запуск полезной нагрузки

Декодирование, загрузка и запуск полезной нагрузки

Для удобства далее этот модуль мы будем называть «бэкдор Triada». Именно он представляет наибольший интерес для исследования, поскольку дает зловреду широкие возможности. Мы решили подробно изучить, какие цели преследуют злоумышленники, стоящие за Triada, и были несколько удивлены: если ранее вредоносные образцы в основном показывали рекламу и оформляли платные подписки, то теперь приоритеты злоумышленников кардинально изменились.

Что скачивает Triada

Чтобы понять, как именно изменились приоритеты злоумышленников, мы решили попробовать скачать полезные нагрузки для различных популярных приложений. Мы обратили внимание, что вредоносная библиотека binder.so передает описанному выше дропперу при запуске флаг, который устанавливается, если имя приложения содержится в списке из кода библиотеки. Среди этих приложений есть как системные, так и популярные приложения из официальных магазинов.

Некоторые приложения из binder.so

Некоторые приложения из binder.so

Этот список послужил отправной точкой в нашем исследовании. Для всех перечисленных приложений мы отправили запросы к командному серверу зловреда и в ответ на некоторые из них получили ссылки на скачивание полезных нагрузок. Например, такой ответ прислал нам троянец после того, как мы запросили полезную нагрузку для мессенджера Telegram.

Информация о полезных нагрузках с С2 приходила в виде массива объектов, каждый из которых содержал две ссылки на скачивание (основную и запасную), MD5-хэш скачиваемого файла, информацию о точке входа модуля, а также его идентификатор. Модули после скачивания дважды расшифровывались с помощью XOR с разными ключами.

Triada расшифровывает полезную нагрузку

Triada расшифровывает полезную нагрузку

Помимо этого, ответ с C2 содержал другие имена пакетов, используя которые мы смогли получить различные дополнительные полезные нагрузки.

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

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

Модули для Telegram

Для мессенджера Telegram бэкдор Triada на момент исследования скачивал два модуля. Первый модуль (b8a745bdc0e083ffc88a524c7f465140) раз в сутки запускает вредоносную задачу в контексте мессенджера. Мы полагаем, что перед написанием кода этой задачи злоумышленники подробно изучили внутренности Telegram.

Код вредоносной задачи

Код вредоносной задачи

Сначала вредоносная задача пытается получить данные об учетной записи жертвы. Для этого модуль читает строку с ключом user из пар «ключ — значение», сохраненных при помощи SharedPreferences в XML-файле настроек приложения под названием userconfig. Эта строка содержит закодированные в формате Base64 сериализованные данные о пользователе Telegram, которые десериализуются в коде клиента мессенджера для взаимодействия с API. Этим и пользуется зловред: Triada последовательно несколькими способами пробует с помощью рефлексии прочитать данные о пользователе.

Десериализация данных учетной записи жертвы

Десериализация данных учетной записи жертвы

Зловред отправляет следующую информацию о пользователе на командный сервер, если ранее этого не делал:

  • Сериализованную строку с данными учетной записи жертвы.
  • Номер телефона жертвы.
  • Содержимое файла tgnet.dat из директории data приложения.

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

  • Строку с id=1 из таблицы params в базе данных cache4.db.

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

Второй модуль (fce117a9d7c8c73e5f56bda7437bdb28) декодирует с помощью Base64 и запускает другую полезную нагрузку (8f0e5f86046faed1d06bca7d3e48c0b8). Она регистрирует собственный обозреватель новых сообщений в мессенджере, который проверяет их содержимое. Если текст сообщения удовлетворяет регулярным выражениям, которые троянец получает с С2, то оно удаляется из клиента. Также этот модуль пытается удалить оповещения от Telegram о новых сессиях.

Фильтрация сообщений на основе их содержимого

Фильтрация сообщений на основе их содержимого

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

Инициирование переписки с неизвестным ботом

Инициирование переписки с неизвестным ботом

Модуль для Instagram*

Этот модуль (3f887477091e67c6aaca15bce622f485) в самом начале своей работы запрашивает из сервисов Google Play рекламный идентификатор устройства, который используется как идентификатор жертвы. Далее раз в сутки запускается вредоносная задача, последовательно проходящаяся по всем XML-файлам из SharedPreferences, пока не найдет первый файл, название которого начинается на UserCookiePrefsFile_. В нем содержатся cookie-файлы активных сессий в Instagram* — перехват таких сессий предоставляет злоумышленникам контроль над аккаунтом жертвы. Задача также собирает все файлы, названия которых заканчиваются на batch, из каталога analytics в директории data.

Чтение внутренних файлов зловредом

Чтение внутренних файлов зловредом

Эти файлы вместе с информацией о зараженном устройстве отправляются на С2 закодированными в Base64.

Модуль для браузеров

Этот модуль (98ece45e75f93c5089411972f9655b97) загружается в браузерах со следующими именами пакетов:

  • com.android.chrome
  • org.mozilla.firefox
  • com.microsoft.emmx
  • com.microsoft.emmx.canary
  • com.heytap.browser
  • com.opera.browser
  • com.sec.android.app.sbrowser
  • com.chrome.beta

Сначала он устанавливает связь с C2 поверх TCP-сокетов, после чего при помощи алгоритма RSA зашифровывает конкатенацию IV и ключа для AES-128 в режиме CBC. Троянец использует AES для шифрования информации о зараженном устройстве, а затем объединяет ее с ключом и IV в один большой буфер, который посылает в TCP-сокет.

Фрагмент кода для взаимодействия с С2

Фрагмент кода для взаимодействия с С2

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

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

Запуск функциональности в зависимости от браузера

Запуск функциональности в зависимости от браузера

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

Использование вспомогательного модуля

Использование вспомогательного модуля

Помимо этого, зловред с помощью рефлексии подменяет экземпляр класса Instrumentation для приложения. В прокси-классе подменен метод execStartActivity, который запускает активности приложения.

Вредоносный вызов в прокси-классе Instrumentation

Вредоносный вызов в прокси-классе Instrumentation

Активности приложения в Android запускаются путем широковещательной рассылки объекта намерения (Intent) с определенным действием. Если у приложения есть активность, в фильтре намерений которой объявлена возможность обрабатывать такое действие, то Android запустит ее. Когда любое приложение открывает ссылку в браузере, оно создает и посылает экземпляр класса Intent с действием android.intent.action.VIEW, куда помещает URI для открытия. Triada подменяет URI в полученном экземпляре класса.

Подмена ссылки в экземпляре класса Intent

Подмена ссылки в экземпляре класса Intent

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

Модули для WhatsApp

Для WhatsApp командный сервер троянца отдавал два модуля. Один из них (d5bc1298e436424086cb52508fb104b1) раз в пять минут запускает вредоносную задачу в контексте клиента WhatsApp. Она читает различные ключи, необходимые для работы клиента, а также данные об активной сессии.

Чтение троянцем учетных данных клиента WhatsApp

Чтение троянцем учетных данных клиента WhatsApp

Эти данные вместе с информацией об устройстве жертвы отправляются на С2-сервер, таким образом предоставляя злоумышленникам полный доступ к аккаунту жертвы в мессенджере.

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

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

  • отправлять произвольные сообщения в мессенджере;
  • локально удалять отправленные сообщения, чтобы замести следы;
  • закрывать соединение.
Фрагмент обработчика команд

Фрагмент обработчика команд

Модуль для LINE

Этот модуль (1d582e2517905b853ec9ebfe77759d15) запускается внутри мессенджера LINE. Сначала зловред собирает информацию о зараженном устройстве и отправляет ее на C2-сервер. Затем он начинает раз в 30 секунд собирать внутренние данные мессенджера, в частности значения полей PROFILE_AUTH_KEY и PROFILE_MID из таблицы settings в базе данных naver_line. Также вредоносный модуль получает строку User-Agent и дополнительную информацию для эмуляции HTTP-запросов якобы от клиента мессенджера. Помимо этого, зловред расшифровывает из базы данных naver_line номер телефона пользователя и его регион. Также с помощью рефлексии он получает токен доступа приложения, позволяющий перехватить управление учетной записью жертвы.

Получение токена доступа

Получение токена доступа

Полученные данные модуль отправляет на командный сервер.

Сбор и отправка полученных данных

Сбор и отправка полученных данных

Модуль для Skype

Этот модуль (b87706f7fcb21f3a4dfdd2865b2fa733) раз в две минуты запускает вредоносную задачу, которая пытается отправить информацию о зараженном устройстве на С2. Как только С2 принимает запрос, задача останавливается и троянец начинает раз в час читать внутренние файлы Skype. Сначала модуль пытается извлечь токен, позволяющий получить доступ к учетной записи Skype, из связки ключей фреймворка React Native.

Triada извлекает токен из связки ключей

Triada извлекает токен из связки ключей

Если зловреду не удается получить токен таким образом, он пытается найти его в cookie-файлах WebView.

Извлечение токена из cookie-файлов

Извлечение токена из cookie-файлов

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

Модуль для TikTok

Этот модуль (993eb2f8bf8b5c01b30e3044c3bc10a3) раз в сутки отправляет информацию о зараженном устройстве на сервер злоумышленников. Помимо этого, зловред собирает множество различных данных об учетной записи жертвы: например, читает кэшированные cookie-файлы TikTok из внутренней директории, которые могли использоваться WebView внутри приложения. В cookie-файлах злоумышленников интересует msToken, необходимый для работы с TikTok API. Модуль также извлекает другую информацию из клиента: идентификатор пользователя TikTok secUID, User-Agent для запросов к API и т. д. Мы полагаем, что эти данные нужны злоумышленникам, чтобы обойти ограничения TikTok API и эмулировать реальное устройство при запросах к API. Раз в пять минут вредоносный модуль пытается отправить всю собранную информацию на сервер злоумышленников.

Кража данных учетной записи TikTok

Кража данных учетной записи TikTok

Модули для Facebook*

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

  • com.facebook.lite
  • com.facebook.mlite
  • com.facebook.orca

Если имя пакета приложения совпадает с одним из вышеперечисленных, то зловред похищает cookie-файлы, необходимые для авторизации в Facebook*.

Кража учетных данных для Facebook*

Кража учетных данных для Facebook*

Другой модуль (554f0de0bddf30589482315fe336ea72) отправляет на C2 данные о зараженном устройстве. В ответ сервер злоумышленников присылает ссылку для открытия в WebView, а также JavaScript-код для выполнения на открывшейся странице. Некоторые элементы на ней зловред способен загружать на командный сервер, что в теории может использоваться злоумышленниками для кражи данных об аккаунте жертвы.

SMS-модули

Эти полезные нагрузки встраиваются в приложения для обмена SMS-сообщениями. Одна из них (195e0f334beb34c471352179d422c42f) в начале работы регистрирует свой прокси-ресивер для входящих SMS и MMS, а также собственный обозреватель сообщений. После этого зловред получает с C2-сервера правила, которые сохраняет в отдельной базе данных, — на их основе фильтруется содержимое каждого полученного сообщения.

Проверка содержимого сообщения

Проверка содержимого сообщения

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

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

Правило для перехвата SMS от WhatsApp

Правило для перехвата SMS от WhatsApp

Второй модуль (2ac5414f627f8df2e902fc34a73faf44), скорее всего, является вспомогательным для первого. Дело в том, что при отправке SMS Android проверяет адресата. Если сообщение отправляется на короткий номер (Premium SMS), пользователю необходимо будет подтвердить отправку. Это сделано для предотвращения потери средств владельцем устройства, если тот столкнется с SMS-троянцами. Класс SMSDispatcher во фреймворке Android проверяет, есть ли у конкретного приложения разрешение на отправку Premium SMS. Для этого он вызывает метод getPremiumSmsPermission у класса SmsUsageMonitor, который хранит политики отправки Premium SMS для каждого приложения с помощью механизма SharedPreferences по ключу premium-sms-policy. Политики являются целым числом и могут принимать следующие значения:

  • 1 — перед отправкой Premium SMS нужно подтверждение пользователя.
  • 2 — отправка Premium SMS запрещена для приложения.
  • 3 — отправка Premium SMS разрешена, подтверждение пользователя не требуется.

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

Метод для подмены политик отправки Premium SMS

Метод для подмены политик отправки Premium SMS

Реверс-прокси

Этот модуль (3dc21967e6fab9518275960933c90d04), по нашим данным, встраивается в приложение сервисов Google Play. В самом начале своей работы он передает сведения о зараженном устройстве на командный сервер. В ответ С2 отправляет IP-адрес и порт, с которого зловред слушает команды при помощи модифицированной версии библиотеки EasySocket. Команды являются целыми числами и могут принимать три значения:

  • 1 — установить TCP-соединение с произвольным IP-адресом с заданным портом и присвоить ему ID, переданный в команде.
  • 2 — разорвать TCP-соединение с заданным ID.
  • 4 — послать данные по TCP-соединению с заданным ID.
Обработка полученных данных

Обработка полученных данных

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

Перехват звонков

Этот модуль (a4f16015204db28f5654bb64775d75ad) загружается в приложении для вызовов по сотовой связи. Он регистрирует вредоносный ресивер, который при получении определенных объектов намерений (Intent) может выполнять произвольный JavaScript-код с помощью WebView.

Выполнение произвольного кода с помощью вредоносного ресивера

Выполнение произвольного кода с помощью вредоносного ресивера

Зловред предоставляет JavaScript-коду интерфейс для вызова некоторых Java-функций. Одна из функций принимает номер телефона жертвы и посылает содержащий его объект намерения.

Intent с номером телефона

Intent с номером телефона

Номер команды передается в поле type объекта намерения. Однако в модуле отсутствует обработчик номера — мы предполагаем, что он реализован в другой полезной нагрузке, которую нам не удалось получить в ходе исследования.

Мы также считаем, что этот модуль по-прежнему находится в разработке. К примеру, по аналогии с модулем для браузеров он подменяет класс Instrumentation для замены номера, открываемого с помощью объекта намерения android.intent.action.VIEW. Однако кода для подмены номера в модуле нет.

Прокси-класс Instrumentation

Прокси-класс Instrumentation

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

Клиппер

Этот модуль (04e485833e53aceb259198d1fcba7eaf), по нашим данным, встраивается в приложение Google Play. В начале работы он запрашивает с командного сервера список криптокошельков злоумышленников, разделенный запятыми. Если адреса получить не удалось, троянец использует данные из своего кода. После этого модуль раз в две секунды проверяет содержимое буфера обмена и, если обнаруживает там адрес криптокошелька, меняет его на подконтрольный злоумышленникам. Кроме того, зловред регистрирует обработчик событий изменения буфера обмена, где также проверяет и подменяет содержимое.

Подмена содержимого буфера обмена

Подмена содержимого буфера обмена

Дополнительный модуль

В предыдущем отчете мы описывали вредоносные модули, которые скачивает первый бэкдор Triada. Мы решили проверить, изменился ли список его полезных нагрузок. К сожалению, на момент исследования командный сервер бэкдора не отправлял ссылки на скачивание дополнительных модулей. Однако мы обратили внимание, что для точек входа модулей используется одинаковый специальный формат имен — далее расскажем о нем подробнее. Так нам удалось найти еще один зловред Triada в нашей телеметрии. Этот модуль называется BrsCookie_1004 (952cc6accc50b75a08bb429fb838bff7) и предназначен для перехвата cookie-файлов от Instagram* в браузерах.

Кража cookie-файлов

Кража cookie-файлов

Особенности кампании

В ходе анализа этого троянца мы выявили множество интересных деталей. Например, прослеживается его сходство с ранними версиями Triada (308e35fb48d98d9e466e4dfd1ba6ee73): в них реализована такая же логика загрузки дополнительных модулей, как и в бэкдоре mms-core.jar, который разворачивался зараженным фреймворком.

Загрузка модулей в старых версиях Triada

Загрузка модулей в старых версиях Triada

Загрузка модулей в mms-core.jar

Загрузка модулей в mms-core.jar

Кроме того, в коде модулей регулярно встречаются строки, начинающиеся на PPP.

Создание записи журнала в старой версии Triada

Создание записи журнала в старой версии Triada

Загрузка модуля в binder.so в новой версии Triada

Загрузка модуля в binder.so в новой версии Triada

Функции из вредоносной библиотеки binder.so устанавливают системные свойства, аналогичные свойствам в предыдущих версиях Triada. Эти и другие сходства позволяют нам утверждать, что исследуемый образец является новой версией Triada.

В ходе анализа модулей нам встречались комментарии на китайском языке, из чего мы можем сделать вывод, что разработчики являются носителями китайского. Помимо этого, наше внимание привлек один из С2-серверов, к которому обращались модули Triada: g.sxim[.]me. Этот домен также использовался как С2 одного из модулей бэкдора Vo1d, что указывает на его потенциальную связь с Triada.

Вектор распространения

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

Жалоба пользователя на поддельное устройство

Жалоба пользователя на поддельное устройство

Жертвы

По данным телеметрии KSN, наши защитные решения зафиксировали более 4500 зараженных устройств по всему миру. Больше всего зараженных устройств было зафиксировано в России, Великобритании, Нидерландах, Германии и Бразилии. При этом реальное число заражений может быть гораздо выше, учитывая нестандартный вектор распространения, описанный в этой статье. На диаграмме ниже представлен TOP 10 стран по количеству атакованных пользователей за период с 13 марта по 15 апреля 2025 года.

TOP 10 стран по количеству атакованных Triada пользователей, 13 марта – 15 апреля 2025 г. (скачать)

Отдельно мы решили посчитать, сколько криптовалюты украли авторы Triada. Для этого мы составили запрос к командным серверам троянца и получили в ответ адреса кошельков для подмены. Поиск по открытым источникам показал, что злоумышленники с 13 июня 2024 года получили на подконтрольные им криптокошельки более 264 тысяч долларов в различных криптовалютах. Ниже приведен график с балансом некоторых кошельков злоумышленников.

График доходности TRON-кошельков злоумышленников (скачать)

Заключение

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

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

* Instagram и Facebook принадлежат корпорации Meta, которая признана в России экстремистской организацией.

Индикаторы компрометации

Зараженные системные фреймворки

f468a29f836d2bba7a2b1a638c5bebf0
72cbbc58776ddc44abaa557325440bfb
fb937b1b15fd56c9d8e5bb6b90e0e24a
2ac4d8e1077dce6f4d2ba9875b987ca7
7b8905af721158731d24d0d06e6cb27e
9dd92503bd21d12ff0f2b9740fb6e529

Зараженные нативные библиотеки

89c3475be8dba92f4ee7de0d981603c1
01dff60fbf8cdf98980150eb15617e41
18fef4b6e229fc01c8b9921bb0353bb0
21be50a028a505b1d23955abfd2bdb3e
43adb868af3812b8f0c47e38fb93746a
511443977de2d07c3ee0cee3edae8dc8
716f0896b22c2fdcb0e3ee56b7c5212f
83dbc4b95f9ae8a83811163b301fe8c7
8892c6decebba3e26c57b20af7ad4cca
a7127978fac175c9a14cd8d894192f78
a9a106b9df360ec9d28f5dfaf4b1f0b5
c30c309e175905ffcbd17adb55009240
c4efe3733710d251cb041a916a46bc44
e9029811df1dd8acacfe69450b033804
e961cb0c7d317ace2ff6159efe30276a

Модули

Целевое приложение MD5
Telegram fce117a9d7c8c73e5f56bda7437bdb28
b8a745bdc0e083ffc88a524c7f465140
8f0e5f86046faed1d06bca7d3e48c0b8
WhatsApp dc731e55a552caed84d04627e96906d5
d5bc1298e436424086cb52508fb104b1
Instagram* 3f887477091e67c6aaca15bce622f485
Браузеры 98ece45e75f93c5089411972f9655b97
TikTok 993eb2f8bf8b5c01b30e3044c3bc10a3
Facebook* b187551675a234c3584db4aab2cc83a9
554f0de0bddf30589482315fe336ea72
11aa55cd3556afa80412e512acfbd01d
Skype b87706f7fcb21f3a4dfdd2865b2fa733
LINE 1d582e2517905b853ec9ebfe77759d15
Google Play 2e98c16d949022e42956aaa9af908187
04e485833e53aceb259198d1fcba7eaf
Приложение для SMS 195e0f334beb34c471352179d422c42f
2ac5414f627f8df2e902fc34a73faf44
Сервисы Google Play 3dc21967e6fab9518275960933c90d04
Приложение для звонков a4f16015204db28f5654bb64775d75ad

C2-серверы модулей

lnwxfq[.]qz94[.]com
8.218.194[.]192
g.sxim[.]me
68u91[.]66foh90o[.]com
jmll4[.]66foh90o[.]com
w0g25[.]66foh90o[.]com
tqq6g[.]66foh90o[.]com
zqsvl[.]uhabq9[.]com
hm1es[.]uhabq9[.]com
0r23b[.]uhabq9[.]com
vg1ne[.]uhabq9[.]com
is5jg[.]3zweuj[.]com
qrchq[.]vrhoeas[.]com
xjl5a[.]unkdj[.]xyz
lvqtcqd[.]pngkcal[.]com
xc06a[.]0pk05[.]com
120.79.89[.]98
xcbm4[.]0pk05[.]com
lptkw[.]s4xx6[.]com
ad1x7[.]mea5ms[.]com
v58pq[.]mpvflv[.]com
bincdi[.]birxpk[.]com
773i8h[.]k6zix6[.]com
ya27fw[.]k6zix6[.]com

CDN-серверы для доставки вредоносных модулей

mp2y3[.]sm20j[.]xyz
ompe2[.]7u6h8[.]xyz
app-file.b-cdn[.]net

Конфигурации на GitHub

hxxps://raw.githubusercontent[.]com/adrdotocet/ott/main/api.json
hxxps://raw.githubusercontent[.]com/adrdotocet2/ott/main/api.json
hxxps://raw.githubusercontent[.]com/adrdotocet3/ott/main/api.json

Системные свойства Triada

os.config.ppgl.ext.hws.cd
os.config.ppgl.btcore.devicekey
os.config.ppgl.version
os.config.opp.build.model
os.config.opp.build.status
os.config.ppgl.status
os.config.ppgl.status.rom
os.config.ppgl.build.vresion
os.config.hk.status
os.config.ppgl.cd
os.config.ppgl.dir
os.config.ppgl.dexok
os.config.ppgl.btcore.sericode
os.config.verify.status
os.config.alice.build.channel
os.config.alice.build.time
os.config.alice.service.status
os.android.version.alice.sure

Triada наносит ответный удар

Ваш e-mail не будет опубликован. Обязательные поля помечены *

 

Отчеты
Подпишитесь на еженедельную рассылку

Самая актуальная аналитика – в вашем почтовом ящике