Roblox 2018万圣节活动游戏中的漏洞


免责声明:我绝不容忍任何形式的探索,本文章严格地用于教育目的,并且我遗漏了许多特定的详细信息,因为我可以减少某些人对此文章的启发。 我也没有检查确保已对它们进行了修补,但希望本文会提示对其进行修补。 (无论如何,游戏中的玩家很少,所以如果这些漏洞以某种方式被释放,它不会破坏成千上万的游戏体验)

我也只想说游戏制作精良,看起来很棒,玩起来很棒,而且在很大程度上确保了游戏的安全性。


万圣节事件游戏使用一种称为“糖果”的货币,玩家可以通过在地图上走动并触摸每个糖果来进行收集。

弱点

最初,我对这些保护的安全性如何,糖果在服务器端的初始化情况感到惊讶,并且进行了一些严格的检查,以确保不会给玩家过多的糖果或自己产生糖果。 它还进行了很好的优化,以确保仅在应有的状态下渲染糖果,以减少延迟等。

但是,我知道这些事实是我遇到的第一个弱点之一。 糖果系统以及游戏中发现的大多数系统都使用在服务器和客户端上运行的ModuleScripts,这些脚本存储在ReplicatedStorage中。 由于服务器代码是复制的,因此开发人员可以查看服务器上正在发生的一切,并设计出可以完全避免任何检查并在事件中使用正确的正确参数的利用程序。

尽管我不需要做任何事情,但是这种利用相对简单,我不需要弄乱任何事件或函数。 令我惊讶的是,游戏中没有检测到隐形传送,因此我只运行了一个while循环,将我的角色传送到工作区中特定candy文件夹中找到的每个糖果。 通过这种方式,我能够以前所未有的速度积累糖果,同时带着一桶爆米花躺在椅子上,看着我的糖果稳步上升。

如何避免这种情况

由于该游戏依赖于简单的用户操作来收集糖果,因此,利用这种漏洞可能最难解决我发现的漏洞。 修补此类事件可能很危险,因为它依赖于用户操作,并且网络问题可能会介入其中,从而可能导致误报。

我能想到的最好的修补方法是测量糖果收集之间的间隔,游戏已经限制了在特定时间段内产生的糖果数量,但是,这还远远不够。 由于玩家在2秒的时间内收集50个糖果几乎是不可能的,因此可以安全地假设,如果糖果以不可能的速度被捡拾,他们就在利用。

修补此问题的另一种方法是传送检测,注册允许的传送服务器端并怀疑没有服务器自己的动作而发生的任何事情。

该游戏具有划船功能,我不确定您应该如何获得划船,但是有一个事件(很明显,除了试图找到漏洞之外,我并没有玩太多游戏) 。

弱点

我参加了此活动,并认为这很有趣,所以我解雇了它。

没啥事儿。 😕

因此,我再次将其触发,但是这次我从工作空间中随机抽出一部分,并以此触发了它。

随之而来的是绝对的混乱,我突然在过山车上坐船,几个困惑的玩家坐在我旁边,想知道他们刚刚目睹了什么。

虽然我确定这是一种经验,但我确信开发人员从未想过,但它并没有真正归类为危险利用。 那些以前处理过远程安全性的人可能已经猜到了接下来会发生什么。

我以玩家的HumanoidRootPart作为第二个参数触发了遥控器

突然,我的角色和我的船被传送到服务器中某个可怜的灵魂,他们被扔到了地图的一半。 呃,那不好,我想; 让我们循环尝试一下。 所以我做了。

如何避免这种情况

在这里,我们回到防止漏洞利用的最重要规则之一:

决不。 信任。 的。 客户。

这里的核心问题是,作为玩家,我要指定我想要产生船只的确切位置。 为什么不将其作为服务器端的价值我不知道,但是我们剩下的是游戏的船上隐形防御中的一个巨大空白。

当您在游戏中生成所有内容时,请在服务器端进行操作。 如果要在玩家附近生成船,请使用在调用遥控器时传递的玩家参数,以确保它是正确的玩家,并且可以根据其在3D空间中的位置来计算生成位置。

令我更难找到这些的一件事是,它们仅使用一个RemoteEvent和一个RemoteFunction,这是我不同意的做法,但它的确使我放慢了脚步,我不得不浏览脚本来查找确切的参数与这些遥控器一起使用。

找到之前的两个漏洞之后,我为自己感到非常自豪,将它们发送给HippieOfDoom并继续搜索。 尽管它们是非常基本的漏洞,但它们具有破坏性很大的潜力。

大多数漏洞利用源于滥用某种事件。 此漏洞再次源于游戏的船只系统。

弱点

客户端还有另一个事件,可让您在游戏中坐船。 通过以船座作为第二个参数来调用它,您就坐在船上。 但是,此参数没有检查以确保您使用的名称实际上是一条船,因此,我可以再次使用播放器对其进行调用。 那正是我所做的。

通过输入第二个参数作为玩家的头像,我能够将它们传送给我,并坐在它们之上。 他们无权将我从头上移开,甚至无法正确移动,而我却能够通过移动自己来控制他们的性格。

我继续前进,再次将其置于循环中,但与游戏中的每个玩家一起。 这创造了一种可以阻止所有人完全玩游戏的漏洞,而且非常危险。

如何避免这种情况

实际上,此漏洞的修补非常简单。 所有需要做的就是确保服务器上发送的对象实际上是船,而不是玩家的头。 这再次违反了将位置发送到服务器的规则,实际上应该发送对船只的引用,服务器应该找到船只本身,并检查以确保玩家既有能力又可以坐在其中。

因此,从中学到的东西,我总结为三件事:

  1. 客户端到服务器的输入:

发现的三个漏洞中有两个是由于危险的用户输入造成的。 服务器在不检查它们的情况下将其视为真实,这就是这些事件的不足。

2.没有隐形传送检测:

通过检查未经服务器授权或执行的传送,可以很容易地防止第一个漏洞。 其他两个漏洞利用程序也可以使用隐形传送检测来部分检测这些漏洞利用程序。

3.没有速率限制:

第二个漏洞可能已通过对用户能够多快地收集糖果的速率进行限制来修补。 如果他们以不可能的速度收集糖果,可以断定他们正在传送。