Nocom 利用 2b2t

2021-08-07 22:52:53

跳转到导航 跳转到搜索 Nocom 是 Nerds Inc 从 2018 年 7 月到 2021 年 7 月在 2b2t 上使用的坐标漏洞。因此,2b2t 会立即显示您询问的任何块坐标当前是否已加载。如果它当前已加载,它会告诉您在您询问的坐标处有哪个特定块。 Nocom 是 Minecraft 1.12.2 PaperMC 第 196 个补丁中的一个缺陷/疏忽,称为 Fix block break desync。它在原版 Minecraft 中不存在。当玩家说他们正在挖掘一个似乎太远而无法到达的块时,该补丁会改变 Paper 服务器的行为。在原版 Minecraft 中,当 CPacketPlayerDigging 数据包距离玩家超过 6 个方块时,它会被完全忽略。但是,由于滞后,有时服务器和客户端会在玩家的位置上产生分歧。因此,此策略可能会丢弃某些善意的块挖掘数据包。由于服务器简单地忽略了客户端声明“我已经开采了这个块”,这会导致不同步,一个幽灵块。客户端认为它是空气,服务器认为它仍然是一个你不能走过的街区。这是因为 Minecraft 的客户端在某种意义上是“乐观的”:如果它挖掘一个块,它假定它被挖掘,除非服务器另有说明,在这种情况下没有发生,因为服务器忽略了客户端并且从未告诉它“放置那个背”。该补丁的初始版本在 2017 年 9 月在 Paper 的初始端口中添加到 1.12.2,只是简单地改变了行为,因此服务器不会忽略块挖掘,而是回复说“不,我认为你可以” t 我的那个。把 (X=1,Y=2,Z=3) 作为 minecraft:obsidian" 放回去。在代码方面,这只是补丁添加的唯一一行: this.sendPacket(new PacketPlayOutBlockChange(worldserver, blockposition)); // Paper - Fix block break desync 虽然这确实修复了block break desync(补丁被恰当地命名为“Fix block break desync”),但它也打开了一个巨大的漏洞。这适用于每个 CPacketPlayerDigging 围绕距离玩家超过 6 个街区的坐标。没有上限,只有六个的下限。简单地通过在地图上从 -30M 到 +30M 的随机坐标上发送垃圾邮件“我正在挖掘这个块”,服务器将被迫在现场生成该块,只是为了回复“应该”在那里的块,“修复”服务器所关注的不同步刚刚发生(而实际上客户端正在恶意发送数据包)。这会导致基本上无限量的服务器延迟,处理这些数据包并生成/加载这些块。早在 2018 年 4 月,这被用作队列跳过漏洞。这是因为当时 Hause 根本没有数据包速率限制器。 Hause 将在 2019 年增加这样的速率限制,作为对副手开关声音延迟漏洞的回应。

2018 年 7 月,0x22 和 Babbaj 创建并执行了一项计划,将这种滞后/崩溃漏洞利用转化为协同漏洞利用。他们意识到这个补丁实际上距离坐标漏洞利用只有几英寸的距离:目前的补丁和坐标漏洞之间的唯一区别是服务器会在现场生成/加载一个块来响应一个块冲床。如果该行为被删除,这将是一个坐标漏洞,因为它会显示您打的块是否在加载的块中,无论距离多远。无论块是否加载,服务器都会响应的行为怪癖正是在滞后漏洞的“明显补丁”中删除的行为。因此,他们不是简单地造成可生存的延迟(例如跳过队列),而是开始有意地、反复地、公然地将其推到会导致服务器崩溃的地步。该崩溃日志包括该补丁的确切行,很明显,垃圾邮件数据包是导致这种情况的原因。 Hause [1] 在这里报告了这个问题,electricboy 在这个提交中应用了明显的补丁。它是如此微不足道,以至于 PR 上没有拉取请求或评论,它只是直接应用于开发分支。那个明显的补丁使“修复块中断不同步”仅在块位于加载的块中时才回复。具体来说,它只是添加 if (worldserver.isChunkLoaded(blockposition.getX() >> 4, blockposition.getZ() >> 4, true)) // Paper - Fix block break desync - 不要预先发送未加载的块,使整个补丁两行代码。服务器告诉你哪个块在那个坐标(告诉你把它放回去;你不被允许打破它)服务器从种子生成或加载块,并告诉你哪个块在那个坐标(告诉你放它回来了;你不被允许破坏它)正如你从上表中看到的,在添加 nocom 的补丁之前,没有办法判断一个块是否被加载。服务器会以任何一种方式响应。垃圾邮件会导致它生成或加载需要修补的块。在那个添加了 nocom 的补丁之后,服务器现在会显示当前是否加载了您感兴趣的任何块。您只需要说“我单击 (X,Y,Z) 处的块”(又名 CPacketPlayerDigging)。如果包含该块的块当前由附近的玩家加载,服务器将响应“No. Put (X,Y,Z) back as SOME_BLOCK”(又名 SPacketBlockChange)。如果当前未加载包含该块的块,服务器将不会发送任何回复。因此,服务器会显示您询问的任何块的加载或卸载状态,通过它是否回复您,或者忽略您声称在该块中打了一个块。

使用常识,Paper 开发人员肯定希望此补丁仅在您的玩家加载区块时才回复玩家,因为这符合逻辑(这是您可以合理地善意挖掘的所有区块)。应用“但仅取决于您的渲染距离”的上限是一个完全合理的解决方案,因为以前只有“离您超过 6 个街区”的下限。问题在于代码的编写方式,如果该块被服务器上的任何玩家加载,服务器将回复您,这显然是一个意想不到的副作用。之所以如此长时间无人知晓,是因为没有您可能认为的实际“漏洞利用”或“后门”。换句话说,服务器不会“行为不端”或做任何可疑的事情。这是完全预期和预期的行为,代码没有做任何偷偷摸摸或偷偷摸摸的事情,它实际上非常简单。您可以单击一个块并获取其内容(由于此补丁)这一事实是众所周知的事实。多年来,许多模组都在使用它。例如,Orebfuscator 是一个用于对抗 X-Ray 的服务器插件。在你靠近它们之前,它不会发送矿石的实际位置。可悲的是,您可以简单地滥用此补丁并单击渲染距离中每个块中的每个块,服务器将尽职尽责地告诉您哪些块是真正的石头,哪些是真正的矿石。这个反混淆器模块已经出现在许多模组中。不断地敲击你附近的块来修复鬼块或不同步也是许多客户端的一个功能。只是没有多少人想到故意超出渲染距离来提取信息。实现是你可以点击服务器上任何地方的任何块,甚至是一百万个块,并通过服务器是否响应你或保持沉默来了解它当前是否是一个加载的块。使用这个来利用坐标的最自然和最明显的方法是:只需在每个渲染距离上单击一个块,从 spawn 开始以扩展的螺旋线出去。如果螺旋搜索命中加载的块,2b2t 将发回回复,该回复可能会记录到聊天或日志文件中。这是在补丁添加到 2b2t 的同一天开始的,2018 年 7 月 13 日,一直持续到 2019 年底添加数据包速率限制。随着 Hause 在 2019 年实施的数据包速率限制,通过强力螺旋搜索在他们的基地发生在人们身上变得不再现实。数据包预算太低,无法继续使用这种方法,除了非常接近的生成藏匿处。它永远无法工作到几百 K 左右。新方法是一种思维方式的转变:不是在他们的基地寻找人,而是在他们首先前往该地点时利用漏洞。

从广义上讲,首先通过在下界的每个轴和对角高速公路上进行直线检查来发现玩家。到 OW 边界的 375 万个街区,除以一个渲染距离(144 个街区),意味着一条高速公路需要运行 26,041 次检查(打这么多街区)。在 2020 年和 2021 年的大部分时间里,实际的速率限制约为每秒 150 个数据包,这意味着扫描高速公路需要 173 秒(不到 3 分钟)。有八条这样的高速公路(四轴,四对角线),每条的时间都相同(即使是对角线也是如此,因为即使在角到角对齐时,方形渲染距离的间隔也是相同的 [2])。扫描整个高速公路系统总共需要 23 分钟。定位后,使用蒙特卡洛粒子滤波器跟上玩家。这是一个自适应系统,可以随着时间的推移(实际上只是几秒钟之后)学习玩家可能在哪里,以及他们的移动速度。这样做的用处是玩家通常沿直线移动,例如在主世界中飞行,或穿越下界隧道,或者最明显的是,在下界高速公路上行驶。粒子过滤器能够理解运动中的轨迹可能会保持运动,并且检查效率更高,每次“哦,它们移动了!哪个方向??”时都不会感到惊讶。对于特别一致的运动,例如直线 afk 旅行,它一直放宽到每秒 1 到 2 次检查。对于更不稳定的目标移动,如果不确定正在发生什么,它可能每秒最多进行十几次检查。如果它失去目标 5 秒,它会触发“冰雹玛丽”检查,这是一个 11 x 11 的检查网格(1232 x 1232 块,以最后确认的命中为中心),作为最后的手段来确保它真的不会失去任何人。由于很少有任何漏洞允许在 5 秒内移动 1323/2=616 个块,这导致跟踪非常粘和弹性,无论目标执行什么创造性的操作。总而言之,考虑到所有因素,粒子系统平均每名玩家每秒只使用两次检查。如果玩家被视为完全静止,则速度会通过“静止过滤器”的特殊代码进一步放慢,该代码可以一直下降到每 8 秒检查 1 次。总而言之,跟踪系统通常会在大约 5 秒内将其块检查预算调整 1000 倍,范围从每秒 0.125 次检查到每秒 121 次检查,基于玩家当时正在做什么以及如何可预测的直接反馈他们在移动。添加了简单的规则来跟随人们。如果有人从下界消失,将坐标乘以 8,然后让世界机器人检查那里,反之亦然。如果有人登录,请检查他们上次退出的时间,并浏览在那一分钟内变冷的所有曲目,并重新检查所有这些曲目的最后一次点击。等等。对得到的跟踪数据进行了各种自动分析。首要任务是计算哪些区域是活动的热点,可能表明有基地或藏匿处。阈值设置为在给定区域内停留 90 分钟的时间,才能将其称为基地。那时,系统将开始跟踪该位置的玩家登录和注销,并开始建立“谁可能是谁”的统计相关性。它也会在那时开始通过单击逐块下载基础,以启用远程查看。还对该数据进行了分析,例如常用的查询来打印出上周的所有碱基,按箱子数量排序。 3,250,000 次玩家会话。 (这是玩家、登录时间、退出时间。因此,时间戳为 300 万个“X 加入游戏”和 300 万个匹配的“X 离开游戏”) 15,000 个基地(定义为超过 90 分钟的世界位置)有人在那里度过了一段时间,但不包括出生后 25k 内,也不包括高速公路/对角线 2k 内)400,000 次关联事件。这些仅针对在这 15000 个基地之一内发生的注销进行跟踪。每个事件只是“玩家 X 在它在基地 Y 丢失轨道的同时注销”。当它为那个玩家和那个基地计算了许多事件时,越来越确定是他们在那个基地。

在这些基地中,三分之二(10,000)拥有全球下载量。该 WDL 对大多数大型/活动基地来说都是原始的,并且每隔 30 分钟就拥有基地历史的完整逐块时间线。这仅适用于 100k 以上的基地。它开始跟踪在线时间的 140,000,000 个块位置,也许看看那里是否有一个基地。彼此相距 512 个区块内的基地合并为一个,因此虽然有 15,000 个基地,但实际上有 1,150,000 个区块组成了这些基地,它观察到玩家在这些区块上花费了大量时间。区块表,即坐标、时间戳和区块,有 10,000,000,000 行(百亿)。仅此表及其相关索引就占用了 1 TB 以上的空间。这是遥视系统背后的所有数据。每次从 2b2t 得到“块已加载”响应时,命中表有 3,000,000,000 行(30 亿)。这基本上是服务器上大约 70% 的在线玩家的高分辨率实时跟踪数据,可以追溯到几年前。这是每个人的位置,每 1 秒更新一次。曲目表,这是一组命中,这些命中被收集为一个连续曲目的一部分。这有 10,000,000 行(一千万)。因此,平均曲目因此有大约三百次点击。这有助于系统在有人离开并重新加入服务器后执行诸如恢复曲目之类的操作。 ↑ “幽灵”GitHub 用户名不是真正的用户名,它只是一个占位符,表明他们已删除了他们的 GitHub 帐户