2023 年 3 月,ESET 的研究人员发现了内置于各种即时通讯工具修改版中的恶意植入程序。他们中的一些人在用户的图库中搜索带有用于恢复加密钱包访问权限的短语(恢复短语)的图片。该搜索使用了 OCR 模型,借助该模型在受害者的设备上选择图像以便传输到 C2。在所述恶意活动期间,该恶意软件针对的是运行 Android 和 Windows 的设备的用户,并通过非官方来源进行传播。2024 年末,我们发现了一个新的恶意软件活动,我们称之为 SparkCat,攻击者使用了类似的策略,但攻击 Android 和 iOS 用户,包括通过官方商店。我们的结论简而言之:
-
我们发现 Android 和 iOS 应用程序嵌入了恶意 SDK/框架以窃取加密钱包恢复短语,其中一些可在 Google Play 和 App Store 上找到。受感染的应用程序已从 Google Play 下载超过 242,000 次。这是已知的第一起窃取软件进入 App Store 的案例。 -
Android 恶意模块解密并启动基于 Google ML Kit 库的 OCR 插件,用于识别设备图库中图片中的文本。该木马使用从 C2 收到的关键字将图像发送到命令服务器。iOS 恶意软件的设计方式类似,也使用 Google 的 ML Kit 库进行 OCR。 -
该恶意软件被我们命名为 SparkCat,它使用未识别的协议与 C2 进行通信,并以 Rust 语言实现,这在移动应用程序中并不常见。 -
根据恶意软件文件中的时间戳和 GitLab 存储库中配置文件的创建日期,SparkCat 自 2024 年 3 月起一直处于活跃状态。
Google Play 应用中存在恶意 SDK
第一个对我们来说看起来很可疑的应用程序是阿联酋和印度尼西亚的一款食品配送应用程序,名为 ComeCome(软件包名称 - com.bintiger.mall.android),在分析时该应用程序在 Google Play 上可用,安装次数超过 10,000 次。
在应用程序 2.0.0 版本(f99252b23f42b9b054b7233930532fcdhttps://opentip.kaspersky.com/f99252b23f42b9b054b7233930532fcd/?icid=kl-ru_OpenTIP_acq_ona_smm__onl_b2b_securelist_lnk_sm-team_______7a3a884d0e0a91b9&utm_source=SL&utm_medium=SL&utm_campaign=SL
)中, onCreate 方法在 Application 类的继承者中被重写,它是应用程序的入口点之一。此方法初始化一个名为Spark的SDK组件。原来它是被混淆的,所以我们先静态地去混淆它,然后开始分析它。
Spark 是用 Java 编写的。初始化时,它使用硬编码到恶意软件代码中的 URL 从 GitLab 下载 JSON 格式的加密配置文件。JSON 使用 base64 解码,然后以 CBC 模式使用 AES-128 解密。
使用 GitLab 解密配置
如果SDK无法获取配置,则会使用默认设置。
我们可以从 GitLab 下载以下配置:
{
"http": ["https://api.aliyung.org"],
"rust": ["api.aliyung.com:18883"],
"tfm": 1
}
http 和 rust 字段包含 SDK 命令服务器的地址,tfm 标志控制 C2 的选择。如果 tfm 为 1,则 rust 将用作命令服务器,在所有其他情况下则使用 http。
为了与 http 服务器通信,Spark 使用 POST 请求。数据在发送前使用 CBC 模式的 AES-256 加密,服务器的响应使用 CBC 模式的 AES-128 解密。在这两种情况下,键都是写在代码中的常量。
数据传输到 Rust 服务器分为三个阶段:
-
数据使用 CBC 模式的 AES-256 加密,密钥与 http 服务器相同。 -
生成以下 JSON,其中 是加载数据的路径,是上一步中的加密数据:
{
"path": "upload@<PATH>",
"method": "POST",
"contentType": "application/json",
"data": "<DATA>"
}
-
此 JSON 使用本机 libmodsvmp.so 库通过 TCP 套接字上的未识别协议发送到服务器。该库是用 Rust 编程语言编写的,并伪装成流行的 Android 混淆器。
库代码的静态分析很有挑战性,因为 Rust 使用非标准调用约定,并且文件中缺少函数名称。使用 Frida 进行动态分析后,我们能够重建交互模式。在将数据发送到服务器之前,该库会为 AES-GCM-SIV 密码生成一个 32 字节的密钥,并使用该密钥加密先前使用 ZSTD 压缩的发送数据。该算法的 nonce 值不会生成 - 它是硬编码的并且始终等于“唯一 nonce”(原文如此)。
AES 密钥使用 RSA 加密,其公钥在从恶意 SDK 调用本机方法时以 PEM 格式传输,然后也发送到服务器。通过在消息开头添加随机的 224 个字节来实现加密 AES 密钥时的对齐。攻击者的服务器在收到请求后,使用私钥 RSA 密钥解密 AES 密钥,解码收到的数据,然后使用 ZSTD 压缩响应并使用 AES-GCM-SIV 算法对其进行加密。服务器的响应在原生库中解码后传输到SDK,在SDK中使用base64解码,并按照与http服务器交互时的相同原理进行解密。下面是恶意模块与rust服务器之间通信的示例。
加载配置后,Spark 会在单独的线程中解密并运行来自资源的有效负载。所用的密码是与十六字节密钥进行异或运算。
有效载荷(c84784a5a0ee6fedc2abe1545f933655)是用于与Google ML Kit 库中的TextRecognizer接口配合使用的包装器。它根据系统语言加载不同的 OCR 模型来区分图像中的拉丁文、韩文、中文和日文字符。然后,SDK 通过路径 /api/e/d/u 将有关设备的信息上传到命令服务器,并在响应中接收一个规范恶意软件进一步操作的对象。该对象是一个 JSON 文件,其结构如下所示。uploadSwitch 标志允许恶意软件继续运行(值 1)。
{
"code": 0,
"message": "success",
"data": {
"uploadSwitch": 1,
"pw": 0,
"rs": ""
}
}
然后,SDK 注册一个应用程序活动生命周期事件处理程序,当用户联系使用合法第三方 Easemob HelpDesk SDK 组件实现的支持聊天时,该处理程序会请求从图库中读取图像的权限。如果上述对象中的 pw 标志为 1,则在拒绝的情况下,模块将再次请求权限。SDK 在提出请求时使用的论证乍一看似乎没有引起任何问题:当联系支持时,用户确实可以附加图像。
如果授予权限,SDK 将运行其核心功能。它首先向 /api/e/config/rekognition 处的 C2 发出请求,该请求将接收用于处理 OCR 结果的参数。
{
"code": 0,
"message": "success",
"data": {
"letterMax": 34,
"letterMin": 2,
"enable": 1,
"wordlistMatchMin": 9,
"interval": 100,
"lang": 1,
"wordMin": 12,
"wordMax": 34
}
}
这些参数使用处理器类,根据 OCR 模型在图像中识别的单词来过滤图像。该恶意软件还会在 /api/e/config/keyword
中为 KeywordsProcessor 处理器请求关键字列表,该处理器根据收到的单词选择要上传到命令服务器的图像。
除了KeywordsProcessor之外,该恶意软件还包含两个处理器:DictProcessor和WordNumProcessor。第一个基于本地化词典过滤图像,这些词典以加密形式位于资源中的 rapp.binary 文件中,第二个基于一定长度的单词数过滤图像。每个处理器的 letterMin 和 letterMax 参数指定了可接受的字长范围。对于 DictProcessor,wordlistMatchMin 参数控制必须在图像中找到的字典中的最小单词数;对于 WordNumProcessor,wordMin 和 wordMax 参数控制识别单词的数量必须在其中的范围。使用哪个处理器由对受感染设备注册请求的响应中的 rs 字段控制。
与搜索相匹配的图像将分三个阶段从设备下载。首先,沿路径 /api/e/img/uploadedCheck 向 C2 发送请求,其中包含图像的 MD5 哈希值。然后通过 file@/api/res/send 将图像上传到亚马逊云存储或 rust 服务器,之后通过 /api/e/img/rekognition 将其链接上传到 C2。因此,根据包名 com.spark.stat 判断,该 SDK 原本用于分析,但实际上是恶意的,会选择性地窃取图库内容。
我们问自己:攻击者对什么样的图像感兴趣?为此,我们独立从命令服务器请求了用于 OCR 搜索的关键字列表。在每种情况下,我们都收到了中文、日语、韩语、英语、捷克语、法语、意大利语、波兰语和葡萄牙语的回复。所有这些词都表明了攻击者的经济动机:他们对恢复加密钱包访问权限的短语(称为助记符)感兴趣。
{
"code": 0,
"message": "success",
"data": {
"keywords": ["助记词", "助記詞", "ニーモニック", "기억코드", "Mnemonic",
"Mnemotecnia", "Mnémonique", "Mnemonico", "Mnemotechnika", "Mnemônico",
"클립보드로복사", "복구", "단어", "문구", "계정", "Phrase"]
}
}
不幸的是,恶意组件不仅存在于 ComeCome 应用程序中。我们还发现了其他几个与不同主题无关的应用程序,截至撰写本文时,这些应用程序的总安装次数已超过 242,000 次(完整列表请参阅“妥协指标”部分),其中一些仍可在 Google Play 上找到。我们向 Google 通报了商店中存在受感染的应用程序。
此外,根据我们的遥测数据,受感染的应用程序也通过非官方来源进行分发。
SDK 功能可能因应用程序不同而略有不同。例如,虽然 ComeCome 的恶意软件仅在打开与支持人员的聊天时请求权限,但在其他一些恶意软件中,触发因素是启动应用程序的主要功能。
一个小细节
在分析被感染的Android应用程序时,我们注意到,在向C2发送受感染设备的信息时,恶意SDK会将deviceType字段的值填充为android,这暗示其他平台也存在类似的木马。
我们进行了研究,发现App Store中确实有iOS应用程序感染了含有相同木马的恶意框架。例如,iOS 版外卖应用 ComeCome 受到了感染,其 Android 版本也受到了感染。这是已知的第一起苹果官方商店应用程序感染OCR间谍软件的案例。
App Store 中的应用程序中存在恶意框架 我们在 App Store 中发现了许多嵌入恶意框架的应用程序。我们没有任何确切信息表明它们是因供应链攻击而受到感染,还是开发人员故意在其中嵌入了木马。有些应用程序(例如送餐服务)似乎是合法的,而其他应用程序显然是为了引诱受害者而设计的 - 例如,我们已经看到了来自同一开发商的几个具有人工智能功能的类似“信使”:
在一些受感染的应用程序中,除了恶意框架本身之外,根文件夹中还存在modify_gzip.rb脚本,攻击者显然在开发阶段使用该脚本将框架嵌入到应用程序中:
该框架本身是用 Objective-C 编写的,并使用HikariLLVM混淆器进行混淆。在我们发现的应用程序中,它有以下三个名称之一:
-
GZIP; -
googleappsdk; -
stat;
与 Android 版本一样,iOS 恶意软件使用ML Kit接口,这使其能够与经过文本识别训练的 Google OCR 模型一起使用,以及实现相同自制协议用于与 C2 通信的 Rust 库,但在这种情况下,它嵌入在恶意可执行文件中。与 Android 版本不同,iOS 框架保留了调试符号,这使我们能够突出显示它的几个独特功能:
-
这些行闪烁着项目在框架作者的设备上所处的路径,其中可以看到用户名: -
/Users/qiongwu/ —— 项目本身作者的主目录; -
/Users/quiwengjing/ — Rust 库作者的主目录。 -
负责与 C2 rust 联网的模块称为im_net_sys。除了客户端部分之外,它还包含攻击者服务器可能用来与受害者进行通信的代码。 -
该项目原来的名字是GZIP。
该框架包含多个恶意类,其中我们可以重点介绍最有趣的几个:
-
MMMaker——实现设备配置的加载和信息的收集。 -
ApiMgr——用于发送有关设备的数据。 -
PhotoMgr - 搜索设备并将包含关键字的照片上传到服务器。 -
MMCore——用于存储与 C2 会话的信息。 -
MMLocationMgr - 收集有关设备位置的最新信息。在测试期间,它没有将这些数据发送到任何地方,因此其存在的最终目的仍不清楚。
值得注意的是,在框架的早期版本中,某些类(例如MMMaker)可能缺失或具有不同的名称,但恶意软件的基本行为并没有改变。
混淆使样本的静态分析过程变得相当困难,因为它们会加密字符串并混淆代码的控制流。为了快速解密我们感兴趣的字符串,我们采用了动态分析的方法,在 Frida 下运行应用程序并收集存储它们的_data部分的转储。我们注意到解密数据中存在所研究应用程序的包标识符(bundleID):
事实证明,框架还存储了其他应用程序的包 ID,并且它们在+[MMCore config]选择器中使用。由此我们得出以下结论:
-
该木马的行为可能因其启动的应用程序不同而有所差异。 -
可能被感染的应用程序比我们最初想象的要多。
我们从不同框架样本的解码字符串中收集的包标识符的完整列表在 IoC 部分给出。在研究进行时,与这些标识符相关的一些应用程序已从 App Store 中删除,而其他应用程序仍然存在并包含恶意框架。在应用程序标识符列表中,也有一些在研究时不包含恶意框架的应用程序标识符。
与 Android 一样,该木马实现了三种过滤 OCR 结果的模式:按关键字、按一定长度的单词数以及按直接以加密形式存储在框架内部的本地化词典(即 wordlists 文件夹中的文件中)。不幸的是,我们无法验证该恶意软件是否真正使用了后者——我们检查的所有样本都没有在其主体中包含对这些字典的引用,也没有在工作期间访问过这些字典。
该恶意框架工作中最重要的一步就是将其选择的照片连同关键字一起发送。与Android类似,该木马仅在启动负责显示支持聊天的UI控制器(View Controller)时才请求访问图库的权限。在初始化阶段,根据木马启动时所处的应用程序,它会用包装器替换相应控制器的 viewDidLoad或viewWillAppear方法,然后调用+[PhotoMgr startTask:]方法,然后检查应用程序是否有权访问图库,并在必要时发出请求。接下来,如果获得权限,PhotoMgr将尝试在可用的、未处理的照片中查找符合发送条件的照片。
虽然这不是第一次,但我们设法强制应用程序将图像发送到亚马逊云,然后向攻击者的服务器报告有关上传图像的信息。在这种情况下,与服务器的通信是通过 HTTPS 协议进行的,而不是通过自制的 rust 进行的:
发送的数据如下:
POST /api/e/img/uploadedCheck
{
"imgSign": <imgMD5>,
"orgId": <implantId>,
"deviceId": <deviceUUID>
}
POST /api/e/img/uploadedCheck
{
"imgSign": <imgMD5>,
"orgId": <implantId>,
"deviceId": <deviceUUID>
}
POST api/e/img/rekognition
{
"imgUrl": "https://dmbucket102.s3.ap-northeast-
1.amazonaws.com/"<app_name>_<device_uuid>"/photo_"<timestamp>".jpg",
"deviceName": "ios",
"appName": <appName>,
"deviceUUID": <deviceUUID>,
"imgSign": <imgMD5>,
"imgSize": <imgSize>,
"orgId":<implantId>,
"deviceChannel": <iphoneModel>,
"keyword":<keywordsFoundOnPicture>,
"reksign":<processor type>
}
作为研究的一部分,在该恶意框架的所有版本中,最古老的版本是 2024 年 3 月 15 日编译的版本。它与较新版本之间没有显著差异,但包含大量未加密的字符串,例如 API 端点,C2 地址是单一的且硬编码到框架代码中,并且来自服务器的响应未加密。
活动特色
在我们对 Android 应用程序进行分析时,我们发现文字处理器在其代码中包含中文注释。C2服务器还会针对不正确的请求返回中文的错误描述。这一点,加上在分析 iOS 版本过程中获得的框架开发人员主文件夹的名称,让我们有理由相信该恶意模块的开发人员精通中文。然而,现有数据不足以将该活动归咎于任何已知团体。
在研究过程中,我们能够确定攻击者的动机——攻击者窃取短语来恢复对加密钱包的访问权限,这足以完全控制受害者的钱包以进一步窃取资金。值得注意的是,该恶意软件的灵活性使其不仅可以窃取秘密短语,还可以窃取图库中的其他个人数据,例如可能保留在屏幕截图上的消息内容或密码。同时,多种处理 OCR 结果模式(处理器)的存在减少了模型错误的影响,在仅使用关键字进行处理的情况下,模型错误可能会对用于恢复图像访问的短语识别产生负面影响。
在分析 iOS 框架中的恶意 Rust 代码时,我们发现了用于与 Rust 服务器通信的客户端代码和负责数据加密的部分服务器代码。这让我们有理由相信攻击者服务器上的协议工作也是用 Rust 实现的。
基于以下事实,我们认为此次攻击活动至少针对欧洲和亚洲的 Android 和 iOS 用户:
-
关键词是用欧洲和亚洲国家居民使用的不同语言给出的。 -
资源中的词典具有与关键字相同的本地化。 -
有些应用程序显然可以在多个国家运行。因此,个人食品配送应用程序允许用户使用阿联酋、哈萨克斯坦、中国、印度尼西亚、津巴布韦和其他国家的电话号码进行注册。
同时,我们也不排除指定区域之外的移动设备用户可能成为恶意活动的受害者。
我们开始研究的第一个恶意软件模块之一是 Spark。同时,在分析iOS恶意软件时,我们的注意力被恶意框架本身的包标识符所吸引——bigCat.GZIPApp。为了纪念这一点,我们将该木马命名为 SparkCat。我们还可以强调该恶意软件的以下显著特征:
-
跨平台; -
使用在移动应用程序中很少见的 Rust 语言; -
官方应用商店作为分发载体之一; -
隐身 - C2 域经常模仿合法服务和恶意框架 - 服务包; -
混淆使得分析和检测变得困难。
结论
不幸的是,尽管官方平台进行了严格的审核,并且使用 OCR 窃取加密钱包的计划臭名昭著,但受感染的应用程序仍然出现在 Google Play 和 App Store 中。该木马尤其危险,因为没有任何迹象表明应用程序内部存在恶意植入:它请求的权限可能用于应用程序的主要功能,或者乍一看似乎无害,而且该恶意软件的运行相当隐蔽。此案再次打破了“Android 恶意应用程序带来的威胁与 iOS 无关”的神话。为了避免成为恶意软件的受害者,我们建议执行以下操作:
-
如果您安装了其中一个受感染的应用程序,请将其从您的设备中删除,并且在发布可消除恶意功能的补丁之前不要使用它。 -
请勿在图库中存储包含敏感信息的截图,包括用于访问加密货币钱包的恢复短语。密码、机密文件和其他敏感数据可以存储在特殊的应用程序中。 -
在所有设备上使用可靠的安全解决方案。
IoC
感染的 Android 应用程序
0ff6a5a204c60ae5e2c919ac39898d4f 21bf5e05e53c0904b577b9d00588e0e7 a4a6d233c677deb862d284e1453eeafb 66b819e02776cb0b0f668d8f4f9a71fd f28f4fd4a72f7aab8430f8bc91e8acba 51cb671292eeea2cb2a9cc35f2913aa3 00ed27c35b2c53d853fafe71e63339ed 7ac98ca66ed2f131049a41f4447702cd 6a49749e64eb735be32544eab5a6452d 10c9dcabf0a7ed8b8404cd6b56012ae4 24db4778e905f12f011d13c7fb6cebde 4ee16c54b6c4299a5dfbc8cf91913ea3 a8cd933b1cb4a6cae3f486303b8ab20a ee714946a8af117338b08550febcd0a9 0b4ae281936676451407959ec1745d93 f99252b23f42b9b054b7233930532fcd21bf5e05e53c0904b577b9d00588e0e7ea5800f12dd841b73e92d15e48b2b71
MD5 iOS 框架
35fce37ae2b84a69ceb7bbd51163ca8a cd6b80de848893722fa11133cbacd052 6a9c0474cc5e0b8a9b1e3baed5a26893 bbcbf5f3119648466c1300c3c51a1c77 fe175909ac6f3c1cce3bc8161808d8b7 31ebf99e55617a6ca5ab8e77dfd75456 02646d3192e3826dd3a71be43d8d2a9e 1e14de6de709e4bf0e954100f8b4796b54ac7ae8ace37904dcd61f74a7ff0d42caf92da1d0ff6f8251991d38a840fb4adb128221836b9c0175a249c7f567f620
GitLab 上的木马配置
hxxps://gitlab[.]com/group6815923/ai/-/raw/main/rel.json hxxps://gitlab[.]com/group6815923/kz/-/raw/main/rel.json
C2
api.firebaseo[.]com api.aliyung[.]com api.aliyung[.]org uploads.99ai[.]world socket.99ai[.]world api.googleapps[.]top
照片存储 hxxps://dmbucket102.s3.ap-northeast-1.amazonaws[.]com
来自 Google Play 的被感染 Android 应用程序的软件包名称 com.crownplay.vanity.address com.atvnewsonline.app com.bintiger.mall.android com.websea.exchange org.safew.messenger org.safew.messenger.store com.tonghui.paybank com.bs.feifubao com.sapp.chatai com.sapp.starcoin
iOS框架体内加密的BundleID
im.pop.app.iOS.Messenger com.hkatv.ios com.atvnewsonline.app io.zorixchange com.yykc.vpnjsq com.llyy.au com.star.har91vnlive com.jhgj.jinhulalaab com.qingwa.qingwa888lalaaa com.blockchain.uttool com.wukongwaimai.client com.unicornsoft.unicornhttpsforios staffs.mil.CoinPark com.lc.btdj com.baijia.waimai com.ctc.jirepaidui com.ai.gbet app.nicegram com.blockchain.ogiut com.blockchain.98ut com.dream.towncn com.mjb.Hardwood.Test com.galaxy666888.ios njiujiu.vpntest com.qqt.jykj com.ai.sport com.feidu.pay app.ikun277.test com.usdtone.usdtoneApp2 com.cgapp2.wallet0 com.bbydqb com.yz.Byteswap.native jiujiu.vpntest com.wetink.chat com.websea.exchange com.customize.authenticator im.token.app com.mjb.WorldMiner.new com.kh-super.ios.superapp com.thedgptai.event com.yz.Eternal.new xyz.starohm.chat com.crownplay.luckyaddress1
-
文章原文:https://securelist.ru/sparkcat-stealer-in-app-store-and-google-play/111638/
原文始发于微信公众号(独眼情报):苹果应用商店首次发现窃取加密货币的应用程序
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论