2020年5月,Bitdefender发布了一份白皮书,其中详细分析了一种复杂的安卓网络间谍软件Mandrake。2024年4月,卡巴斯基的研究人员发现了一个可疑样本,似乎是Mandrake的新版本。
随后的分析显示,从2022年到2024年,多达5个携带Mandrake间谍软件的应用程序在Google Play上可用,总安装量已超3.2万次,却未被任何其他供应商发现。这些新样本采用了高级混淆与规避技术,包括将恶意功能转移到使用OLLVM混淆的本地库中,实施证书绑定以确保与命令与控制(C2)服务器的安全通信,以及进行广泛检查以判断Mandrake是否在已获取root权限的设备或模拟环境中运行。
概括来说,卡巴斯基分析结果重点体现为如下几点:
卡巴斯基产品检测到此威胁为HEUR:Trojan-Spy.AndroidOS.Mandrake.*。
Bitdefender于2020年5月对最初的Mandrake活动及其2016-2017年和2018-2020年的两次主要感染波进行了分析。在Bitdefender报告发布后,卡巴斯基也发现了与该活动相关的另一个样本,该样本仍可在Google Play上使用。
【Google Play上的Mandrake应用】
2024年4月,卡巴斯基研究人员发现了一个可疑的样本,分析显示它是一种新版本的Mandrake。Mandrake新变种最显著的特点是增加了先进的混淆技术,旨在绕过Google Play的安全检查并阻碍对其进行分析。研究发现了五款包含Mandrake间谍软件的应用程序,下载次数合计超过3.2万次。这些应用程序都是2022年在Google Play上发布的,可供下载的时间至少有一年。它们被伪装成通过Wi-Fi共享文件的应用程序、天文服务应用程序、原神Amber游戏、加密货币应用程序以及逻辑谜题应用程序。截至2024年7月,根据VirusTotal的检测结果,这些应用均未被任何安全厂商标记为恶意软件。
【VirusTotal上的Mandrake样本】
卡巴斯基确定了五款携带Mandrake的应用程序,细节如下表所示:
包名称 | 应用名称 | MD5 | 开发者 | 发布时间 | 最近更新时间 |
com.airft.ftrnsfr | AirFS | it9042 | 2022.04.28 | 2024.03.15 | |
com.astro.dscvr | Astro Explorer | shevabad | 2022.05.30 | 2023.06.06 | |
com.shrp.sght | Amber | kodaslda | 2022.02.27 | 2023.08.19 | |
com.cryptopulsing.browser | CryptoPulsing | shevabad | 2022.11.02 | 2023.06.06 | |
com.brnmth.mtrx | Brain Matrix | - | kodaslda | 2022.04.27 | 2023.06.06 |
【Google Play上的Mandrake应用程序】
值得注意的是,虽然研究并未获得com.brnmth.mtrx的APK文件,但考虑到开发者和发布日期,研究人员高度怀疑它包含Mandrake间谍软件。
【应用程序图标】
这份报告的重点是一个名为AirFS的应用程序,它在Google Play上存在了两年之久,最后一次更新是在2024年3月15日。它的下载量最高:超过3万次。该恶意软件伪装成一个文件共享应用程序。
【Google Play上的AirFS应用】
根据评论,一些用户已经注意到该应用程序无法提供承诺的服务,或从他们的设备中窃取数据。
【用户关于AirFS应用程序的评论】
就像Bitdefender描述的Mandrake先前版本一样,最新活动中的应用程序同样分阶段运行:dropper,加载程序和核心。与之前在应用程序DEX文件中发现的第一阶段(dropper)恶意逻辑的活动不同,新版本将所有第一阶段恶意活动隐藏在本机库libopencv_dnn.so中。因此,这比DEX文件更难分析和检测。该库会导出函数从assets/raw文件夹解密下一阶段(加载程序)。
【主APK文件的内容】
有趣的是,样本com.shrp. sight只有两个阶段,其中加载程序和核心功能被组合到一个APK文件中,dropper程序从其资产中解密该文件。
虽然在过去的Mandrake活动中存在不同的分支(“oxide”, “briar”, “ricinus”, “darkmatter”),但目前的活动主要与“ricinus”分支有关。第二阶段和第三阶段的文件被命名为“ricinus_airfs_3.4.0.9.apk”、“ricinus_dropper_core_airfs_3.4.1.9.apk”、“ricinus_amber_3.3.8.2.apk”等。
当应用程序启动时,它会加载本机库:
【加载本机库】
为了增加检测困难度,第一阶段的本机库使用OLLVM混淆器进行了严重混淆。它的主要目标是解密和加载第二阶段,即加载程序(loader)。在解包、解密并将第二阶段DEX文件加载到内存中之后,代码会调用dex_load方法并执行第二阶段。在此方法中,第二阶段的本机库路径会被添加到类加载程序(class loader)中,并启动第二阶段的主活动和服务。然后,该应用程序会显示一个通知,请求绘制覆盖的权限。
当主服务启动时,第二阶段的本机库libopencv_java3.so会加载,然后对C2通信的证书(位于第二阶段资产文件夹中)进行解密。攻击者使用一个IP地址进行C2通信,如果无法建立连接,恶意软件就会尝试连接到更多的域。连接成功后,该应用程序会向C2发送设备信息,包括已安装的应用、移动网络、IP地址、设备唯一标识等。如果攻击者发现他们的目标与这些数据有关,他们就会发出命令,下载并运行Mandrake的“核心”组件。然后,该应用程序就会下载、解密并执行第三阶段(核心),其中包含主要的恶意软件功能。
命令 | 描述 |
start | 开始行动 |
cup | 设置wakelock,开启Wi-Fi,启动主父服务 |
cdn | 开启主服务 |
stat | 收集连接状态、电池优化、“绘制叠加”权限、adb状态、外部IP、Google Play版本等信息 |
apps | 报告已安装的应用程序 |
accounts | 报告用户账号 |
battery | 报告电池电量百分比 |
home | 启动launcher应用 |
hide | 隐藏launcher图标 |
unload | 恢复launcher图标 |
core | 启动核心加载 |
clean | 移除下载的核心 |
over | 请求“绘制覆盖”权限 |
opt | 授予应用程序在后台运行的权限 |
命令 | 描述 |
start | 开始行动 |
duid | 更改UID |
cup | 设置wakelock,开启Wi-Fi,启动主父服务 |
cdn | 开启主服务 |
stat | 收集连接状态、电池优化、“绘制叠加”权限、adb状态、外部IP、Google Play版本等信息 |
apps | 报告已安装的应用程序 |
accounts | 报告用户账号 |
battery | 报告电池电量百分比 |
home | 启动launcher应用 |
hide | 隐藏launcher图标 |
unload | 恢复launcher图标 |
restart | 重启应用 |
apk | 显示应用程序安装通知 |
start_v | 加载带有屏幕共享的自定义实现的交互式webview覆盖,通常被恶意软件开发人员称为“VNC” |
start_a | 自动加载webview覆盖 |
stop_v | 卸载webview覆盖 |
start_i, start_d | 加载带有屏幕记录的webview覆盖 |
stop_i | 停止webview覆盖 |
upload_i, upload_d | 上传屏幕记录 |
over | 请求“绘制覆盖”权限 |
opt | 授予应用程序在后台运行的权限 |
当Mandrake收到start_v命令时,该服务会启动并在应用程序拥有的webview中加载指定的URL,并使用自定义JavaScript接口来操作它加载的网页。
当页面加载时,该应用程序会建立一个websocket连接,并开始定期截取页面的屏幕截图,同时将其编码为base64字符串并发送至C2服务器。攻击者可以使用额外的命令来调整帧率和质量。攻击者称其为“vnc_stream”。同时,C2服务器还可以发回控制命令,使应用程序执行各种操作,如滑动到给定的坐标、更改webview的大小和分辨率、在桌面和移动页面显示模式之间切换、启用或禁用JavaScript执行、更改User Agent、导入或导出cookie、后退和前进、刷新加载的页面以及缩放加载的页面等等。
当Mandrake收到start_i命令时,它会在webview中加载一个URL,但C2服务器没有启动“VNC”流,而是开始记录屏幕并将记录保存到文件中。录制过程类似于“VNC”场景,但屏幕截图被保存到视频文件中。同样在这种模式下,应用程序会等待用户在网页上输入他们的凭据,然后从webview收集cookie。
start_a命令允许在当前页面的上下文中运行自动操作,例如滑动、单击等。如果是这种情况,Mandrake会从命令选项中指定的URL下载自动化场景。在这种模式下,屏幕也会被记录。
通过使用upload_i或upload_d命令即可上传屏幕录音到C2。
Mandrake的主要目标是窃取用户的凭据,下载并执行下一阶段的恶意应用程序。
数据加密和解密逻辑在不同的Mandrake阶段是相似的。在本节中,研究人员重点描述了第二阶段的数据解密方法。
第二阶段的本机库libopencv_java3.so包含AES加密的C2域,以及用于配置数据和有效负载解密的密钥。加密字符串与纯文本字符串混合。
为了获得字符串的长度,Mandrake对加密数组的前三个字节进行XOR,然后使用数组的前两个字节作为自定义XOR编码的密钥。
【字符串解密算法】
用于解密AES加密数据的密钥和IV以相同的方式编码,其中部分数据额外使用常量进行XOR。
【AES密钥解密】
Mandrake使用OpenSSL库进行AES解密,加密文件被分成16字节的块,每个块用AES-CFB128解密。
用于C2通信的加密证书位于第二阶段的assets/raw文件夹中,是一个名为cart.raw的文件,也使用相同的算法解密。
当Mandrake从C2获得apk命令时,它会下载一个带有附加模块的新的单独apk文件,并向用户显示一个看起来像他们会从Google Play收到的通知。用户单击通知将启动安装过程。
Android 13引入了“限制设置”功能,该功能禁止侧载应用程序直接请求危险的权限。为了绕过这个特性,Mandrake使用了“基于会话”的软件包安装程序来处理安装过程。
【安装额外的应用程序】
虽然Mandrake的主要目标与过去的活动保持不变,但在最近的版本中,代码复杂性和模拟检查的数量显著增加,以防止代码在恶意软件分析人员操作的环境中执行。然而,研究人员成功绕过了这些限制并发现了下面描述的更改。
之前发现的恶意软件版本只包含一个基础的模拟检查例程。
【模拟器检查较旧的Mandrake版本】
在新版本中,研究人员发现了更多的检查。
首先,威胁行为者添加了Frida检测。当应用程序启动时,它会加载第一阶段的本机库libopencv_dnn.so。这个库的init_array部分包含Frida检测器函数调用。攻击者使用了DetectFrida方法。首先,它计算所有库的CRC,然后启动Frida检测线程。每隔五秒,它会检查内存中的库是否发生过更改。此外,它通过查找Frida使用的特定线程和管道名称来检查Frida是否存在。因此,当分析人员试图对应用程序使用Frida时,执行将被终止。即使是使用Frida的自定义构建,并尝试在本机库中hook一个函数,该应用也会检测到代码更改并终止行动。
接下来,在收集设备信息以便为下一阶段发出请求之后,该应用程序会检查环境以确定设备是否已被root,以及是否安装了分析工具。与寻求利用root访问的其他威胁行为者不同,Mandrake开发人员认为被root的设备是危险的,因为他们的目标(普通用户)通常不会root他们的手机。首先,Mandrake试图找到一个su二进制文件、一个SuperUser.apk、Busybox或Xposed框架,以及Magisk和Saurik Substrate文件。然后检查系统分区是否挂载为只读。接下来,它会检查是否启用了开发设置和ADB。最后,它会检查设备上是否存在Google帐户和Google Play应用程序。
所有C2通信都通过应用程序的本机部分使用OpenSSL静态编译库进行维护。
为了防止网络流量嗅探,Mandrake使用加密证书(从assets/raw文件夹解密)来保护C2通信。客户端需要通过此证书进行验证,因此尝试捕获SSL流量将导致握手失败和通信中断。但是,发送到C2的任何数据包都保存在本地,以便进行额外的AES加密,因此研究人员能够查看消息内容。通过分析消息内容发现,Mandrake使用自定义的JSON-like序列化格式,这与之前的活动相同。
C2请求的示例:
node #1
{
uid "a1c445f10336076b";
request "1000";
data_1 "32|3.1.1|HWLYO-L6735|26202|de||ricinus_airfs_3.4.0.9|0|0|0||0|0|0|0|Europe/Berlin||180|2|1|41|115|0|0|0|0|loader|0|0|secure_environment||0|0|1|0||0|85.214.132.126|0|1|38.6.10-21 [0] [PR] 585796312|0|0|0|0|0|";
data_2 "loader";
dt 1715178379;
next #2;
}
node #2
{
uid "a1c445f10336076b";
request "1010";
data_1 "ricinus_airfs_3.4.0.9";
data_2 "";
dt 1715178377;
next #3;
}
node #3
{
uid "a1c445f10336076b";
request "1003";
data_1 "com.airft.ftrnsfr\n\ncom.android.calendar\n\[redacted]\ncom.android.stk\n\n";
data_2 "";
dt 1715178378;
next NULL;
}
C2响应示例:
node #1
{
response "a1c445f10336076b";
command "1035";
data_1 "";
data_2 "";
dt "0";
next #2;
}
node #2
{
response "a1c445f10336076b";
command "1022";
data_1 "20";
data_2 "1";
dt "0";
next #3;
}
node #3
{
response "a1c445f10336076b";
command "1027";
data_1 "1";
data_2 "";
dt "0";
next #4;
}
node #4
{
response "a1c445f10336076b";
command "1010";
data_1 "ricinus_dropper_core_airfs_3.4.1.9.apk";
data_2 "60";
dt "0";
next NULL;
}
Mandrake使用的操作码范围覆盖1000到1058。相同的操作码可以表示不同的操作,这取决于它是用于请求还是响应。具体请看下面的例子:
考虑到当前活动与之前的相似之处,以及C2域名在俄罗斯注册的事实,研究人员高度确信此次活动背后的威胁行为者与Bitdefender报告中所述的相同。
Google Play上的恶意应用程序在许多国家都可以使用。大部分下载量来自加拿大、德国、意大利、墨西哥、西班牙、秘鲁和英国。
目前,Mandrak间谍软件正在动态发展中,它不仅改进了隐藏方法,还能够实现沙盒规避并绕过新的防御机制。当前的活动至少已经潜伏了2年之久,且仍然可以在Google Play上下载。这凸显了威胁行为者的强大技能,同时也表明在应用程序发布之前对应用程序进行更严格的控制只会导致更复杂、更难以检测的威胁潜入官方应用程序市场。
141f09c5d8a7af85dde2b7bfe2c89477
1b579842077e0ec75346685ffd689d6e
202b5c0591e1ae09f9021e6aaf5e8a8b
31ae39a7abeea3901a681f847199ed88
33fdfbb1acdc226eb177eb42f3d22db4
3837a06039682ced414a9a7bec7de1ef
3c2c9c6ca906ea6c6d993efd0f2dc40e
494687795592106574edfcdcef27729e
5d77f2f59aade2d1656eb7506bd02cc9
79f8be1e5c050446927d4e4facff279c
7f1805ec0187ddb54a55eabe3e2396f5
8523262a411e4d8db2079ddac8424a98
8dcbed733f5abf9bc5a574de71a3ad53
95d3e26071506c6695a3760b97c91d75
984b336454282e7a0fb62d55edfb890a
a18a0457d0d4833add2dc6eac1b0b323
b4acfaeada60f41f6925628c824bb35e
cb302167c8458e395337771c81d5be62
da1108674eb3f77df2fee10d116cc685
e165cda25ef49c02ed94ab524fafa938
eb595fbcf24f94c329ac0e6ba63fe984
f0ae0c43aca3a474098bd5ca403c3fca
45.142.122[.]12
ricinus[.]ru
ricinus-ca[.]ru
ricinus-cb[.]ru
ricinus-cc[.]ru
ricinus[.]su
toxicodendron[.]ru
原文链接:
https://securelist.com/mandrake-apps-return-to-google-play/113147/