服务器 Squirrel 脚本远程执行漏洞修复
历史事件
本文记录的漏洞已于 2023 年 1 月完成修复。文章保留了团队当时的调查、协调披露和技术分析过程。
2023 年 1 月,我们发现 Titanfall 2 官方服务器中存在一个 RCE(Remote Code Execution,远程代码执行)漏洞。Northstar 和 NorthStarCN 项目组研究了该漏洞的危害,并向 EA 和 Respawn 报告了问题。
该漏洞允许任意客户端通过 script 命令,在 Titanfall 2 官方服务器上执行游戏中存在的任意 Squirrel 脚本。正常情况下,客户端不应拥有这样的权限。
简单来说,客户端原本无权直接修改游戏服务器中的数据。玩家操作通常需要经过多次验证,才能在服务器上生效并改变数据。这套流程形成了一个相对封闭的信任链,外部通常很难直接介入。然而,Respawn 的一次服务器更新错误地将部分开发版本功能带入了正式环境,导致原本仅供开发者测试的指令在官方服务器上被激活,并且对所有客户端开放。原有的信任链因此被从外部打破。
我们认为,该漏洞是在 2022 年末的某次服务端补丁中引入的。2022 年初,我们曾发现另一个能够实现类似效果的漏洞 script_client,相关内容可以参考 p0358 此前的文章和视频。该漏洞已于 2022 年中旬修复,利用难度更高,影响也更小。
我们通过 EA 的协调漏洞披露流程上报了本次漏洞。经过 EA 审核和 Respawn 修补,问题在大约两周内得到解决。
相关术语
Squirrel:Respawn 用于编写 Titanfall 2 和 Apex Legends 游戏逻辑的脚本语言,语法与 C、C++ 和 Java 有相似之处。它也被应用于 Valve 的 Portal 2、CS2、Alien Swarm、Left 4 Dead 2 和 Team Fortress 2 等游戏。
Squirrel VM:用于运行 Squirrel 脚本的虚拟机,是起源引擎与外部脚本之间的抽象绑定层。
时间线
以下是从发现漏洞到确认修复的完整时间线。
2023-01-09 10:22 UTC
在 Northstar Discord 服务器的一个半公开频道中,zxcPandora 发现 script 指令允许客户端在官方服务器上运行服务端 Squirrel 脚本。

script GameRules_ChangeMap( "mp_colony02","fd_master" )该漏洞影响构建编号为 8740 的 Titanfall 2 官方服务器,也就是修复前的所有官方服务器实例。

大约半小时后,我们意识到了这个漏洞的严重性。我们立即截图存档所有相关对话,并删除频道中的漏洞信息,避免细节进一步扩散。
需要注意的是,最初的消息发布在一个拥有 100 多名成员的半公开频道中。因此,从一开始我们就知道,漏洞扩散只是时间问题。
当天,Taskinoz 直接联系了一位他认识的 Respawn 员工。此前,他也一直作为我们向 Respawn 报告漏洞的联系人。
2023-01-09 12:30 UTC
我们使用原版 Titanfall 2 客户端进行了快速验证。测试中,我们通过 bind 指令绑定前文提到的 GameRules_ChangeMap,并用它更改官方服务器的游戏模式和地图。
视频展示了在“异常”地图上运行边境防御模式。这个地图与模式的组合从未在正式游戏中发布,正常情况下,在选择边境防御后也无法选定“异常”地图。
这并不是漏洞唯一能够实现的效果。出于安全考虑,本文不会列举所有高危指令或函数,只会选取少数极难利用或已经修复的案例进行说明。
2023-01-09 13:40 UTC
我们向 EA 安全部门发送邮件,报告了该漏洞。

2023-01-10 15:04 UTC
由于尚未收到 EA 的回复,我们发送了一封跟进邮件。

与此同时,我们发现已经有人开始利用这个漏洞在游戏服务器中进行恶意操作。
事后复盘时,我们发现该漏洞可能早在 2022 年 9 月左右就已存在,并且已经被部分人发现,例如 x88 等人。我们很可能不是最早发现它的团队。由于漏洞非常容易触发,一些不了解情况的玩家甚至曾在官方服务器中意外使用过它。

2023-01-10 18:28 UTC
我们收到了 EA 的初步回复。对方表示正在调查此问题,并要求我们在问题解决前对漏洞细节保密。

2023-01-14 11:30 UTC
获得更多信息后,我们又发送了一封跟进邮件,并附上部分受影响玩家的截图。




漏洞修复前,游戏内玩家等级超过 G127.49 后会发生数值溢出。如果玩家等级被修改为 G128 或更高,该玩家将无法再次登录官方游戏服务器。
2023-01-17 17:12 UTC
我们向 EA 安全团队发送了另一封跟进邮件。

此时,距离漏洞最初被发现已经过去一个多星期。我们没有收到 EA 安全团队的进一步回复,与 Respawn 联系人的沟通也越来越少。与此同时,利用该漏洞攻击其他玩家的案例开始增多。
我们观察到的案例通常没有造成特别严重的后果,例如让铁驭装备泰坦武器,但这已经清楚表明:漏洞的利用方法正在部分群体中传播。
结合 NorthStarCN 开发成员提供的进一步研究信息,我们判断该漏洞正在变得越来越危险。因此,我们决定为 EA Security 设定最后期限。期限过后,如果问题仍未解决,我们将公开发布警告,建议所有玩家暂时不要进入官方服务器。
2023-01-21 08:25 UTC
检查漏洞状态时,D3-3109 注意到官方服务器的版本号已经更新。经过进一步测试,我们确认客户端已无法再通过 script 指令远程执行服务端代码。

2023-01-21 13:39 UTC
我们认为问题已经得到解决,并将测试结果通知了 EA 安全团队。

2023-01-23 20:23 UTC
两天后,我们收到 EA 安全团队的确认回复,问题已经修复。

潜在的安全风险
该漏洞实际上向客户端开放了服务器 Squirrel VM 的完整执行权限。这意味着客户端能够调用服务器中的任意 Squirrel 函数,并提取游戏内数据。
下面列出该漏洞可能导致的部分攻击。请注意,这些内容仅在本地 Northstar 环境中复现和测试。我们从未在公共 Titanfall 2 服务器中对其他玩家进行此类测试,因为这可能造成无法挽回的损失。
篡改玩家数据
官方游戏服务器有权修改玩家状态,因此该漏洞也允许攻击者任意更改玩家数据。我们观察到有人尝试使用漏洞提高自己的游戏等级,也有玩家在公共对局中复制并粘贴用于修改等级的命令,却意外更改了其他玩家的数据。
无论出于故意还是意外,将玩家等级设置得过高都会导致游戏服务器拒绝该玩家进入多人游戏。在协助 Respawn 修复漏洞的过程中,我们添加了一个处理方案,使等级过高的玩家能够显示对应等级。
此外,该漏洞还可以解锁全部皮肤、横幅和徽章,包括开发者徽章。因此,拥有开发者徽章不再能够证明该玩家确实是开发者。
DevTextBufferWrite / DevTextBufferDumpToFile
为了方便开发调试,Squirrel 提供了一些测试功能。这里重点讨论其中两个:DevTextBufferWrite 和 DevTextBufferDumpToFile。
这些功能只能在 Titanfall 2 游戏服务器上执行,不能在游戏客户端中执行。除非注册了远程回调函数(callbacks),服务器也不会允许客户端编译或执行脚本。
DevTextBufferWrite 可以将字符串写入缓冲区,DevTextBufferDumpToFile 则可以将缓冲区保存到文件。例如:
script DevTextBufferWrite("this is a test")
script DevTextBufferDumpToFile("abc.txt")这两条命令会创建一个名为 abc.txt 的文件,其中包含文本 this is a test。
文件操作并不局限于当前目录。只要服务器进程有权访问目标位置,就可以向函数传入任意绝对路径并写入文件。该函数只能写入文本,无法直接上传二进制文件。
然而,文本仍然可以被写成批处理脚本,再由脚本下载和运行可执行文件。真正的难点在于如何执行这个批处理文件。一种思路是将文件写入 Windows 用户的启动目录,使它在系统重启时自动运行。要完成这一步,攻击者必须知道目标设备的 Windows 用户名,因为用户名是目录路径的一部分。
如果已知用户名,就可以执行类似下面的命令:
script DevTextBufferWrite("start \"calc.exe\"")
script DevTextBufferDumpToFile("C:\\Users\\USERNAME\\AppData\\Roaming\\Microsoft\\Windows\\Start Menu\\Programs\\Startup\\test.bat")系统重启后,这个批处理文件会被执行。示例只会打开计算器,但也可以将内容替换为 PowerShell 脚本,用于下载并运行其他程序。
下面这种路径无法使用:
%appdata%\Microsoft\Windows\Start Menu\Programs\Startup\test.bat%appdata% 在这里不会被解析,因此函数无法定位目标路径。
需要强调的是,这两个功能只能在游戏服务器上执行。通过这种方式受到攻击的是 Respawn 的游戏服务器,而不是玩家客户端。Respawn 的游戏服务器运行在基于 Windows 的容器中。
因此,这种攻击方式对玩家电脑的直接威胁并不大。此类容器的生命周期通常是一次性的:新容器从 Respawn 构建的镜像启动,随后由调度系统移除并替换,几乎没有重启操作系统并触发启动脚本的机会。利用这种方式进一步攻击玩家电脑的难度极高,几乎无法实现。我们之所以详细说明这个案例,是因为它能够直观展示漏洞对服务器执行环境的控制程度。
ClientCommand
攻击者甚至不需要完全控制游戏服务器,就可能开始影响其他客户端。
Titanfall 2 官方服务器的安全模型与 Northstar 不同。从游戏客户端的角度来看,官方服务器完全可信,因此客户端会接受服务器下发的命令。例如,在匹配过程中,服务器会发送 ClientCommand,要求客户端连接到某个特定服务器。
ClientCommand 不能直接强制官方客户端执行脚本,因为官方客户端没有 script_client 或 script_ui 功能。因此,利用 ClientCommand 发起攻击仍然存在限制,可用范围主要是 connect 等指令。
Northstar 完全阻止了 ClientCommand,服务端不能命令客户端执行任何指令。这项限制十分必要:官方 Titanfall 2 专用服务器只由 Respawn 托管,而任何人都可以在 Northstar 或 NorthStarCN 中运营服务器。因此,在我们的安全模型中,游戏服务器始终是不可信的。
Stryder 会话令牌窃取
Stryder 是 Respawn 游戏服务器后端的代号。
原版游戏客户端连接服务器时,会向服务器发送有效的 Stryder 会话令牌,这可能用于某种身份验证。结合前面提到的 ClientCommand,攻击者可以利用脚本漏洞,强制参与公共匹配的客户端连接到攻击者自行托管的服务器。
客户端连接后会发送 Stryder 会话令牌,攻击者可以捕获该令牌,并以受害者身份向 Titanfall 2 的 Stryder 后端发起 API 请求,从而对受害者账户进行操作。这个过程与中间人攻击(MITM)有些相似。
2022 年 10 月左右,我们发现客户端会将 Stryder 令牌发送给游戏服务器,因此为 Northstar 部署了一个补丁,用于清除令牌信息,阻止客户端继续向服务器发送有效令牌。我们同时要求玩家更新 Northstar,确保只有已修复的版本可以继续进入游戏。
在官方 Titanfall 2 服务器原有的安全模型中,发送 Stryder 会话令牌可能是可以接受的,因为官方服务器对客户端完全可信,向它发送有效令牌并不构成安全问题。然而,脚本漏洞瓦解了这套信任模型。攻击者能够控制官方服务器后,服务器便不再可信。
总结
本文梳理了团队发现漏洞、向 EA 安全部门和 Respawn 报告问题,并最终协作完成修复的过程。感谢 Respawn 和 EA 安全部门听取我们的反馈并解决了问题。
特别感谢 zxcPandora 最初发现该漏洞,Emma 完成部分 PoC 测试,Wolf109909、D3-3109 和 NorthStarCN 团队持续整理并同步研究信息,Taskinoz 协助联系 Respawn 员工,H0L0 和 eRaid 校对英文原稿,以及所有 Northstar 开发者、贡献者和社区成员。中文版本由 D3-3109 翻译,并使用 GPT-5.6 Sol 提供编辑辅助。