注:本文部分内容参考《网络游戏安全揭秘》-第5章节,“游戏中的时间状态和bug“ 编写
时间竞争风险的定义:
众所周知,网络游戏是大型分布式程序的先例,一个游戏,往往配置了成百上千的服务器去存储游戏玩家的各个信息,如帐号信息,财产信息,邮件信息……当成千上万台游戏客户端在不停的向各个服务器发送大量请求时,服务器如何精准的确定每一个客户端端状态并进行同步就面临着一个很大的问题——竞态条件。竞态条件是游戏中漏洞的来源之一,而时间竞争在众多竞态导致的漏洞中又占了很大一部分。在了解什么是时间竞争风险之前,先来理解什么是时间竞争。
举个简单的例子:
A和B有一天约在某小镇的电影院见面,但是因为疏忽,他们忘记了这个小镇有2个电影院1,2,等到了约定的时间,A去了电影院1,B去了电影院2,结果A和B均没有等到对方,这个时候,A和B均想起来,这个小镇还有另外一个电影院,于是,A乘车去了2,B又乘车去了1,结果,他们有一次失之交臂。
从上面的实例中可以看出,时间和顺序在里面起了很大的执行作用,于是可以简单的将由不恰当的执行时序导致了非预期的执行效果,称之为时间竞争带来的风险。
时间竞争风险:
时间竞争概念较为抽象,可以先来看几个具体的实例:
某游戏你正在激励的排位厮杀,但最终还是因为自己一不小心,被对方一套连找到打成残血,就快要输掉这场比赛了,你心里很不甘心,这可是你的定级赛啊,于是你利用游戏漏洞,直接退出PK至选择角色不虚弱和无处罚(地狱模式),此时你的中途退出不会收到游戏的处罚,你可以继续匹配定级
某游戏中的技能可以在决斗场中控制对手无法移动,在你与对方PK时,发现招架不住对方的进攻,于是,你对他使用了控制技能后,立刻强制结束进程,此时对方会被你的控制技能一直定住,除非自己认输比赛或者也强制退出游戏。
某游戏为了保证玩家日活跃,推出了奖励丰富的日常任务,但是无奈每天只能领取一次,可是你却可以利用漏洞,在领取任务后迅速推出游戏,然后在进入游戏后即可再次领取每日奖励…
时间竞争在游戏中风险很高,又因为在弄清楚利用方式后,利用又较为简单,有可能只需要关闭下进程,就完成了一次游戏中的漏洞利用,因此时间竞争带来的游戏漏洞传播速度很快,能在短时间内造成玩家大量使用获益,破坏游戏口碑
时间竞争存在的原因:
通过之前的定义,可总结时间竞争风险存在的直接原因是:
1. 操作指令执行次数不止一条,或指令数不止一个
2. 操作指令执行时间出现异常
客户端将不正确的操作序列发送到了服务器,异常有服务器产生,根本原因是服务器未对非预期的客户端请求进行处理,导致服务器逻辑出错。
为了更好的理解时间竞争导致游戏漏洞出现,在举出一个案例:
某游戏内游戏币的充值时间线如下图所示:
如果弄清楚上述的协议交互(事实上交互远比上述要复杂,上述时序图为了表达简化了大量的协议交互过程),可以很清楚发现漏洞所在,当玩家付费时,可以立刻取消付费请求,但此时游戏已经将付费道具发给玩家了,那么玩家就可以无限支付,取消付款,来刷取道具了。
时间竞争风险挖掘方式:
时间竞争风险挖掘核心是分析在协议交互之间的关系,确定协议间是否存在逻辑上的疏忽。可以通过协议工具很清楚的分析清楚协议交互图,在进一步分析协议交互去分析服务器校验的逻辑,结合协议工具的协议屏蔽功能可以确认服务器校验逻辑是否存在问题。具体可参加下面的例子:
某游戏的日常活动领取奖励时,通过协议测试工具,可以弄清楚协议交互如下:
在分析清楚协议交互后,可以很清楚的看到逻辑漏洞,如果最后一条协议——“标记日常奖励已经发放,日常任务结束”协议客户端没有收到,那么后续就可以再次领取日常任务。借助协议工具,直接将这条协议屏蔽,测试后果然出现可以无限刷日常的漏洞了。
*转载请注明来自游戏安全实验室(GSLAB.QQ.COM)
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)