分析
最新XCSSET变种遵循四阶段感染链。前三个阶段与之前变种一致,本分析从第四阶段开始,包括boot()函数及其相关调用以下载和运行子模块。
第四阶段脚本的boot()函数
新变种对启动函数进行了修改,包括增加对Firefox浏览器的检查以及修改了Telegram存在性检查逻辑。此阶段还下载并执行多个新模块。
旧变种: 图1. 早期变种的boot()函数
新变种: 图2. 最新版本的boot()函数
以下部分将检查现有子模块的更改以及此变种中的附加模块。
vexyeqj [旧变种:seizecj] (信息窃取器)
与之前变种相比,此脚本中的几个命令被注释掉。此外,它下载了一个名为bnk的模块,使用osascript执行,并将域作为参数传递。然后等待三秒并删除下载的文件。
图3. 信息窃取子模块的主要逻辑
bnk文件是一个仅运行的编译AppleScript。使用GitHub上的AppleScript反汇编器项目可以对代码进行反汇编分析。
该脚本定义了多个函数,用于数据验证、加密、解密、从命令和控制(C2)获取额外数据以及日志记录。脚本以域作为参数执行。
图4. dec()函数的反汇编代码
上面是dec()函数的代码片段,用于解密从C2服务器接收的数据。解析上述代码得到命令:
加密数据存储在变量in中。提取此变量的前32个字符作为初始化向量(IV)。剩余数据经过Base64解码后提供给AES解密函数。在这种情况下,解密密钥是预定义常量27860c1670a8d2f3de7bbc74cd754121,该常量在主函数内建立并计算。
解码的blob似乎是一个配置文件。以下是从C2服务器获取的解密响应的格式化和编辑示例:
图5. 从C2服务器接收的配置数据
以下部分检查下载的bnk有效负载的核心逻辑,解释先前信息如何被解释和应用。
首先,它调用定义的函数从C2服务器获取配置数据;该数据被解密并存储在变量中。执行shell命令以检索SerialNumber和当前用户。
检索剪贴板内容,该内容通过检查AEVT(Apple事件代码)代码确定。然后进程识别最前端的应用程序,该程序与C2响应中"bad"属性定义的阻止列表进行核对。仅当当前剪贴板数据与最后一个剪贴板条目和最后一个替换的剪贴板数据都不同,剪贴板数据长度超过25个字符,且oD()函数不返回true时,处理才会继续。oD()函数在前四个字符为数字时返回true。经过上述检查后,它还有多个门和条件。第一个条件检查剪贴板长度是否在50 < len(剪贴板) < 300之间。然后检查剪贴板是否与响应中s记录定义的模式匹配。如果匹配,剪贴板数据以记录类型字符串格式化并外泄到C2服务器。传输的数据也经过AES加密。
在第二个条件中,脚本验证剪贴板长度是否在25到65之间,是否使用单个参数执行,以及cD(剪贴板数据)函数返回的值是否大于1,该值指的是传入参数中数字的计数。如果满足这些条件,脚本将遍历C2响应中的子集合,其中包括各个钱包的单独条目。每个子集合条目包含:
- a:包含地址列表,从中选择一个;相应的剪贴板数据随后被替换。
- t:指钱包标识符。
- r:指定用于匹配与此钱包关联地址的正则表达式模式。
- ir(可选):表示负正则表达式模式;匹配此模式的地址应被排除。
- p:似乎用作计数器或记录索引。
对于每个记录,它匹配r和ir的模式。如果变量r为true且ir为false,则程序检查剪贴板内容是否与任何攻击者的地址匹配。如果不匹配,则从列表中选择一个地址并相应地替换剪贴板的内容。系统随后将信息(包括原始剪贴板数据、替换的数据、钱包名称、最前端应用程序和其他相关详细信息)发送到C2服务器。接下来,它将剪贴板数据的值分配给xcP变量,该变量跟踪最近替换的剪贴板条目。最后,它更新xP变量以反映当前剪贴板文本,等待两秒钟,并重复循环。
neq_cdyd_ilvcmwx (文件窃取器)
此模块从C2服务器检索附加脚本,该脚本保存在/tmp/目录中。随后使用域和moduleName作为参数执行脚本。执行后,删除下载的文件。该模块作为编译的仅运行AppleScript运行。该脚本与之前被识别为针对浏览器的数字钱包数据窃取器的txzx_vostfdi模块相似。在分析期间,C2服务器未提供文件夹列表;但是,它能够将文件外泄回C2服务器。
图6. 下载并执行附加脚本
xmyyeqjx (基于LaunchDaemon的持久化)
此子模块为~/.root文件设置LaunchDaemon持久化,该文件在此模块中创建。以下是脚本的摘要:
进程首先在用户的HOME目录中创建几个路径和一个~/.root文件,该文件将包含有效负载。有效负载执行以下操作:
- 将目录更改为/Users/Shared
- 检查网络连接
- 检索本地登录用户
- 睡眠30秒
- 在登录用户的上下文中执行~/.zshrc文件(.zshrc文件在之前的子模块中附加了恶意有效负载)
- 睡眠30秒
- 修改两个配置以执行系统命令,禁用macOS自动配置更新和快速安全响应机制。
这些命令修改macOS软件更新首选项以禁用各种关键的Apple更新,包括快速安全响应(RSR)、安全配置更新等。
然后它调用doMainFunc()函数。
图7. 创建虚假应用程序并从C2服务器下载附加脚本。
此函数首先检查LaunchDaemon条目是否存在,其中内容包含.root文件。如果未找到,则从C2服务器下载另一个脚本,该脚本又是一个仅运行的编译AppleScript。然后在/tmp目录中创建一个名为System Settings.app的虚假应用程序,该应用程序基本上执行此下载的AppleScript并带有两个参数。这些参数似乎是标签/plist名称和要持久化的文件(~/.root文件)。创建虚假应用程序后,它调用另一个函数,等待合法的系统设置应用程序启动,然后执行虚假应用程序。此行为用于伪装自己为合法。
下载的脚本首先通过执行shell命令获取设备的序列号和当前用户名。然后形成LaunchDaemon plist文件的路径并构建其内容。它使用echo命令将此构建的内容粘贴到LaunchDaemon文件中。文件名是参数中传递的名称。以下是创建的plist文件的示例:
图8. 创建的LaunchDaemon条目的Plist内容
它在plist名称中使用前缀com.google.进行伪装,并使用bash执行~/.root文件。echo命令使用"do shell script …. with administrator privileges"运行,这可以通过badm AEVT代码推断。然后执行chown命令将所有者更改为root:wheel,并对plist文件设置644权限。最后,使用sudo执行launchctl load -w命令以启动守护进程。
jey [旧变种:jez] (基于Git的持久化)
旧变种中的命令通过shell直接执行加密有效负载与重复解密命令的串联。在新变种中,解密逻辑封装在shell函数内,该函数内联定义,然后在传递给shell执行之前用于解密加密字符串。此更改主要增强了恶意软件使用的混淆方法。
旧逻辑: 图9. 旧变种中的有效负载生成逻辑
新逻辑: 图10. 最新变种中的有效负载生成逻辑
iewmilh_cdyd (针对Firefox的信息窃取器)
此新变种增加了一个信息窃取模块,以外泄Firefox存储的数据。首先调用runMe()函数从C2服务器下载一个Mach-O FAT二进制文件,该文件负责所有信息窃取操作。
图11. 下载HackBrowserData项目的编译二进制文件
此下载的二进制文件似乎是GitHub项目HackBrowserData的修改版本,能够解密和导出浏览器存储的数据。密码、历史记录、信用卡信息和cookie是它可以从几乎所有流行浏览器提取的关键信息。
下载后,二进制文件被授予可执行文件权限,在受害者的机器上进行临时签名,并使用–b firefox -f json –dir ” & resDir & ” –zip作为参数执行:
- -b:浏览器名称
- -f:输出数据的格式
- –dir:存储输出的导出目录
- –zip:此标志将输出存储在压缩的ZIP中
一旦检索到所有数据,它使用其旧方法将压缩的ZIP和日志文件以块的形式上传到C2服务器。
缓解和保护指南
防御者可以采取以下缓解步骤来防御此威胁:
- 运行最新版本的操作系统和应用程序。一旦有最新安全更新,立即部署。
- 始终检查并验证从存储库下载或克隆的Xcode项目,因为恶意软件通常通过受感染的项目传播。
- 在复制和粘贴敏感数据时保持谨慎。始终验证粘贴的内容是否与预期来源匹配,以避免成为剪贴板劫持或数据篡改攻击的受害者。
- 鼓励用户使用支持Microsoft Defender SmartScreen的Web浏览器,如适用于macOS和各种平台的Microsoft Edge,它可以识别并阻止恶意网站,包括网络钓鱼站点、诈骗站点以及包含漏洞利用和托管恶意软件的站点。
- 使用Microsoft Defender for Endpoint on Mac,它可以检测、停止并隔离本文讨论的恶意软件。
Microsoft Defender for Endpoint客户还可以应用以下缓解措施,以减少环境攻击面并减轻此威胁及其有效负载的影响:
- 在Microsoft Defender防病毒软件上开启云提供的保护和自动样本提交。这些功能使用人工智能和机器学习快速识别并阻止新的未知威胁。
- 启用阻止模式下的潜在不需要应用程序(PUA)保护,以自动隔离像广告软件这样的PUA。PUA阻止在下次签名更新或计算机重启后在终端客户端生效。
- 开启网络保护以阻止与恶意域和IP地址的连接。
Microsoft Defender XDR检测
Microsoft Defender XDR客户可以参考下面的适用检测列表。Microsoft Defender XDR跨端点、身份、电子邮件、应用程序协调检测、预防、调查和响应,以提供针对本文讨论的威胁等攻击的综合保护。
| 战术 | 观察到的活动 | Microsoft Defender覆盖 |
|---|---|---|
| 初始访问 | – 恶意Xcode项目 | Microsoft Defender防病毒软件 – Trojan:MacOS/XCSSET.PB Microsoft Defender for Endpoint – Possible XCSSET activity |
| 执行 | – 恶意命令执行 – 恶意文件执行 – 恶意osascript执行 | Microsoft Defender防病毒软件 – Behaviour:MacOS/SuspOsascriptExec.B – Behaviour:MacOS/SuspOsascriptExec.C – Trojan:MacOS/XCSSET.AB – Trojan:MacOS/XCSSET.BA – Trojan:MacOS/XCSSET.SE – Behavior:MacOS/SuspXcssetBehavior.AT – Trojan:MacOS/XCSSET.ST – Trojan:MacOS/XCSSET.SB – Trojan:MacOS/XCSSET.SC Microsoft Defender for Endpoint – Suspicious file dropped and launched – Suspicious script launched – Network connection by osascript – Suspicious process launched from a world-writable directory |
| 持久化 | – 隐藏的LaunchDaemon持久化 | Microsoft Defender防病毒软件 – Behavior:MacOS/SuspHiddenPersistence.A1 Microsoft Defender for Endpoint – Suspicious Plist modifications – Suspicious launchctl tool activity |
| 防御规避 | – 可疑的混淆命令 | Microsoft Defender for Endpoint – Suspicious file or information obfuscation detected |
| 凭据访问 | – 使用修改的HackBrowserData项目 | Microsoft Defender防病毒软件 – Trojan:MacOS/HackBrowserData.A |
| 影响 | – Xcode项目感染 | Microsoft Defender防病毒软件 – Behavior:MacOS/XCSSET.A |
注意:有关与旧XCSSET变种相关的检测,请参阅我们2025年3月的博客文章。
威胁情报报告
Microsoft客户可以在Microsoft产品中使用以下报告,以获取有关威胁行为者、恶意活动以及本文讨论的技术的最新信息。这些报告提供情报、保护信息以及建议的操作,以预防、缓解或响应在客户环境中发现的关联威胁。
Microsoft Defender XDR威胁分析
- 工具配置文件:XCSSET
狩猎查询
Microsoft Defender XDR
Microsoft Defender XDR客户可以运行以下查询以在其网络中找到相关活动:
构建Xcode项目时的可疑命令
在构建Xcode项目时搜索与此XCSSET相关的可疑命令。
|
|
XCSSET信息窃取模块执行的可疑命令
搜索与从C2接收的数据解密逻辑相关的可疑命令。
|
|
可疑应用程序创建
搜索此XCSSET在Temp文件夹中创建的可疑应用程序。
|
|
Microsoft Sentinel
Microsoft Sentinel客户可以使用TI映射分析(一系列以前缀’TI map’开头的分析)自动将本文中提到的恶意域指示符与其工作区中的数据匹配。如果当前未部署TI Map分析,客户可以从Microsoft Sentinel内容中心安装威胁情报解决方案,以在其Sentinel工作区中部署分析规则。
以下是使用Sentinel高级安全信息模型(ASIM)函数跨Microsoft第一方和第三方数据源狩猎威胁的查询。ASIM还支持使用ARM模板或手动从GitHub部署解析器到特定工作区。
使用ASIM检测网络IP和域泄露指标
以下查询检查ASIM网络会话解析器支持的数据源中的IP地址和域IOC:
|
|
使用ASIM检测域和URL泄露指标
以下查询检查ASIM Web会话解析器支持的数据源中的域和URL IOC。
|
|
泄露指标
| 指标 | 类型 | 描述 |
|---|---|---|
| cdntor[.]ru | 域 | C2服务器 |
| checkcdn[.]ru | 域 | C2服务器 |
| cdcache[.]ru | 域 | C2服务器 |
| applecdn[.]ru | 域 | C2服务器 |
| flowcdn[.]ru | 域 | C2服务器 |
| elasticdns[.]ru | 域 | C2服务器 |
| rublenet[.]ru | 域 | C2服务器 |
| figmastars[.]ru | 域 | C2服务器 |
| bulksec[.]ru | 域 | C2服务器 |
| adobetrix[.]ru | 域 | C2服务器 |
| figmacat[.]ru | 域 | C2服务器 |
| digichat[.]ru | 域 | C2服务器 |
| diggimax[.]ru | 域 | C2服务器 |
| cdnroute[.]ru | 域 | C2服务器 |
| sigmanow[.]ru | 域 | C2服务器 |
| fixmates[.]ru | 域 | C2服务器 |
| mdscache[.]ru | 域 | C2服务器 |
| trinitysol[.]ru | 域 | C2服务器 |
| verifysign[.]ru | 域 | C2服务器 |
| digitalcdn[.]ru | 域 | C2服务器 |
| windsecure[.]ru | 域 | C2服务器 |
| adobecdn[.]ru | 域 | C2服务器 |
| 12ea52c4089d100e679a2350f03e598b2f3feebfbbd2ed5631a2a7a20b07e826 | SHA-256 | /tmp/ancr (HackBrowserData Github项目的修改版本) |
| 5a212c5ce1e0f41e721ce0940afb381b694a2e32a6d19c1d2210f703636362df | SHA-256 | /tmp/b (第四阶段有效负载) |
| 0fbd0e1995472f308cf1ac8229a02c277035404426769fa50947a72c95ad7d31 | SHA-256 | jey (通过Git提交建立持久化) |
| f3bc158619b2aad17def966f0ac8dddc2107e4911a7c488d358d906f27ac2a2b | SHA-256 | /tmp/xmyyeqjx (基于LaunchDaemon的持久化) |
参考资料
- https://www.microsoft.com/en-us/security/blog/2025/03/11/new-xcsset-malware-adds-new-obfuscation-persistence-techniques-to-infect-xcode-projects/
- https://github.com/Jinmo/applescript-disassembler
- https://www.trendmicro.com/en_us/research/20/h/xcsset-mac-malware--infects-xcode-projects--uses-0-days.html
- https://documents.trendmicro.com/assets/pdf/XCSSET_Technical_Brief.pdf
- https://www.intego.com/mac-security-blog/mac-malware-exposed-xcsset-an-advanced-new-threat/
- https://www.jamf.com/blog/osx-xcsset-subverts-developer-environments/
- https://www.sentinelone.com/blog/xcsset-malware-update-macos-threat-actors-prepare-for-life-without-python/