译介|利用 IdentityLogger 来识别 CSGO 作弊玩家
维护一个CSGO服务器
我曾经创建并维护了一个位于澳洲和新西兰的CSGO社区服务器, 这个叫做InvexGaming的服务器活跃于2014年至2019年间。 得益于我们优秀的社区环境、创作内容、比赛和各种自定义的游戏插件, 这个服务器很快就流行开来。
维护一个游戏社区需要做很多事情,包括: *维护社区的基础建设和服务器 *平衡社区捐赠和开销 *添加新的内容,比如增加玩家模型、修复hitbox *自动化的VIP系统和权限控制 *为社区编写特有的插件 *组织DDOS攻击 *处理骚扰举报 *统治世界
其中最单调乏味的就是识别和封禁作弊玩家。
猫鼠游戏
不管是什么游戏都会有作弊玩家。作为服务器维护人员,你可以通过各种技术手段来检测他们。 我们可以使用服务端的代码来检测人类玩家难以做到的行为。 我们也可以使用ValveAnti-Cheat(VAC)系统。 这个系统虽然性能堪忧,但对于明显的作弊行为还是很好用的。 我们可以将你的系统内核用于反作弊,也可以将它用于挖比特币(作为你的感谢费)。 好吧,我们其实没这么干,但是有些反作弊软件确实这么做了(比如ESEA)。
这些方法都挺好的,但是在作弊/反作弊的拉锯战中,它们没办法检测出所有的作弊行为。 作为最终手段,我们只能对全天候的CSGO游戏记录进行人为分析, 我们的管理员(你可以把他们视为陪审团)会对一位玩家是否作弊进行谨慎的裁决。
一旦我们抓到了一个作弊玩家,出于对竞技精神的尊重,我们会将他永久封禁。 对作弊者来说,他们不喜欢被抓,但他们也不会停止作弊。 有无数次,我们解封了一些玩家后他们第二天就因为作弊而再次被封。 不过其中有一些玩家更了解技术,也知道一些规避封禁的基本方法。
规避封禁的艺术
一个玩家可以怎样规避封禁呢?
封禁策略的核心是一个可以用作身份识别的信息(识别子),基于这个信息我们可以阻止你访问服务。
在互联网中,这个信息通常会包括你的IP地址。 IP地址由你的网络服务商分配给你,你通过它互联网中的其他的机器通信。 比如一个IPv4的例子可以是:198.51.100.1。
在Steam的系统中,每个玩家都需要一个Steam ID来游玩Steam上的游戏。 这是一个唯一的识别子,和你的Steam账号绑定,用来在Steam的世界中识别你的身份。 一个SteamID的例子是STEAM_1:1:1111。
我们假设一个被封号的玩家的IP address是198.51.100.1,而他的Steam ID是STEAM_1:1:1111。 我们会把他的封禁记录存储到数据库中,然后把他踢出服务器。 这样一来,他下次加入服务器的时候,他的IP和Steam ID就无法通过封禁检测了。
要逃过这样的封禁,玩家可能会切换到另一个游戏账号。 这个新账号的Steam ID(比如STEAM_1:1:2222)和他被封禁的Steam ID不同, 但是这都在我们的反作弊之神的计划之中。 如果一个玩家有不同的Steam ID但是他的IP已经被封禁,系统会再次封禁他, 并将这个新的Steam ID关联到之前的封禁记录上。 这其实是一个建立玩家指纹的过程,我们现在知道这个玩家与两个Steam ID和一个IP地址关联。
如果反过来,这个玩家决定使用VPN来更换他的IP地址,那么他的新IP地址 (比如203.0.113.60)无法匹配到被封禁的IP。 不过和之前一样,如果一个玩家有不同的IP地址,但是他的Steam ID已经被封禁, 反作弊系统依然会再次封禁他,并将这个新的IP地址关联到之前的封禁记录, 进一步完善这个玩家的指纹。
除了这两个识别子之外,我们没有其他的识别子可以识别玩家的身份了。 但是对大部分作弊玩家来说,这种程度也够用了。
给我等一下
要是他们同时更换了IP地址和SteamID呢?
好吧,这招确实不错。
在这种情况下,对服务器来说这是一个全新的玩家,我们没有任何办法将他和已有的封禁记录关联起来。不幸的是,这意味着他可以为所欲为,而一旦他们再次被封禁,他们只需要再次更换IP地址和Steam ID就可以继续逍遥法外。
为了缓解这种情况,我们可以维护一个VPN和它所有IP地址的列表,但是这将是一个非常枯燥耗时的工作,所以我们的管理团队在讨论之后对这个方案兴趣寥寥。
你可能会说,作弊者早晚会用尽他的IP地址和Steam ID的。事实上,他们不会用尽的。 我们的分析表明,我们最臭名昭著的作弊者在世界各处有几乎无限的IP地址和超过87个已经购入CSGO的Steam账号。
用IP作为指纹会出问题
我们需要记住一点,Steam ID是唯一的,但IP地址不是。 我们曾经遇到一个情况,一对兄弟想要在我们的服务器玩游戏,但是其中一个会作弊。 结果就是两个人都被封号了,因为他们两个人的账号被关联在了一起。 其中一个玩家声称「他无法控制自己的兄弟,所以他不应该因为兄弟的行为被惩罚」。
是的,他说的没错。
另一个问题是类似大学这样的机构会使用共享网络。 有时候一群玩家会使用他们大学的单个出口IP地址。 如果其中一个人因为作弊被封号,所有其他玩家都会被标记为作弊,他们的Steam ID和他们家里的IP地址也都会被误伤。
我们做了额外的系统来规避这种情况,但整体上我们还是建议大家不要通过自己不信任的网络进行游戏。
IdentityLogger
让我们面对现实
我很严肃且并无不敬地说一句,作弊者都是一些傻*。他们现在是傻*,他们会一直是傻*。 也许还会生出很多傻*小孩。
我始终搞不懂你为什么要在游戏中作弊,这不是一种极其无聊的时间浪费么? 不论我游戏水平优劣,对我来说最大的乐趣就是和其他人竞技,努力提升自我,最终获得自豪感和成就感。
2017年初,我们的服务器中的封禁规避问题越发严重。 这大大增加了管理员们的工作负担,因为他们需要持续地对游戏记录进行人工审查,这些工作不但耗时,而且极其无聊。我至今都非常感激管理员们在我们社区中的辛勤劳动。
那天,我坐下来,拿出我的橡皮鸭,戴上降噪耳机,想通过「工程学」来抓到所有的作弊玩家。
应对SteamID和IP地址的同时变化
我们面对的核心问题就是如何处理Steam ID和IP地址的同时变化。 咋看之下似乎无从下手,因为我们没有别的识别子可用了。 在这个阶段我做了很多头脑风暴和数据分析。 我曾经是一个SourceMode社区的活跃成员,对于CSGO游戏的二进制文件进行逆向工程可以说是得心应手了。于是有一天我觉得我可以从游戏的内置浏览器下手。
CSGO在游戏内提供了一个基础的网页浏览器(不是Steam的内置浏览器(overlay browser)),当有人加入服务器时,服务器维护人员可以通过这个浏览器来显示一些信息(MOTD,message of the day)。我们把它叫做VGUI浏览器。
这个浏览器通常会被服务器维护人员用来向新加入的游戏玩家显示服务器守则。 有趣的是,服务器维护人员可以强行用它在玩家的屏幕上打开任何网站。 这个浏览器的窗口甚至可以被隐藏,这意味着你可以用它打开一个YouTube视频然后突然播放一段背景音吓玩家一跳。 VGUI浏览器是通过Steam的cookie提前认证的,所以你可以通过它登陆任何Steam的域名, 比如steamcommunity.com。 服务器维护人员还可以发送一段JavaScript代码并在浏览器客户端执行。 是的,你没看错。就是这个引发了2017年Steam的提权问题,那次事件中服务器维护人员可以利用这个特性劫持玩家的认证信息。不过那就是另一个故事了。
Cookies🍪
我再重复一次,VGUI浏览器是通过Steam的cookie提前认证的,这意味着它原生支持cooke。 Cookies被设计用来持续存储通讯会话信息,那要是我们在每一个玩家访问服务器的时候都把他们对我们域名的cooke保存下来呢?
🔔🔔🔔 就是你了!🔔🔔🔔
通过测试我们知道,一旦我们保存了VGUI浏览器的cookie,即使关闭和重启CSGO这些cookie依然有效。而且VGUI浏览器好像没有强制设置cookie的失效时限。现代化的浏览器比如Chrome会强制cookie在一段时间后失效,但是对VGUI浏览器来说,一旦保存了cookie,就算过了十年也没问题。
另一个方便的特性是VGUI浏览器可以被完全隐藏。就是说服务器完全可以悄无声息地强制客户端访问我们的网站,然后我们可以生成玩家的指纹信息,并保存一些cookie。 这些操作完全可以在玩家看不到的浏览器窗口中进行。隐秘而致命。
我们还发现,这些cookie的数据文件被保存在玩家电脑的Steam安装路径中。 这很重要,因为这意味着大部分作弊者永远不会发现如何绕过它。 因为他们自己不会主动去删除这个文件,而浏览器和游戏也没有任何清理cookie的功能。
很好,我们已经找到了一个方法来悄悄保存玩家的cookie,于是我们现在有了第三个识别子来协助我们生成玩家的指纹信息了。这个识别子——我们称之为TrackingID——和玩家的安装路径绑定。 现在,一个玩家想要假装自己是「新玩家」,他需要更换Steam ID,IP地址,以及自己的Steam安装路径。如你所想,没人会想到去做第三点。
(整个玩家系统被称为IdentityLogger,它被开源在Github。此处我略过了原文中对实装细节的介绍。)
2017年的封禁浪潮
在开发并测试了这套解决方案之后,我们在2017年2月将它部署到了GamingCSGO服务器上。 结果好得令人震惊。
在我们每天封禁作弊者的数量图中,我们立刻就注意到了那个巨大的尖刺。 有一些长期以来被社区信任的知名成员被曝出他们其实有一些用于作弊的小号。 还有一些作弊者私下联系到我,问我为什么他们更换了Steam ID和IP地址为什么还是被检测出来了。 其他服务器的一些维护人员对这套系统很感兴趣,甚至希望能够购买, 但我只把这套方案分享给了一个位于英国的服务器的维护人员,因为我完全信任他, 而这套方案的广泛传播会导致它迅速的失效。
这是一段高光时期,其中的每时每刻都令人沉醉。我们的社区赢得了「难以作弊」的美名, 随之而来的是作弊者和对于作弊者的举报大幅减少。而最妙的部分是没人知道我们是怎么做到的, 我们的管理员把它视作最高机密守口如瓶。我们其实应该申请个专利的。
一旦作弊者知道了我们生成指纹信息的方法,他们就可以通过删除cookie文件来轻松绕过这套系统。 但是我可以很高兴地说,这套方案一直如期运行,直到2017年十月Valve出于安全性的考虑彻底移除了VGUI浏览器。在此之后我才能够将它公诸于世并开源代码。
直到很多年之后,我依然对这套方案的优秀效果而相当自豪。