
Введение
Старые версии Android содержали различные уязвимости, позволявшие получить root-доступ к устройству. Многие зловреды активно эксплуатировали их для повышения привилегий и закрепления в системе. Знаменитый троянец Triada также использовал этот вектор атаки. Со временем уязвимости были устранены, а в прошивках добавлены ограничения: в частности, системные разделы в новых версиях Android нельзя редактировать даже с правами суперпользователя. Интересно, что в какой-то мере это сыграло на руку злоумышленникам: хотя вредоносные программы, попавшие на устройство извне, были урезаны в правах, предустановленные зловреды в системных разделах, напротив, стали неудаляемыми. Злоумышленники активно используют эту особенность и встраивают вредоносное ПО в прошивки Android-устройств. Например, так делала одна из наших находок — загрузчик Dwphon, который был встроен в системные приложения для OTA-обновлений (over-the-air). Наше исследование в марте 2025 года показало, что троянец Triada тоже адаптировался к трудностям с повышением привилегий в новых версиях Android: злоумышленники встроили новый многоуровневый загрузчик в прошивки ряда устройств, что привело к заражению процесса Zygote и, как следствие, — любого запущенного приложения в системе.
Наши выводы в двух словах:
- Мы обнаружили новые версии троянца Triada в устройствах, прошивки которых оказались заражены еще перед продажей. Это подделки под смартфоны известных брендов, и на момент исследования они по-прежнему были доступны на различных маркетплейсах.
- Копия троянца попадает в каждое приложение при его запуске на зараженном устройстве. Поскольку в основе зловреда лежит модульная архитектура, атакующие получают практически безлимитный контроль над всей системой, включая возможность адаптировать функциональность под конкретные приложения.
- Изученные полезные нагрузки в текущей версии Triada, в зависимости от приложения, в котором они работают, меняют адреса криптокошельков при попытке перевода криптовалюты, подменяют ссылки в браузерах, отправляют произвольные SMS-сообщения и перехватывают ответы на них, а также крадут учетные данные от мессенджеров и социальных сетей.
Полная цепочка заражения выглядит следующим образом:
Решения «Лаборатории Касперского» детектируют новую версию Triada с вердиктом Backdoor.AndroidOS.Triada.z.
Системный фреймворк с вредоносной зависимостью
В самом начале исследования наше внимание привлекли нативные библиотеки в прошивках ряда устройств, располагавшиеся по следующим путям:
- /system/framework/arm/binder.so
- /system/framework/arm64/binder.so
В эталонной версии Android такого файла нет. Как выяснилось, подозрительную библиотеку загружал в Zygote — родительский процесс для любого Android-приложения — зараженный AOT-скомпилированный системный фреймворк Android ( 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, которые мы изучили, в приложения для криптовалюты сразу загружался криптостилер. Однако в последних образцах вредоносный модуль оказался загрузчиком, который нацелен на приложения со следующими именами пакетов:
1 2 3 4 5 6 |
com.binance.dev com.wrx.wazirx com.coinex.trade.play com.okinc.okex.gp pro.huobi com.kubi.kucoin |
Точкой входа во вредоносном загрузчике является метод onCreate класса com.hwsen.abc.SDK. В последних версиях этот модуль запрашивает конфигурацию из репозитория на GitHub: при помощи генератора псевдослучайных чисел образец выбирает число 0, 1 или 2, каждому из которых соответствует адрес конкретного репозитория.
Все значения полей в конфигурации зашифрованы алгоритмом AES-128 в режиме ECB и закодированы с помощью Base64. Пример расшифрованной конфигурации приведен ниже.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
{ "addr": { "durl": "https://app-file.b-cdn[.]net/poctest/pc2215202501061400.zip", "durl2": "https://app-file.b-cdn[.]net/poctest/pc2215202501061400.zip", "durl3": "https://app-file.b-cdn[.]net/poctest/pc2215202501061400.zip", "ver": "17", "vname": "pc2215202501061400.zip", "online": "true", "rom": "true", "update": "true", "pkg": "com.android.system.watchdog.x.Main", "method": "onCreate", "param": "t" } } |
Если поле 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, делая обращение к исходному домену невозможным.
Таким образом, к примеру, зловред может блокировать запросы к антифрод-сервисам, если они не используют самодельную реализацию 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 передает описанному выше дропперу при запуске флаг, который устанавливается, если имя приложения содержится в списке из кода библиотеки. Среди этих приложений есть как системные, так и популярные приложения из официальных магазинов.
Этот список послужил отправной точкой в нашем исследовании. Для всех перечисленных приложений мы отправили запросы к командному серверу зловреда и в ответ на некоторые из них получили ссылки на скачивание полезных нагрузок. Например, такой ответ прислал нам троянец после того, как мы запросили полезную нагрузку для мессенджера Telegram.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
{ "a": 0, "b": "40E315FB00M8EP2G49008INIK7000002", "c": 1373225559, "d": [{ "a": 72, "b": "http://ompe2.7u6h8[.]xyz/tgzip/44a08dc22b45b9418ed427fd24c192c6.zip", "c": "com.tgenter.tmain.Engine", "d": "start", "e": 32, "f": "44a08dc22b45b9418ed427fd24c192c6", "g": "https://mp2y3.sm20j[.]xyz/tgzip/44a08dc22b45b9418ed427fd24c192c6.zip" }, { "a": 127, "b": "http://ompe2.7u6h8[.]xyz/tgzip/tgnetuser/online/37fd87f46e95f431b1977d8c5741d2d5.zip", "c": "com.androidx.tlttl.tg.CkUtils", "d": "init", "e": 7, "f": "37fd87f46e95f431b1977d8c5741d2d5", "g": "https://mp2y3.sm20j[.]xyz/tgzip/tgnetuser/online/37fd87f46e95f431b1977d8c5741d2d5.zip" } ], "e": 245, "g": ["com.instagram.android"], "h": "org.telegram.messenger.web,org.telegram.messenger,com.whatsapp.w4b,com.fmwhatsapp,com.gbwhatsapp,com.yowhatsapp,com.facebook.lite,com.facebook.orca,com.facebook.mlite,com.skype.raider,com.zhiliaoapp.musically,com.obwhatsapp,com.ob3whatsapp,com.ob2whatsapp,com.jtwhatsapp,com.linkedin.android,com.zhiliaoapp.musically.go,com.opera.browser.afin,com.heytap.browser,com.sec.android.app.sbrowser,org.mozilla.firefox,com.microsoft.emmx,com.microsoft.emmx.canary,com.opera.browser" } |
Информация о полезных нагрузках с С2 приходила в виде массива объектов, каждый из которых содержал две ссылки на скачивание (основную и запасную), MD5-хэш скачиваемого файла, информацию о точке входа модуля, а также его идентификатор. Модули после скачивания дважды расшифровывались с помощью XOR с разными ключами.
Помимо этого, ответ с 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 присылает буфер, зашифрованный теми же параметрами, что и запрос от зараженного устройства. В ответе содержится задание на периодическую подмену ссылок, открываемых в браузере. Пример такого задания приведен ниже.
1 2 3 4 5 6 7 8 9 10 11 |
{ "a": 0, "b": 1, "c": 65, "d": { "a": 17, "b": "https://stas.a691[.]com/", "c": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23], "d": 2880 } } |
Подмена ссылок устроена следующим образом. Сначала модуль проверяет версию и название браузера, в котором он работает, чтобы зарегистрировать хуки на соответствующие внутренние методы браузера, отвечающие за открытие ссылок.
В самом начале мы отметили, что на первых этапах троянец загружает вспомогательный модуль, который реализует функциональность перехвата произвольных методов. Модуль для браузеров активно использует его, вмешиваясь таким образом в процесс открытия страницы в различных браузерах.
Помимо этого, зловред с помощью рефлексии подменяет экземпляр класса Instrumentation для приложения. В прокси-классе подменен метод execStartActivity, который запускает активности приложения.
Активности приложения в Android запускаются путем широковещательной рассылки объекта намерения (Intent) с определенным действием. Если у приложения есть активность, в фильтре намерений которой объявлена возможность обрабатывать такое действие, то Android запустит ее. Когда любое приложение открывает ссылку в браузере, оно создает и посылает экземпляр класса Intent с действием android.intent.action.VIEW, куда помещает URI для открытия. Triada подменяет URI в полученном экземпляре класса.
В исследованных нами образцах с командного сервера отправлялись ссылки на рекламные ресурсы, однако мы полагаем, что эту функциональность авторы зловреда могут использовать, например, и в фишинговых целях.
Модули для WhatsApp
Для WhatsApp командный сервер троянца отдавал два модуля. Один из них (d5bc1298e436424086cb52508fb104b1) раз в пять минут запускает вредоносную задачу в контексте клиента 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.
Если зловреду не удается получить токен таким образом, он пытается найти его в cookie-файлах WebView.
Этот токен затем отправляется на командный сервер троянца, что компрометирует учетную запись жертвы.
В известных нам версиях Triada отсутствуют полезные нагрузки для Microsoft Teams и Skype для бизнеса. Однако мы полагаем, что после прекращения поддержки Skype злоумышленники могут начать распространять модули для этих приложений.
Модуль для TikTok
Этот модуль (993eb2f8bf8b5c01b30e3044c3bc10a3) раз в сутки отправляет информацию о зараженном устройстве на сервер злоумышленников. Помимо этого, зловред собирает множество различных данных об учетной записи жертвы: например, читает кэшированные cookie-файлы TikTok из внутренней директории, которые могли использоваться WebView внутри приложения. В cookie-файлах злоумышленников интересует msToken, необходимый для работы с TikTok API. Модуль также извлекает другую информацию из клиента: идентификатор пользователя TikTok secUID, User-Agent для запросов к API и т. д. Мы полагаем, что эти данные нужны злоумышленникам, чтобы обойти ограничения TikTok API и эмулировать реальное устройство при запросах к API. Раз в пять минут вредоносный модуль пытается отправить всю собранную информацию на сервер злоумышленников.
Модули для Facebook*
Один из загружаемых модулей (b187551675a234c3584db4aab2cc83a9) запускает с интервалом в минуту вредоносную задачу, которая сравнивает имя пакета родительского приложения со следующим списком:
- com.facebook.lite
- com.facebook.mlite
- com.facebook.orca
Если имя пакета приложения совпадает с одним из вышеперечисленных, то зловред похищает cookie-файлы, необходимые для авторизации в Facebook*.
Другой модуль (554f0de0bddf30589482315fe336ea72) отправляет на C2 данные о зараженном устройстве. В ответ сервер злоумышленников присылает ссылку для открытия в WebView, а также JavaScript-код для выполнения на открывшейся странице. Некоторые элементы на ней зловред способен загружать на командный сервер, что в теории может использоваться злоумышленниками для кражи данных об аккаунте жертвы.
SMS-модули
Эти полезные нагрузки встраиваются в приложения для обмена SMS-сообщениями. Одна из них (195e0f334beb34c471352179d422c42f) в начале работы регистрирует свой прокси-ресивер для входящих SMS и MMS, а также собственный обозреватель сообщений. После этого зловред получает с C2-сервера правила, которые сохраняет в отдельной базе данных, — на их основе фильтруется содержимое каждого полученного сообщения.
Гибкость механизма этих правил позволяет зловреду отвечать на некоторые SMS, извлекая для этого коды из входящих сообщений с помощью регулярных выражений. Мы считаем, что авторы троянца используют эту функциональность преимущественно для оформления платных подписок. Кроме того, модуль способен отправлять произвольные SMS по команде с С2.
В модуле содержатся неиспользуемые фрагменты кода, которые, тем не менее, весьма интересны с точки зрения анализа — они также представляют собой правила фильтрации сообщений. Каждое правило содержит строковое значение, определяющее его тип, — MD5-хэш от некоторых данных. В коде модуля имеются методы matchWhatsapp и matchRegister, которые используют один и тот же тип правила. Анализ метода matchWhatsapp показал, что ранее эта полезная нагрузка умела заметать следы работы других модулей и удалять SMS с кодами подтверждения для входа в аккаунт WhatsApp жертвы. Применение одного и того же типа правила позволяет нам предположить, что метод matchRegister также используется вредоносным модулем для сокрытия своей активности — возможно, злоумышленники незаметно регистрировали учетные записи с его помощью. Вероятнее всего, этот метод больше не используется, потому что на текущий момент зловред поддерживает получение правил с командного сервера.
Второй модуль (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, что еще раз подчеркивает высокую квалификацию авторов зловреда.
Реверс-прокси
Этот модуль (3dc21967e6fab9518275960933c90d04), по нашим данным, встраивается в приложение сервисов Google Play. В самом начале своей работы он передает сведения о зараженном устройстве на командный сервер. В ответ С2 отправляет IP-адрес и порт, с которого зловред слушает команды при помощи модифицированной версии библиотеки EasySocket. Команды являются целыми числами и могут принимать три значения:
- 1 — установить TCP-соединение с произвольным IP-адресом с заданным портом и присвоить ему ID, переданный в команде.
- 2 — разорвать TCP-соединение с заданным ID.
- 4 — послать данные по TCP-соединению с заданным ID.
Таким образом, главная задача этого модуля — превратить зараженное устройство в реверс-прокси, то есть дать злоумышленникам доступ к сети от лица жертвы.
Перехват звонков
Этот модуль (a4f16015204db28f5654bb64775d75ad) загружается в приложении для вызовов по сотовой связи. Он регистрирует вредоносный ресивер, который при получении определенных объектов намерений (Intent) может выполнять произвольный JavaScript-код с помощью WebView.
Зловред предоставляет JavaScript-коду интерфейс для вызова некоторых Java-функций. Одна из функций принимает номер телефона жертвы и посылает содержащий его объект намерения.
Номер команды передается в поле type объекта намерения. Однако в модуле отсутствует обработчик номера — мы предполагаем, что он реализован в другой полезной нагрузке, которую нам не удалось получить в ходе исследования.
Мы также считаем, что этот модуль по-прежнему находится в разработке. К примеру, по аналогии с модулем для браузеров он подменяет класс Instrumentation для замены номера, открываемого с помощью объекта намерения android.intent.action.VIEW. Однако кода для подмены номера в модуле нет.
С высокой степенью уверенности мы полагаем, что функциональность подмены номеров либо реализована в другой версии этого модуля, либо будет добавлена в ближайшее время.
Клиппер
Этот модуль (04e485833e53aceb259198d1fcba7eaf), по нашим данным, встраивается в приложение Google Play. В начале работы он запрашивает с командного сервера список криптокошельков злоумышленников, разделенный запятыми. Если адреса получить не удалось, троянец использует данные из своего кода. После этого модуль раз в две секунды проверяет содержимое буфера обмена и, если обнаруживает там адрес криптокошелька, меняет его на подконтрольный злоумышленникам. Кроме того, зловред регистрирует обработчик событий изменения буфера обмена, где также проверяет и подменяет содержимое.
Дополнительный модуль
В предыдущем отчете мы описывали вредоносные модули, которые скачивает первый бэкдор Triada. Мы решили проверить, изменился ли список его полезных нагрузок. К сожалению, на момент исследования командный сервер бэкдора не отправлял ссылки на скачивание дополнительных модулей. Однако мы обратили внимание, что для точек входа модулей используется одинаковый специальный формат имен — далее расскажем о нем подробнее. Так нам удалось найти еще один зловред Triada в нашей телеметрии. Этот модуль называется BrsCookie_1004 (952cc6accc50b75a08bb429fb838bff7) и предназначен для перехвата cookie-файлов от Instagram* в браузерах.
Особенности кампании
В ходе анализа этого троянца мы выявили множество интересных деталей. Например, прослеживается его сходство с ранними версиями Triada (308e35fb48d98d9e466e4dfd1ba6ee73): в них реализована такая же логика загрузки дополнительных модулей, как и в бэкдоре mms-core.jar, который разворачивался зараженным фреймворком.
Кроме того, в коде модулей регулярно встречаются строки, начинающиеся на PPP.
Функции из вредоносной библиотеки 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 | |
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 наносит ответный удар