阻击外挂——《龙之谷手游》安全测试的那点事
作者:sheldon,腾讯游戏漏洞测试高级工程师
商业转载请联系腾讯WeTest获得授权,非商业转载请注明出处。
一、项目背景
外挂的危害
随着智能手机的全面普及和市场泛娱乐化,移动游戏行业发展迅猛,无论是市场收入还是用户规模,手游在游戏市场上已经占据了半壁江山。如此火热的市场吸引了大量外挂、辅助工作室等非法盈利团队,严重影响了游戏的收益、平衡,缩短游戏的生命周期,外挂对手游形成了这些危害:
手游外挂的八大危害
为了避免这些损害,腾讯游戏内部的测试流程已经将“手游安全测试”设立为必经环节,腾讯大部分手游上线前都会进行手游安全测试,《王者荣耀》、《穿越火线:枪战王者》,《梦幻诛仙》等六星级游戏更是每一个版本都主动寻求手游漏洞扫描。《龙之谷手游》同样也是如此。
《龙之谷手游》的加入
《龙之谷》在端游时代遭受过游戏外挂“洗礼”,从简单的游戏内存修改、变速齿轮到后面越演越烈N倍攻击挂、无敌挂、穿墙挂,曾经一度被玩家称作“外挂谷”。《龙之谷手游》依然延续端游ACT类的玩法与类型,原汁原味还原端游经典,在手游版本发布前,游戏测试和运营团队将游戏安全性作为一个重要专项来持续开展。
为了吸取端游的历史教训,避免手游上线后再次出现游戏外挂,《龙之谷手游》测试团队选择与腾讯WeTest合作,使用手游安全测试专家模式,对游戏的客户端、服务器、以及通信协议方面的安全质量进行全面检测和把控。在顺利上线后,腾讯WeTest团队整理了《龙之谷手游》安全测试过程中的一些思路和实践内容,对外分享。
二、技术难点
手游的使用场景与传统APP有着巨大的差异,不同的游戏玩法, 技术实现都不一样,因此手游安全测试团队需要对每一个游戏,都从零开始研究游戏内部实现架构。
经过分析,《龙之谷手游》使用Google protobuf组件来实现协议数据通信,而腾讯WeTest手游安全测试团队具备protobuf等主流协议结构的自动接入和解析技术,无需利用proto文件自动提取游戏协议结构代码,自动分析游戏通信协议明文点,完成通信协议工具接入。《龙之谷手游》属于重度RPG类型,带有实时PVP玩法,包含多种类型副本、小游戏玩法、公会、家园、天梯赛、英雄战场、世界boss等50多个功能系统,如何在短时间内完成全量内容的漏洞检测是当时面临的最大挑战。手游安全测试团队一方面使用函数风险智能分析系统、盗刷漏洞扫描和拒绝服务攻击扫描对游戏进行一轮漏洞自动化检测,另一方面根据各功能风险性和优先级对游戏的战斗系统、交易所和战力成长系统进行深度分析和漏洞挖掘。
函数风险智能分析流程
三、实现方案
测试目标
根据手游安全测试团队对腾讯游戏多年的测试经验,手游安全漏洞主要会出现在客户端、游戏逻辑和服务器三个层面,为了整体全面的发现手游外挂情况,测试团队将手游外挂的风险项细化情况如下:
测试前的分析
前文提到不同手游玩法都会使用不同的技术实现,因此在《龙之谷手游》安全测试之初,团队对游戏进行了一个详细的分析与拆解。
游戏实现——拆分游戏玩法中风险节点
分析过程中,测试团队发现《龙之谷手游》的 “战斗系统”和“交易系统”是手游漏洞产生的高危模块,下文也将从这两块出发,拆分其中的风险节点。
战斗系统——单机模式与多人联机模式结合
√ 《龙之谷手游》核心玩法包括PVP和PVE战斗系统以及各种模式的副本单机模式:主线副本属于单机模式,战斗过程完全在客户端侧实现,测试中可重点通过内存修改和函数修改来挖掘漏洞;
√ 多人联机模式:巢穴副本、1V1天梯赛、保卫队长等属于多人联机模式,战斗过程的实现由客户端和服务器相互配合来完成。根据实现,优先采用协议测试工具进行漏洞挖掘,在验证部分风险项时仍然要使用客户端的内存、函数、变速测试工具。
交易系统——游戏道具流通的核心枢纽
游戏允许玩家通过交易所进行物品交易流通,安全漏洞的影响面将会被交易系统进一步放大,也是需要优先进行外挂检测和漏洞挖掘的内容。
对于手游玩法的具体拆分,可见下图的安全风险分析示例(部分):
《龙之谷手游》风险分析片段
安全风险项下钻分析示例(部分):
除上述外挂风险以外,服务器端程序的健壮性也需要通过拒绝服务攻击扫描进行宕机风险的检测。
根据对于《龙之谷手游》的拆分,测试团队基本确认游戏核心玩法在于多人联机的PVP或PVE模式以及其丰富的交易系统,因此团队也将测试的策略调整为“协议测试为主,函数及内存修改测试为辅“。
游戏引擎——针对引擎与实现寻找突破口
游戏使用Unity3D引擎开发,该类型游戏游戏源代码一般会使用C#、Lua、C++中的一种或多种。经过分析《龙之谷》客户端部分代码逻辑是使用C#脚本语言,不过出于安全性考虑,研发团队已经将游戏安装包中客户端逻辑代码文件XxxxxClient.dll进行了加密,所以在逆向分析前要进行该文件的解密操作获取明文。获取明文源码的办法比较多:
1、逆向解密函数,利用游戏解密函数解密;
2、在游戏运行过程中将XxxxxClient.dll从内存中Dump出来;
3、Hook Mono函数mono_image_open_from_data_with_name()和mono_class_from_name ()也可以获取明文源码。
游戏某版本测试后发现安全问题
游戏风险分析完成后,漏洞挖掘的工作其实就完成了一大半,之后利用安全测试工具对风险进行逐一验证即可。在游戏中发现以下几种类型的漏洞,均属于致命级漏洞:
类型一:外挂类漏洞
(1) PVP模式加速移动
(2) PVE主线副本存在无敌秒杀、全屏攻击等大量安全漏洞
“PVP天梯加速”漏洞视频:https://v.qq.com/x/page/h0390e2ias6.html
无敌全屏秒杀”漏洞视频:https://v.qq.com/x/page/v0390tzwloc.html
类型二:盗刷类漏洞
(1) 拍卖可任意复制物品,无限盗刷龙币
(2) 驱逐家园中的妖精可无限盗刷奖励
“拍卖所复制物品”漏洞视频:https://v.qq.com/x/page/o0390uhyk8l.html
类型三:宕机类漏洞
(1) 图鉴分解请求中,构造异常图鉴ID引发服务器宕机
(2) 图鉴分解请求中,构造异常图鉴数量引发服务器宕机
(3) 公会、竞技场、图鉴商店的购买请求中,构造异常的物品数量引发服务器宕机
(4) 纹章洗练请求中,构造异常的洗练次数引发服务器宕机
解决方法
外挂类漏洞
-
变速漏洞实现方式有多种,相应也有多种修复方案。可监控系统时间相关函数是否被篡改来检测通用变速器类的修改器;针对修改游戏内部保存角色移动速度变量的内存,也可以通过内存加密、设置影子变量和服务器坐标校验等方式来解决。
-
对PVE单机副本外挂类漏洞的处理,可从副本结算请求的内容上做文章。如加入副本挑战序列号来防止结算重发;加入CRC、md5或一些冗余信息来防止结算请求被篡改;加入战斗过程数据采样甚至隐形NPC通过服务器安全策略校验,来防止无敌秒杀全屏攻击等类型外挂。
盗刷类漏洞
- 服务器处理购买、结算等物品发放请求时,需要加强对请求中各项信息合法性校验,另外运营侧可以接入运营经分系统,对各种道具和金钱的产出进行实时监控与告警。
宕机类漏洞
- 因程序健壮性导致的服务器宕机漏洞被检测出之后,修复起来比较简单,针对性做好异常值处理就能够修复。
四、最终效果
在项目测试阶段,手游安全测试团队累积为《龙之谷手游》挖掘出了7个致命级漏洞,8个高危级漏洞,5个中危级漏洞,将潜伏在游戏中的龙币盗刷、PVP/PVE外挂、服务器宕机等各类致命级、高危级漏洞提前揭露出来,提前制定修复方案进行修复,并评估和验收结果与风险。手游安全漏洞的测试为《龙之谷手游》项目组避免了经济损失,为游戏正式开启不删档,为用户提供安全、公平、健康的游戏环境提供了坚实支撑和保障。
关于腾讯WeTest手游安全测试团队
腾讯WeTest手游安全测试团队从2011年初开始对手游安全领域进行探索和技术积累,旨在通过提前发现游戏版本的安全漏洞,预警风险,打造出业界领先的手游安全测试技术方案,在工具上已经支持所有腾讯在研和运营的手游项目。团队通过使用与正式服同样的游戏客户端和服务器,模拟外挂工作室制作外挂的过程,依靠自身的技术积累来提高专业程度,持续保持漏洞的发现率。
目前提供了专家测试服务,希望通过提前发现游戏版本的安全漏洞,预警风险,帮助提高腾讯游戏的品牌和口碑。
服务目前已经登陆腾讯云,欢迎前来使用https://www.qcloud.com/product/sr
手游安全测试接入流程:https://www.qcloud.com/document/product/574/8807
常见问题:https://www.qcloud.com/document/product/574/8813