跳到主要内容

1 篇博文 含有标签「网络安全」

查看所有标签

· 阅读需 20 分钟
D3-3109
Wolf109909
Gecko
ChatGPT

在2023年1月份的某天,我们发现了一个存在于泰坦陨落2官方服务器上的一个RCE(remote command/code execute,远程任意命令/代码执行)漏洞,NorthStar和NorthStarCN项目组研究了该漏洞的危害性,并向EA和重生工作室报告了这一漏洞。

该漏洞允许任意客户端使用脚本命令(script)在Titanfall2官方服务器上执行任何游戏中存在的Squirrel脚本。正常情况下,客户端不应该具有这种权限或者能力。

你可能对上边这一段话理解非常困难,别急,简单来说,客户端并没有直接修改游戏服务器上的数据的权限,玩家的操作通常会需要经过多次验证才会最终在游戏服务器上生效,数据才会被改动,这就形成了一个闭合的逻辑,通常很难在这个闭环中找到漏洞。但是重生干了一件非常蠢的事,在某次服务器的版本更新中,他们错误的让官方游戏服务器的版本具有了开发版本的一些特性,从而导致本来在开发环境中用来给开发者测试用的指令全部在官方服务器中被激活,对所有客户端都可用,这就导致前边构建的闭合逻辑直接从外界被攻破。

我们认为这个漏洞是在2022年年底的某一次服务器端修补程序中被引入的,因为我们在2022年初发现了另一个漏洞(即script_client,可以找之前p0358的文章和相关视频看看,已经在2022年中旬被修复),它达到了类似的效果,但在实际操作中,操作难度更大,影响更小。

这个漏洞是通过EA的协调漏洞披露过程上报的,经过EA的审核和重生的修补,这个漏洞在大约两个星期的时间内被完成了修复。


术语

Squirrel : Squirrel直译为松鼠,被重生用作Titanfall2和Apex英雄的游戏内逻辑的脚本语言,语法和C/C++/Java比较相似,同时也应用在Valve的Portal 2,CS2,Alien Swarm,Left 4 Dead 2,Team Fortress 2等游戏中。

Squirrel VM : Squirrel VM是是一种虚拟机,用于脚本编写,作为源引擎和外部脚本之间的抽象绑定层。


时间线

以下是从发现漏洞到修复的事件时间表

2023-01-09 10:22 UTC

在NorthStar Discord服务器中的一个半公开频道中,zxcPandora发现了"script"指令允许了客户端在官方服务器中运行服务端的Squirrel脚本

screen-shot-1

script GameRules_ChangeMap( "mp_colony02","fd_master" )

这个漏洞会影响构建编号(build)为8740的Titanfall 2官方服务器,即该漏洞修复前的所有官方服务器实例

screen-shot-2

在大约半小时内,我们意识到了这个漏洞的严重性。

我们立即屏幕截图存档了所有有关于这个漏洞的对话,并删除了所有有关漏洞的信息,以防止该漏洞被进一步曝光。

需要注意的是,该消息是发布在一个有100多个成员的半公开频道中的。因此,从一开始就得搞清楚,漏洞的扩散只是时间问题。

当天,Taskinoz直接联系了一位他认识的Respawn员工。我们之前一直在以他搭桥,作为我们报告漏洞的媒介。

2023-01-09 12:30 UTC

我们使用原版的Titanfall 2客户端进行了一次快速的验证,使用bind指令绑定了上文提到的GameRules_ChangeMap指令,用于更改官方游戏服务器的游戏模式和地图

演示片段

此视频展示了在地图异常上运行边境防御模式。然而,这个地图/模式组合从未在正式游戏中发布,正如在视频中游戏模式选择边境防御后,无法选定地图异常那样。

当然,这不是这个漏洞唯一能干的事,但是出于安全因素考虑,我们不会在这个文章中列举所有高危的指令或者函数,只会挑出几个极难实现或者已经被修复的例子来说明。

2023-01-09 13:40 UTC

我们向EA安全部门发送了一封邮件来通知他们这个漏洞的存在

email-3

2023-01-10 15:04 UTC

因为没有得到EA的回复,我们发送了一封跟进邮件

email-4

同时我们发现已经有人开始利用这个漏洞在游戏服务器内作恶

(实际上,事后复盘的时候,我们发现这个漏洞在2022年9月份左右可能就存在且被一部分人发现了,例如x88之流,我们极有可能不是第一批发现这个漏洞的人,因为这个漏洞实在太容易被使用,有一些不明所以的玩家也不小心在官服触发过这个漏洞)

reddit

2023-01-10 18:28 UTC

我们收到了EA的初步回复,表示他们正在调查此问题。同时,他们要求我们在问题解决之前保密任何与此漏洞有关的细节。

ea

2023-01-14 11:30 UTC

根据新的已有信息,我们发送了另一封跟进邮件

reply

同时我们附件发送了部分被攻击玩家的图片

pic1

pic2

pic3

在漏洞被修复前,游戏内玩家等级超过G127.49就会出现数值溢出的情况,即如果玩家的等级被修改到了G128及以上,就无法再次登录官方的游戏服务器

2023-01-17 17:12 UTC

我们向EA安全团队发送了另一封跟进邮件。

ea2

此时距离最初的发现已经过去了一个多星期,我们没有收到EA安全团队的进一步回复,我们的重生线人也很少有和我们联系。同时,我们看到越来越多的漏洞利用被用于攻击其他玩家的例子。尽管我们看到的例子通常没有大的危害性,例如有玩家作为铁驭但能给自己配备泰坦武器,但这清楚地表明漏洞的利用方法开始在某些群体内传播。

鉴于NorthStarCN开发成员组向我们提供的一些挖掘出的信息,这个漏洞正变得越来越危险。

因此,我们决定给EA Security一个最后期限,在此之后,我们将公布消息,警告所有玩家不要在官方的服务器上游玩。

2023-01-21 8:25 UTC

在检查漏洞的状态时,D3-3109注意到了更新的服务器版本号。经过进一步测试,我们确认了script指令无法再用于在客户端远程运行服务器端代码。

server

2023-01-21 13:39 UTC

我们认为问题已经得到解决,因此相应地通知了EA安全团队。

ea3

2023-01-23 20:23 UTC

两天后,我们收到了 EA 安全团队的确认回复,确认问题已经得到修复。

ea4

潜在的安全风险

现在,让我们来讨论漏洞的严重性。基本上,它提供了客户端对服务器的Squirrel VM的完全执行权限,这意味着可以调用服务器上的任何Squirrel函数并提取游戏内数据。

接下来是一小部分此漏洞可以造成的攻击。请注意,我们仅在Northstar本地复现并测试它们。我们从未在公共的Titanfall2游戏服务器上对其他玩家进行此类测试,因为这可能会造成我们无法挽回的损失。

篡改玩家数据

由于官方的游戏服务器有权限设置玩家的状态,此漏洞允许任意更改玩家状态。我们观察到有些人试图通过此漏洞提升游戏内等级。更甚者,一些玩家会在公共的Titanfall2服务器中的公共对局中复制并粘贴常用于设置玩家等级的命令,但不小心更改了其他玩家的等级。

无论是意外还是故意将玩家等级设置得太高都是一个问题,因为这会导致游戏服务器拒绝该玩家进入多人游戏。我们在协助Respawn修复漏洞时添加了一个解决方法,现在,等级过高的玩家将显示相应的等级。此外,此漏洞还允许解锁所有的皮肤、横幅和徽章,包括开发者的徽章。因此,拥有开发者徽章的玩家不再表示他们实际上是开发者。

DevTextBufferWrite / DevTextBufferDumpToFile

为了方便开发者调试,Squirrel包含一些针对开发者测试时使用的功能。在这里,我们特别关注其中两个功能:DevTextBufferWriteDevTextBufferDumpToFile

这些功能只能在Titanfall2游戏服务器上执行,而不能在游戏客户端上执行。此外,服务器不能让客户端编译/执行脚本,除非有远程回调函数注册(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% 根本不能被解析,自然也就无法找到路径。

是不是吓了一跳?但是你可能没有注意到我在上文所说的,这个功能只能在游戏服务器上执行,所以通过这个方式攻击的实际上是重生的游戏服务器,而不是客户端(冷知识,重生的游戏服务器运行的是基于Windows的容器)

所以说,这个攻击方式对玩家的电脑的威胁不是这么大,熟悉Docker的朋友应该知道,这种情景下的容器的生命周期几乎都是一次性的,每次新容器启动都是加载一个由重生构建的镜像,而每个容器可能几乎都没有重启系统的机会,就会被调度直接remove掉,然后等待指令启动新的容器,要通过这个方式来攻击玩家的电脑难度实在是太大,几乎不可能实现,所以我们把这个例子拿出来详细说说

ClientCommand

然而,我们甚至不需要完全控制游戏服务器就可以开始攻击其他客户端。

Titanfall2官方服务器的安全模型与Northstar不同,在游戏的视角中,官方服务器是完全可信的,因此客户端接受服务器下发的任何命令。例如,在匹配过程中,服务器发送一个ClientCommand,告诉客户端连接到某个特定的服务器。

请注意,ClientCommand不能用于强制在客户端上执行脚本,因为官方游戏客户端没有script_client/script_ui功能。因此,在对ClientCommand进行攻击时,会受到一定的限制(如connect指令)。

在Northstar中,ClientCommand被完全阻止,这意味着服务器不能命令客户端运行任何指令。这是必要的,因为与官方的Titanfall 2服务器不同,只有Respawn托管的专用服务器。因为任何人都可以在Northstar/NorthstarCN中托管游戏服务器,因此在我们的安全模型中,游戏服务器始终是不可信的。(Server is not the man.)

Stryder会话令牌窃取

先需要说明的是,Stryder是重生的游戏服务器后端的代号。

连接到游戏服务器时,原版的游戏客户端会在连接时向服务器发送一个有效的Stryder会话令牌。这可能是为了某种身份验证的目的。现在,使用上面提到的ClientCommand,这意味着攻击者可以使用脚本漏洞强制所有参与公共匹配的客户端连接到他们自己托管的服务器。当客户端连接时,它们会发送Stryder会话令牌,攻击者可以捕获该令牌。通过此令牌,攻击者可以对受害者的Titanfall 2账户进行操作。该令牌可用于代表受害者针对Stryder Titanfall 2后端服务器进行API调用,有点类似于中间人攻击(MITM)

在2022年10月左右,我们发现客户端会将Stryder令牌发送到游戏服务器,因此为Northstar部署了一个补丁,以清除令牌信息,使客户端不再向游戏服务器发送有效令牌。此外,我们通过要求玩家更新以便在Northstar上游玩来限制玩家只能使用已修复的版本。对于官方公共Titanfall 2游戏服务器而言,这种发送Stryder会话令牌的方法在其安全模型下可能是可以接受的,因为官方服务器对客户端来说是完全可信的,因此向其发送有效令牌并不是安全问题。然而,由于脚本漏洞,这种信任模型瓦解了,攻击者可以控制官方服务器,从而使其不再可被信任。

总结

恭喜你看完了这篇文章。我希望你喜欢它,了解我们作为一个集体,如何向EA安全部门和重生工作室报告脚本漏洞并与他们合作解决问题。在此,我想再次向重生工作室和EA安全部门致敬,感谢他们倾听我们的建议并解决了这个问题。

当然,我还要特别感谢zxcPandora最初发现这个漏洞,以及Emma做了一些PoC测试,wolf109909,D3-3109和NorthStarCN团队不断向我们更新关于他们发现的漏洞的情况,Taskinoz牵线搭桥联系重生工作室员工,H0L0和eRaid帮助校对英语原稿,所有可爱的Northstar开发者,贡献者以及整个社区,以及D3-3109和GPT-3.5-TURBO-0301进行的中文翻译。