XCSSET恶意软件再次进化:最新变种技术深度分析

微软威胁情报团队发现XCSSET恶意软件新变种,该变种针对Xcode项目进行感染,新增浏览器窃取、剪贴板劫持和持久化机制,采用高级加密混淆技术和仅运行编译的AppleScript实现隐蔽执行。

分析

最新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命令以检索序列号和当前用户。

检索剪贴板内容,通过检查AEVT代码确定。然后进程识别最前端的应用程序,与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文件
  • 睡眠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相关的可疑命令。

1
DeviceProcessEvents | where ProcessCommandLine has_all("echo", "xxd -p -r", "| sh") or ProcessCommandLine has_all("echo", "base64 -d", "| sh")| where InitiatingProcessFileName has_any ("sh", "bash", "zsh") | where InitiatingProcessCommandLine contains "/Developer/Xcode/DerivedData"

XCSSET信息窃取模块执行的可疑命令

搜索与从C2接收的数据解密逻辑相关的可疑命令。

1
DeviceProcessEvents| where ProcessCommandLine has_any ("base64 --decode", "base64 -d") and ProcessCommandLine has_all ("openssl enc -d", "cut -c1-32")

可疑应用程序创建

搜索此XCSSET在Temp文件夹中创建的可疑应用程序。

1
DeviceFileEvents| where FolderPath matches regex @"/tmp/[a-zA-Z]\.app"

Microsoft Sentinel

Microsoft Sentinel客户可以使用TI映射分析(一系列以"TI map"为前缀的分析)自动将此博客文章中提到的恶意域指示器与其工作区中的数据匹配。如果当前未部署TI Map分析,客户可以从Microsoft Sentinel内容中心安装威胁情报解决方案,以在其Sentinel工作区中部署分析规则。

以下是使用Sentinel高级安全信息模型(ASIM)函数跨Microsoft第一方和第三方数据源狩猎威胁的查询。ASIM还支持使用ARM模板或手动从GitHub将解析器部署到特定工作区。

使用ASIM检测网络IP和域泄露指标

以下查询检查ASIM网络会话解析器支持的数据源中的IP地址和域IOC:

1
2
3
4
5
6
7
//IP list and domain list- _Im_NetworkSession
let lookback = 30d;
let ioc_ip_addr = dynamic([]);
let ioc_domains = dynamic(["cdntor.ru", "checkcdn.ru", "cdcache.ru", "applecdn.ru", "flowcdn.ru", "elasticdns.ru", "rublenet.ru", "figmastars.ru", "bulksec.ru", "adobetrix.ru", "figmacat.ru", "digichat.ru", "diggimax.ru", "cdnroute.ru", "sigmanow.ru", "fixmates.ru", "mdscache.ru", "trinitysol.ru", "verifysign.ru", "digitalcdn.ru", "windsecure.ru", "adobecdn.ru"]);
_Im_NetworkSession(starttime=todatetime(ago(lookback)), endtime=now())
| where DstIpAddr in (ioc_ip_addr) or DstDomain has_any (ioc_domains)
| summarize imNWS_mintime=min(TimeGenerated), imNWS_maxtime=max(TimeGenerated),  EventCount=count() by SrcIpAddr, DstIpAddr, DstDomain, Dvc, EventProduct, EventVendor

使用ASIM检测域和URL泄露指标

以下查询检查ASIM Web会话解析器支持的数据源中的域和URL IOC。

1
2
3
4
// file hash list - imFileEvent
// Domain list - _Im_WebSession
let ioc_domains = dynamic(["cdntor.ru", "checkcdn.ru", "cdcache.ru", "applecdn.ru", "flowcdn.ru", "elasticdns.ru", "rublenet.ru", "figmastars.ru", "bulksec.ru", "adobetrix.ru", "figmacat.ru", "digichat.ru", "diggimax.ru", "cdnroute.ru", "sigmanow.ru", "fixmates.ru", "mdscache.ru", "trinitysol.ru", "verifysign.ru", "digitalcdn.ru", "windsecure.ru", "adobecdn.ru"]);
_Im_WebSession (url_has_any = ioc_domains)

泄露指标(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的持久化)

参考资料

了解更多

有关Microsoft威胁情报社区的最新安全研究,请查看Microsoft威胁情报博客。

要获取新发布的通知并加入社交媒体的讨论,请在LinkedIn、X(前身为Twitter)和Bluesky上关注我们。

要听取Microsoft威胁情报社区关于不断演变的威胁形势的故事和见解,请收听Microsoft威胁情报播客。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计