В июне 2026 года в ходе мониторинга Android-угроз мы обнаружили новый зловред. Нам показалось странным, что он устанавливался как обычное пользовательское приложение, но при этом никак не маскировался под легитимное ПО — у него отсутствовал интерфейс. Это натолкнуло нас на мысль, что такое приложение может появляться на устройствах пользователей без их ведома. В ходе дальнейшего исследования нам удалось подтвердить эту гипотезу и восстановить всю цепочку заражения.
Наши выводы в двух словах:
- мы обнаружили новый Android-зловред — многоступенчатый загрузчик, конечная цель которого — рекламное мошенничество и создание прокси-ботнета;
- зловред распространялся через встроенные механизмы прошивок головных устройств (Head Unit) под управлением ОС Android для обновления ПО. Это первый задокументированный случай обнаружения зловреда в головном устройстве автомобиля c цепочкой заражения, характерной для головных устройств;
- с высокой степенью уверенности мы относим описанную активность к актору MoYu Group, связанному с ботнетом BADBOX.
Решения «Лаборатории Касперского» детектируют описанные ниже угрозы со следующими вердиктами:
- HEUR:Trojan-Dropper.AndroidOS.Agent.vu
- HEUR:Trojan-Downloader.AndroidOS.Agent.ov
- HEUR:Trojan-Proxy.AndroidOS.Zhima.*
- HEUR:Trojan.AndroidOS.Vo1d.*
Что такое головное устройство (Head Unit)
Головное устройство (Head Unit) — это система, совмещающая в себе функции мультимедиа и частично функции управления автомобилем. Головные устройства могут быть как частью комплектации автомобиля, так и устанавливаться уже после покупки. Основными векторами атак для таких решений являются компрометация через физический доступ либо уязвимости ОС или компонентов головного устройства, о чем мы рассказывали ранее.
В некоторых случаях головные устройства управляются ОС Android, что продиктовано в первую очередь удобством для производителя — исходный код Android учитывает в том числе сценарии работы внутри головного устройства автомобиля. Также Android в процессе сборки позволяет добавлять свои системные приложения, что может использоваться производителями для решения широкого спектра задач, в частности для кастомизации интерфейса, для добавления системных компонентов под нужды вендора и т. д.
Большую часть приложений, разработанных для Android-устройств, можно запустить и на головном устройстве под управлением этой ОС. Это относится и к вредоносным приложениям. Однако некоторое множество зловредов, нацеленных на смартфоны, трудно представить в атаках на головное устройство. К ним, к примеру, можно отнести банковские троянцы: чаще всего мобильным банкингом пользуются именно на смартфоне, и для злоумышленника заражение головных устройств банкерами будет пустой тратой ресурсов.
Стоит отметить, что нередко головные устройства содержат слоты для SIM-карт и могут подключаться к интернету. Это позволяет, к примеру, пользоваться навигатором, обновлять ПО и т. д. Учитывая, что чаще всего головное устройство не содержит ценной для злоумышленника информации, один из наиболее вероятных сценариев атаки с использованием «классического» вредоносного ПО под Android — это заражение головного устройства для подключения его к ботнетам по аналогии с атаками на IoT-устройства.
В ходе исследования мы нашли такой зловред. Прошивки головных устройств производителя DoFun были устроены таким образом, что позволяло злоумышленникам распространять зловреды. Мы оповестили вендора о схеме распространения вредоносного ПО, после чего производитель сообщил об исправлении проблем безопасности.
Полная схема заражения выглядит следующим образом:
Рассмотрим, как именно головные устройства заражались вредоносным ПО.
Приложение TWCore
Приложение TWCore представляет собой легитимное системное приложение, которое отвечает за сбор аналитических данных, а также за обновление ПО головного устройства. Остановимся подробнее на реализации функции обновления ПО.
Процесс обновления устроен относительно просто. Расположенный на поддомене cardoor[.]cn брокер сообщений по протоколу MQTT присылает сообщение, содержащее информацию об APK-файлах, которые необходимо скачать и установить на головное устройство. Примечательно, что в объекте, описывающем такое сообщение, предусмотрено поле installNotExists — флаг, принимающий значение true или false. Он разрешает TWCore устанавливать приложения, которые не присутствуют на устройстве изначально.
APK-файл для дальнейшей установки скачивается в директорию <TWCore external cache dir>/push/apk/.
Данные нашей телеметрии свидетельствуют о том, что по таким путям располагалось вредоносное ПО, ранее неизвестное. Более того, наши данные показывают, что во всех случаях зловред устанавливался приложением с именем пакета com.tw.core, что совпадает с именем пакета TWCore.
Перейдем к разбору зловреда, устанавливаемого TWCore, — дроппера JarService.
Стадия 1: дроппер JarService
Как уже упоминалось, JarService представляет из себя небольшое приложение-дроппер без какого-либо интерфейса. Оно расшифровывает данные, которые хранятся в коде троянца в виде зашифрованных блоков. Для каждого блока применяется XOR-шифрование с однобайтовым ключом, линейно изменяющимся от блока к блоку. Расшифрованные данные содержат сериализованную информацию о версии полезной нагрузки, ее точке входа, а также сам код зловреда для дальнейшей загрузки.
В рассмотренной нами версии JarService точкой входа полезной нагрузки следующего этапа являлся метод wa класса com.c.j.qbh.
Стадия 2: загрузчик
Нагрузка этой стадии представляет собой вредоносный загрузчик. В его коде содержатся зашифрованные строки, используемые в дальнейшем в качестве имен классов для выполнения полезной нагрузки третьего этапа с помощью рефлексии. Загрузчик отправляет информацию об импланте POST-запросом на один из серверов злоумышленников. Пример запроса к С2:
|
1 2 3 4 5 6 7 8 9 |
{ "userId": "REDACTED", "dexVersion": "1.7", "dexType": 1, "channelId": "2039", "packageName": "com.tw.jar1", "appVersion": 12, "appName": "JarService" } |
В ответ на POST-запрос командный сервер возвращает ссылку для скачивания полезной нагрузки третьего этапа. Пример ответа С2 приведен ниже.
|
1 2 3 4 5 6 7 8 |
{ "code": 200, "data": { "dexUrl": "hxxp://144.217.243[.]201/vr34der34/dex3.68.png", "dexVersion": 3.680, "status": 0 } } |
По ссылке из поля dexUrl в объекте data троянец скачивает сериализованные данные для загрузки следующей стадии. В начале этих данных содержится однобайтовое целое число — ключ для расшифровки строк в коде загрузчика. Сразу за этим числом располагается четырехбайтовое число с плавающей точкой, которое используется для XOR-расшифровки полезной нагрузки третьего этапа. Она, в свою очередь, располагается после перечисленных ключей.
В расшифрованной полезной нагрузке точкой входа является метод init класса com.ast.sdk.BillingMain, приведенный на скриншоте ниже.
При анализе этого этапа мы обратили внимание, что в ссылке на скачивание полезной нагрузки следующего этапа содержится номер ее версии. Мы решили перебрать другие версии, чтобы получить разные версии полезных нагрузок — в итоге нам удалось получить семь разных вариантов (их список приведен в разделе «Индикаторы компрометации»). Самая ранняя версия имела номер 3.57, однако она предназначена для декодирования по алгоритму, отличному от описанного выше. Это может свидетельствовать о том, что раньше между JarService и нагрузкой третьего этапа располагался другой загрузчик.
Стадия 3: кликер/загрузчик реверс-прокси
На третьем этапе зловред с полуторачасовым интервалом по умолчанию отправляет POST-запрос по пути /cpc/api/task с информацией о зараженном устройстве (разрешение дисплея, модель устройства, SSID подключенной Wi-Fi сети, MAC-адрес и т. д.), а также версию конфигурации троянца. Если конфигурация устарела, то командный сервер вернет обновленную конфигурацию с новыми C2-адресами, а также новые пути для отправки HTTP-запросов. Пример такого ответа приведен ниже. Отметим, что на момент исследования угрозы версия 3.82 конфигурации была самой актуальной.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
{ "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 } } |
В случае если версия конфигурации не нуждается в обновлении, командный сервер возвращает целочисленные идентификаторы команд, которые злоумышленники назвали productId. Каждому идентификатору троянец сопоставляет информацию о команде, сохраняемую с помощью механизма SharedPreferences в формате сериализованного JSON-объекта. Более того, каждый идентификатор имеет свою версию — время в формате Unix time. В случае если в ответе C2 встретился неизвестный productId либо его версия устарела, зловред отправит GET-запрос на сервер злоумышленников по пути /cpc/api/xml для получения содержимого команды для всех таких идентификаторов. В ответ C2 возвращает информацию о команде для каждого неизвестного идентификатора. Пример такого ответа приведен ниже.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
{ "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 — закодированный с помощью base64 JavaScript-код, который необходимо выполнить в WebView; используется, если параметр url пустой или отсутствуетcorejs — JavaScript-код, который необходимо выполнить при загрузке ресурса в WebView (опционально)param — строковый словарь с параметрами для запуска WebViewclient — если ключ присутствует, будет использоваться WebViewClient для ручного разрешения перенаправленияtime — тайм-аут задачи |
loadlib |
На момент публикации отчета команда реализована не до конца | — |
loadlib2 |
Загрузить и выполнить произвольный код | url — адрес для скачивания полезной нагрузкиname — название загружаемого модуляmd5 — хэш MD5 полезной нагрузкиclear — список имен полезных нагрузок для удаления, разделенных запятой (опционально)params — массив параметров, с которыми необходимо запустить полезную нагрузкуclassName — имя класса точки входа полезной нагрузкиmethod — имя виртуального метода точки входа полезной нагрузкиcmethod — имя статического метода для создания экземпляра класса точки входа (опционально)thread — флаг: если не выставлен, полезная нагрузка запускается в отдельном потокеreload — флаг: при выставлении перезапускает уже загруженные модули |
loadlib3 |
На момент публикации отчета команда реализована не до конца | — |
deeplink |
Открыть ресурс с помощью браузера | url — ссылка на ресурс |
traceroute |
Проверить доступность ресурса с помощью ICMP ping | host — ресурсы для проверки, разделенные запятой |
Однако далеко не все команды используются злоумышленниками в реальных атаках. Как можно видеть на примере ответа C2, приведенного выше, на момент публикации отчета атакующие пользовались командами loadlib2 и http. Полезная нагрузка, скачиваемая командой loadlib2, представляет собой реверс-прокси-модуль zhima, который обнаружили параллельно с нами в ТВ-приставках и описали исследователи из Nokia Deepfield Emergency Response Team. Таким образом, конечная цель злоумышленников — создание прокси-ботнета.
В ходе исследования этого этапа цепочки атаки мы обратили внимание, что ссылка на скачивание zhima также имеет номер версии. По аналогии с предыдущим этапом мы перебрали другие возможные версии и обнаружили восемь вариантов модуля zhima, самый ранний из которых имел версию 57. Полный список обнаруженных модулей zhima приведен в разделе «Индикаторы компрометации».
Атрибуция
В ходе анализа полной цепочки заражения мы обратили внимание, что загрузчик второй стадии создавал поток с осмысленным названием 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 — один из командных серверов реверс-прокси-модуля zhima. Судя по всему, по ссылке hxxp://admin.uipoxy[.]com/proxy/u/login расположена панель администрирования zhima. При этом панель позволяет регистрироваться произвольным пользователям при наличии пригласительного кода.
При регистрации пользователю также предлагают ознакомиться с правилами использования сервиса и политикой приватности. Оба документа расположены на ссылках с доменом pxyedge[.]com. Это домен вендора PXYEDGE, который специализируется на продаже резидентных прокси (residential proxy).
Также на странице регистрации, расположенной на домене admin.uipoxy[.]com, мы обнаружили строку
copyright © 2020 proxyforu[.]com all rights reserved, которая вела на сайт hxxps://proxyforu[.]com. Это сайт вендора ProxyForU, также предлагающий услуги резидентных прокси.
Мы обнаружили некоторые сходства в API-авторизации всех этих сайтов:
- страница авторизации располагалась на поддомене
admin.*; - страница авторизации располагалась по пути
/proxy/u/login; - страница регистрации располагалась по пути
/proxy/register?channelKey=<invitation code>.
Исходя из этого, мы полагаем, что перечисленные сервисы связаны с 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











Невидимый пассажир вашего автомобиля