В июне 2026 года при мониторинге угроз для Android обнаружено новое вредоносное ПО. Необычным оказалось то, что приложение устанавливалось как обычное пользовательское, но при этом не пыталось маскироваться под легитимный софт — у него вообще не было пользовательского интерфейса. Это натолкнуло на мысль, что приложение может попадать на устройства без ведома владельцев. Дальнейшее расследование подтвердило гипотезу и позволило восстановить всю цепочку заражения.
Основные выводы:
- Обнаружен новый Android-вредонос — многоступенчатый загрузчик, конечная цель которого — рекламное мошенничество и создание прокси-ботнета.
- Вредонос распространялся через встроенные механизмы обновления прошивки автомобильных мультимедийных блоков (head unit) на базе Android. Это первый задокументированный случай обнаружения вредоносного ПО на автомобильном головном устройстве с цепочкой заражения, специфичной именно для этого типа устройств.
- Активность с высокой степенью уверенности приписывается группировке MoYu Group, связанной с ботнетом BADBOX.
Продукты Kaspersky детектируют описанные ниже угрозы под следующими вердиктами:
- HEUR:Trojan-Dropper.AndroidOS.Agent.vu
- HEUR:Trojan-Downloader.AndroidOS.Agent.ov
- HEUR:Trojan-Proxy.AndroidOS.Zhima.*
- HEUR:Trojan.AndroidOS.Vo1d.*
Обзор прошивки головного устройства
Головное устройство (head unit) — это система, совмещающая мультимедийные функции с частичным управлением некоторыми функциями автомобиля. Такие блоки могут поставляться как часть заводской комплектации или устанавливаться как послепродажное обновление. Основные векторы атак на подобные системы — компрометация через физический доступ и уязвимости в ОС или компонентах головного устройства, о чём ранее уже писали в исследовании безопасности головных устройств Mercedes-Benz.
В ряде случаев головные устройства работают на Android, в первую очередь потому, что это удобно производителям: исходный код Android уже учитывает сценарии использования в автомобильных мультимедийных системах. Кроме того, Android позволяет производителям добавлять собственные системные приложения на этапе сборки — для кастомизации интерфейса, добавления компонентов под нужды конкретного вендора и других целей.
Большинство приложений, разработанных для Android-устройств, можно запустить и на головном устройстве на базе Android — это касается и вредоносного ПО. Тем не менее сложно представить использование некоторых категорий вредоносов, нацеленных на смартфоны, для атаки на головное устройство. Хороший пример — банковские трояны: поскольку мобильный банкинг используется практически исключительно на смартфонах, заражение головного устройства банковским трояном стало бы бессмысленной тратой ресурсов злоумышленника.
Стоит отметить, что головные устройства часто оснащены слотами для SIM-карт и могут подключаться к интернету — это обеспечивает навигацию и обновление ПО. Поскольку само по себе головное устройство обычно не представляет ценности для злоумышленника, один из наиболее вероятных сценариев атаки с использованием «классического» Android-вредоноса — вербовка устройства в ботнет, по аналогии с атаками на IoT-устройства.
В ходе исследования обнаружился именно такой вредонос. Особенности прошивки головных устройств DoFun позволили злоумышленникам организовать распространение вредоносного ПО. Вендор был уведомлён о схеме распространения и впоследствии сообщил об устранении проблем безопасности.
Полная цепочка заражения выглядит следующим образом:

Схема заражения головного устройства
Разберём подробнее, как именно происходило заражение этих устройств.
Приложение TWCore
TWCore — легитимное системное приложение, отвечающее за сбор аналитических данных и обновление ПО головного устройства. Рассмотрим подробнее, как работает функция обновления.
Процесс достаточно прост. MQTT-брокер сообщений, размещённый на поддомене cardoor[.]cn, отправляет сообщение с информацией об APK-файлах, которые нужно скачать и установить на головное устройство. Примечательно, что объект, описывающий это сообщение, содержит поле installNotExists — булев флаг, который может принимать значение true или false. Этот флаг позволяет TWCore устанавливать приложения, которых изначально не было на устройстве.

TWCore проверяет, установлено ли приложение, только если installNotExists = false
APK-файл скачивается в <TWCore external cache dir>/push/apk/ для последующей установки.

Путь, который TWCore использует для загрузки APK-файлов
Телеметрия показала ранее неизвестное вредоносное ПО именно по этим путям. Более того, данные свидетельствуют, что во всех зафиксированных случаях вредонос устанавливало приложение с именем пакета com.tw.core, совпадающим с именем пакета TWCore.
Далее разберём вредоносное ПО, устанавливаемое через TWCore, — дроппер JarService.
Этап 1: дроппер JarService
Как уже упоминалось, JarService — небольшое приложение-дроппер без какого-либо интерфейса. Оно расшифровывает данные, хранящиеся в виде зашифрованных блоков внутри кода трояна. Каждый блок зашифрован по XOR однобайтовым ключом, линейно сдвигающимся от блока к блоку. Расшифрованные данные содержат сериализованную информацию о версии полезной нагрузки и точке входа, а также собственный код вредоноса для дальнейшей загрузки.

Расшифровка и десериализация информации о полезной нагрузке этапа 2
В проанализированной версии JarService точкой входа для полезной нагрузки следующего этапа был метод wa класса com.c.j.qbh.
Этап 2: загрузчик
Полезная нагрузка этого этапа — вредоносный загрузчик. Его код содержит зашифрованные строки, которые впоследствии используются как имена классов для выполнения полезной нагрузки этапа 3 через механизм рефлексии. Загрузчик отправляет информацию о заражённом устройстве на один из серверов злоумышленников POST-запросом. Пример запроса к C2-серверу:
{
"userId": "REDACTED",
"dexVersion": "1.7",
"dexType": 1,
"channelId": "2039",
"packageName": "com.tw.jar1",
"appVersion": 12,
"appName": "JarService"
}
В ответ на POST-запрос C2-сервер возвращает ссылку для загрузки полезной нагрузки этапа 3. Пример ответа C2-сервера приведён ниже.
{
"code": 200,
"data": {
"dexUrl": "hxxp://144.217.243[.]201/vr34der34/dex3.68.png",
"dexVersion": 3.680,
"status": 0
}
}
Троян использует ссылку из поля dexUrl объекта data для загрузки сериализованных данных, необходимых для загрузки следующего этапа. Эти данные начинаются с однобайтового целого числа — ключа для расшифровки строк в коде загрузчика. Сразу после этого числа идёт четырёхбайтовое значение с плавающей точкой, используемое для XOR-расшифровки полезной нагрузки этапа 3, которая располагается сразу после этих ключей.

Расшифровка полезной нагрузки этапа 3
В расшифрованной полезной нагрузке точка входа — метод init класса com.ast.sdk.BillingMain, показанный на скриншоте ниже.

Точка входа полезной нагрузки этапа 3
При анализе этого этапа выяснилось, что ссылка для загрузки полезной нагрузки следующего этапа содержит номер версии. Было решено перебрать другие номера версий, чтобы получить иные варианты полезной нагрузки, — в итоге удалось получить семь различных вариантов, перечисленных в разделе «Индикаторы компрометации» в конце отчёта. Самая ранняя версия, под номером 3.57, использует иной алгоритм декодирования по сравнению с описанным выше. Это может указывать на то, что в более ранней версии цепочки заражения между JarService и полезной нагрузкой этапа 3 использовался другой загрузчик.
Этап 3: кликер / загрузчик реверс-прокси
На этом этапе вредонос отправляет POST-запрос на /cpc/api/task каждые 90 минут по умолчанию, передавая информацию о заражённом устройстве (разрешение экрана, модель устройства, SSID подключённой Wi-Fi-сети, MAC-адрес и так далее), а также версию конфигурации трояна. Если конфигурация устарела, C2-сервер возвращает обновлённую конфигурацию с новыми адресами C2 и новыми путями для отправки HTTP-запросов. Пример ответа приведён ниже. На момент исследования актуальной была версия конфигурации 3.82.
{
"code": 100,
"data": {
"configVersion": 3.820,
"hosts": ["hxxp://t2.kshahnd[.]sbs", "hxxp://t2.mdsjhd[.]sbs", "hxxp://t2.nmnsny[.]sbs", "hxxps://t2.nmnsny[.]sbs"],
"interval": 5500000,
"reportApi": "/cpc/api/report",
"tagName": "config",
"taskApi": "/cpc/api/task",
"updates": ["hxxp://a2.kshahnd[.]sbs", "hxxp://a2.mdsjhd[.]sbs", "hxxp://a2.nmnsny[.]sbs", "hxxps://a2.nmnsny[.]sbs"],
"vn": 1.010
}
}
Если конфигурация не требует обновления, C2-сервер вместо этого возвращает целочисленные идентификаторы команд, которые злоумышленники называют productId. Троян сопоставляет каждый идентификатор с информацией о команде, которую хранит как сериализованный JSON-объект через API SharedPreferences. У каждого идентификатора также есть собственная версия, выраженная в виде UNIX-времени. Если ответ C2 содержит неизвестный productId или идентификатор с устаревшей версией, вредонос отправляет GET-запрос на сервер злоумышленников по адресу /cpc/api/xml, чтобы получить содержимое команд для всех таких идентификаторов. C2-сервер отвечает информацией о команде для каждого неизвестного идентификатора. Пример ответа приведён ниже.
{
"code": 200,
"data": [{
"productId": 979,
"script": "{\n \"loadType\": 1,\n \"reload\": true,\n \"method\": \"start\",\n \"url2\": \"hxxp://144.217.243[.]201/vr34der34/sh65.io\",\n \"md52\": \"de77c3303e93c9450424759f1741441c\",\n \"name\": \"zhima\",\n \"className\": \"com.miyc.transfer.Client\",\n \"thread\": true,\n \"tagName\": \"loadlib2\",\n \"params\": [\n {\n \"type\": \"Context\"\n },\n {\n \"type\": \"String\",\n \"value\": \"107.151.248[.]132\"\n },\n {\n \"type\": \"String\",\n \"value\": \"1002\"\n },\n {\n \"type\": \"int\",\n \"value\": 1337\n },\n {\n \"type\": \"int\",\n \"value\": 7777\n },\n {\n \"type\": \"int\",\n \"value\": 8888\n },\n {\n \"type\": \"int\",\n \"value\": 15000\n }\n ],\n \"url\": \"hxxp://144.217.243[.]201/vr34der34/sh65.io\",\n \"md5\": \"de77c3303e93c9450424759f1741441c\"\n}",
"version": 1778650942
}, {
"productId": 1019,
"script": "{\n \"loadType\": 1,\n \"reload\": true,\n \"method\": \"start\",\n \"url2\": \"hxxp://144.217.243[.]201/vr34der34/sh65.io\",\n \"md52\": \"de77c3303e93c9450424759f1741441c\",\n \"name\": \"zhima\",\n \"className\": \"com.miyc.transfer.Client\",\n \"thread\": true,\n \"tagName\": \"loadlib2\",\n \"params\": [\n {\n \"type\": \"Context\"\n },\n {\n \"type\": \"String\",\n \"value\": \"128.14.210[.]58\"\n },\n {\n \"type\": \"String\",\n \"value\": \"1002\"\n },\n {\n \"type\": \"int\",\n \"value\": 9999\n },\n {\n \"type\": \"int\",\n \"value\": 7777\n },\n {\n \"type\": \"int\",\n \"value\": 8888\n },\n {\n \"type\": \"int\",\n \"value\": 15000\n }\n ],\n \"url\": \"hxxp://144.217.243[.]201/vr34der34/sh65.io\",\n \"md5\": \"de77c3303e93c9450424759f1741441c\"\n}",
"version": 1766001509
}, {
"productId": 3505,
"script": "{\n\"tagName\":\"http\",\n\"url\":\"hxxps://api.kookjar[.]com/sayhi?channel=daihai&uuid={get_uuid_10}\"\n}",
"version": 1776656317
}],
"msg": ""
}
Информация о команде содержит поле tagName — имя команды. Код сопоставляет каждое имя с соответствующим классом, отвечающим за её выполнение.

Список выполняемых команд
На момент исследования злоумышленники реализовали девять команд. Таблица ниже содержит имена команд, краткие описания и аргументы. Функциональность этих команд указывает на то, что вредонос может использоваться для показа рекламы, совершения рекламного мошенничества (в роли кликера) и загрузки дополнительного вредоносного кода.
| Имя команды | Описание | Аргументы |
return |
Возвращает значение из SharedPreferences. | key: ключ, значение которого нужно вернуть |
copy |
Устанавливает содержимое буфера обмена. | text: ключ, значение которого из SharedPreferences возвращается как содержимое буфера обменаurl: ссылка для загрузки данных, сжатых gzip (опционально); эти данные затем объединяются со значением ключа text, разделителем служат 5 пробелов |
http |
Выполняет POST/GET HTTP-запрос к указанному ресурсу и, при необходимости, сохраняет ответ в SharedPreferences под указанным ключом. | url: адрес ресурсаmethod: название HTTP-метода (опционально)startLabel: маркер начала данных, которые нужно сохранить из ответа ресурса (опционально)endLabel: маркер конца данных, которые нужно сохранить (опционально)valueLabel: ключ, под которым сохранить значение (опционально)header: словарь заголовков HTTP-запроса (опционально)content: содержимое POST-запроса (опционально) |
web |
Открывает ссылку в WebView и выполняет произвольный JavaScript-код внутри неё. | url: ссылка для открытия в WebViewjs: JavaScript-код в base64, выполняемый в WebView; используется, если параметр url пуст или отсутствуетcorejs: JavaScript-код, выполняемый при загрузке ресурса в WebView (опционально)param: строковый словарь параметров запуска WebViewclient: если ключ присутствует, для ручной обработки редиректов используется WebViewClienttime: таймаут задачи |
loadlib |
На момент публикации отчёта не реализована полностью. | – |
loadlib2 |
Загружает и выполняет произвольный код. | url: адрес загрузки полезной нагрузкиname: имя загружаемого модуляmd5: MD5-хэш полезной нагрузкиclear: список имён полезных нагрузок для удаления через запятую (опционально)params: массив параметров для запуска полезной нагрузкиclassName: имя класса точки входа полезной нагрузкиmethod: имя виртуального метода в точке входаcmethod: имя статического метода для создания экземпляра класса точки входа (опционально)thread: флаг; если он не установлен, полезная нагрузка выполняется в отдельном потокеreload: флаг, при установке которого уже загруженные модули перезапускаются |
loadlib3 |
На момент публикации отчёта не реализована полностью. | – |
deeplink |
Открывает ресурс в браузере. | url: ссылка на ресурс |
traceroute |
Проверяет доступность ресурса через ICMP-пинг. | host: список ресурсов для проверки через запятую |
Однако на практике злоумышленники используют лишь небольшую часть этих команд. Как видно из примера ответа C2 выше, на момент публикации отчёта применялись команды loadlib2 и http. Полезная нагрузка, загружаемая командой loadlib2, — это модуль реверс-прокси под названием «zhima», который независимо обнаружили исследователи из Nokia Deepfield Emergency Response Team на телевизионных приставках примерно в то же время и также описали в своём отчёте. Это подтверждает, что конечная цель злоумышленников — построение прокси-ботнета.
При изучении этого этапа цепочки атак выяснилось, что ссылка для загрузки zhima также содержала номер версии. Как и на предыдущем этапе, были перебраны другие возможные номера версий, и найдено восемь вариантов модуля zhima, самый ранний из которых — версия 57. Полный список выявленных модулей zhima приведён в разделе «Индикаторы компрометации» ниже.
Атрибуция
При анализе полной цепочки заражения выяснилось, что загрузчик этапа 2 создавал поток с говорящим именем mosdk-host-loader. Было решено выяснить, к чему относится mosdk в этом имени. Это привело к вредоносному приложению, установленному на различных телевизионных приставках, с именем пакета com.abc.nexus (3AD4BF5A86D26FFBF09CAE42AF330A98). Оно состоит из нескольких компонентов (включая дроппер, похожий на JarService), каждый из которых используется злоумышленниками для скрытой монетизации вычислительных мощностей устройства. Каждый вредоносный компонент приложения соответствует собственному сервису, а сервис, содержащий код запуска дроппера, аналогичного JarService, называется AdmoyuService. Учитывая это, а также имя вредоносного потока, обнаруженного в коде полезной нагрузки, был сделан вывод, что moyu в имени сервиса указывает на MoYu Group — одну из группировок, связанных с платформой вредоносного ПО BADBOX, ранее описанной исследователями HUMAN. Эту оценку дополнительно подтверждает значительное пересечение сетевой инфраструктуры вредоноса с инфраструктурой MoYu Group, независимо выявленной исследователями Nokia Deepfield Emergency Response Team примерно в то же время. На основании схожих схем именования и заметного пересечения инфраструктуры между активностью MoYu Group и атаками, описанными в этом отчёте, активность с высокой степенью уверенности приписывается той же группировке.
При исследовании вредоносного ПО, загружаемого через TWCore, выяснилось, что домен admin.uipoxy[.]com резолвится в IP-адрес 128.14.210[.]58 — один из C2-серверов модуля реверс-прокси zhima. По всей видимости, по адресу hxxp://admin.uipoxy[.]com/proxy/u/login размещена административная панель zhima. Интересно, что эта панель позволяет зарегистрироваться любому, у кого есть действующий инвайт-код.

Страница регистрации оператора вредоносного ПО
При регистрации пользователям предлагается ознакомиться с условиями использования и политикой конфиденциальности. Оба документа размещены по ссылкам в домене pxyedge[.]com, принадлежащем PXYEDGE — вендору, специализирующемуся на продаже резидентных прокси.
На странице регистрации по адресу admin.uipoxy[.]com также обнаружена строка copyright © 2020 proxyforu[.]com all rights reserved, ссылающаяся на hxxps://proxyforu[.]com — сайт ProxyForU, ещё одного поставщика резидентных прокси-услуг.
Обнаружено несколько сходств в API аутентификации на всех этих сайтах:
- Страница входа размещена на поддомене
admin.*. - Страница входа расположена по пути
/proxy/u/login. - Страница регистрации расположена по пути
/proxy/register?channelKey=<код приглашения>.
На основании этого делается вывод, что данные сервисы связаны с MoYu Group.
Заключение
Несмотря на усилия специалистов по кибербезопасности и правоохранительных органов по прекращению работы ботнета BADBOX, отдельные связанные с ним группировки продолжают вредоносную деятельность, заражая устройства по всему миру. Методы доставки подобного вредоносного ПО сильно варьируются — от загрузок через предустановленные бэкдоры до заражённых сборок IPTV-приложений. Рассмотренный случай демонстрирует ещё более изощрённый способ доставки: распространение через легитимный функционал обновления системного приложения. Злоумышленники также активно осваивают новые платформы. Это первое известное вредоносное приложение, нацеленное на автомобильные головные устройства, а значит, такие платформы теперь тоже нуждаются в защите от вредоносного ПО.
Индикаторы компрометации
Этап 1: JarService
ba27951b4ee1c341f4415d033369ecd3
d63bacd6d6709dd68a10ef9d374c7835
6c2e34b30da42085240ede53ab6107d4
8b5e513144a6138a966ea59e68bf9da2
e119845877089d6f4b0a70dc7388f316
Этап 2: загрузчик
e9f3a0dab6949ce2cddab9e0aa80ae1a
Этап 3: загрузчик/кликер
0fbaa7092204f4b1494e0b840b014774
1dcf031c40ce456b6a36a00b0acf3d11
44b6b213a6a3f299eaf88e078de95ecb
67dc78e544ebce16b85dc7c195dfbc58
9642ae619b3165d23c6349002d1abe24
b067d5b0dbecbd6498bcdfba45dba77e
f0e3f7eba2cde91e2dedb921bab47422
Модуль zhima
412e9243f2981bbea3894254d105b3b8
71ab5517f71866279d0d87d37f2ae320
89ef78f716a75964539f2db6520be362
a4223ce4288a230d1e6c3ff2c7639045
bd4d81cd27125ad3d9a114922d468499
c6bfb1643ac7474ed8a7b4f96a187fdb
de77c3303e93c9450424759f1741441c
f8cf8c23ff597700d471fb7767df8bac
Домены и IP-адреса
xmsae[.]sbs
ishano456[.]sbs
xshaon123[.]sbs
kshahnd[.]sbs
mdsjhd[.]sbs
nmnsny[.]sbs
kookjar[.]com
ty54fgd435[.]my
ue886578433[.]online
ty4523[.]space
144.217.243[.]201
107.151.248[.]132
128.14.210[.]58
Адреса, использовавшиеся для загрузки JarService
hxxp://ovcloudcontrol.cdn.cardoor[.]cn/upgrade/2026-06-08/bd80bd3c3d0e4bf6b5b4a825650d01f5.apk
hxxp://ovcloudcontrol.cdn.cardoor[.]cn/upgrade/2025-06-10/fe71af9ecf174de48d2b2ccc2c15fb04.apk
hxxp://ovcloudcontrol.cdn.cardoor[.]cn/upgrade/2024-11-07/fa831c3c23824b99871163387bcda7ad.apk
Хэши TWCore (легитимное ПО, использовавшееся для распространения JarService)
2a64c3efc11bf224aa54f24e876446c9
7a4d3ba2dacccfdda55859a5dfee2671
ea24487996eb70c1780922fb3063bcc5