建一座安全的“天空城” :揭秘腾讯 WeTest 如何与祖龙共同挖掘手游安全漏洞

作者:腾讯WeTest手游安全测试团队 商业转载请联系腾讯WeTest获得授权,非商业转载请注明出处。 原文链接:http://wetest.qq.com/lab/view/335.html

WeTest导读

《九州天空城3D》上线至今,长期稳定在APP Store畅销排行的前五,本文将介绍腾讯WeTest手游安全团队在游戏上线前为《九州天空城3D》挖掘安全漏洞的全过程。

《九州天空城3D》(下文简称《九州》)是祖龙娱乐的一款正版授权次世代3D飞行手游,在8月,正式向全平台开放。作为一个前身是端游研发工作室的研发商,祖龙娱乐在《九州》中将端游中经典的“飞行功能”重新展现给了玩家,《九州》以东方幻想元素为基调,熟练运用了PBR材质渲染、全局动态光影、超清粒子特效、真实物理碰撞等技术,实现了“双人飞行”,“360°全方位自由空战”等创新玩法。在这款手游推出时,我们发现,祖龙娱乐在手游的研发技术上正变得越来越娴熟。

游戏设计方面,《九州》设计了很大的地图,不做任何的地形限制;另外玩家在飞行过程中也能发生战斗,全方位的空战体验在手游中还是相对比较少见的。

玩法方面,《九州》设计了“双人飞行”的特色功能,将玩家之间的互动与这款游戏的核心卖点“飞行”巧妙地结合到一起。不过,《九州》的游戏策划很清楚,作为一款MMO游戏,为了留住玩家,其最终的落脚点还是在社交上,为了让玩法和社交能够更好的结合,游戏的平衡性和游戏社区内的氛围建设非常重要。为了保证游戏的健康运转,祖龙娱乐对反外挂的工作非常重视。

《九州天空城3D》安全测试的开端

安全问题相比游戏的其他问题,由于其测试的门槛较高,经常会被手游开发者忽略。一些手游开发者会抱有“等出现了问题之后再去修复”的想法, 然而等到问题出现的时候,往往对游戏的收入、口碑已经产生了很大的影响,常见的外挂危害包括以下几点:

腾讯游戏从进入游戏行业之后,就遭遇过不少外挂的侵袭,因为不断的踩坑,腾讯在进入手游领域之初,非常的重视安全测试。腾讯WeTest手游安全测试团队从2011年就开始对手游安全领域进行探索和技术积累,旨在通过提前发现游戏版本的安全漏洞,预警风险,帮助提高腾讯游戏的品牌和口碑。目前腾讯WeTest团队对腾讯内部所有游戏都会进行详尽的安全测试,《王者荣耀》、《乱世王者》、《穿越火线:枪战王者》以及《火影忍者手游》等精品游戏每个对外版本都会进行严格的安全测试。

在端游领域沉淀多年的祖龙娱乐,同样非常清楚外挂对于游戏平衡性的危害,由于在游戏质量测试方面与WeTest有过多次成功的合作,因此在《九州》上线前,祖龙方面很果断的就决定与腾讯WeTest手游安全测试进行合作,腾讯WeTest也希望能将自己在手游安全领域的经验传递给《九州》团队。

本文整理了《九州》安全测试过程中的一些思路和实践内容,与手游开发者分享,希望手游开发者能够了解安全测试,重视安全测试。(文中的漏洞均已修复,仅做学习交流参考)

技术难点

手游的使用场景与传统APP有着巨大的差异,不同的游戏玩法, 技术实现都不一样,因此手游安全测试团队需要对《九州》所有模块进行比较全面的风险分析,针对游戏核心玩法和游戏中高价值产出点重点进行漏洞挖掘,提前暴露游戏中潜在的安全风险,最大程度降低线上外挂打击成本。

《九州》游戏客户端使用Unity3D引擎开发,但是手游安全测试团队在接入协议工具中发现客户端并不是100%用C#实现,仅从C#层接入工具无法获取游戏所有通信协议数据。逆向分析游戏客户端后发现实际还有大量游戏逻辑使用Lua开发,对应功能的协议数据也在Lua层进行组包。接入协议工具必须从C#和Lua层进行Hook,获取协议明文数据。

另外,在对协议数据的解析中也遇到一些挑战,游戏同时使用了自定义和PB两种协议结构,需优先对自定义协议结构进行格式转换,实现针对自定义协议Decoder进行解析,PB部分则直接用PB Decoder进行解析。

测试方案

测试分析及规划

确定游戏核心玩法 《九州》的核心玩法主要是组队副本及各种活动,另外还有战斗外角色技能学习、装备、宠物等。

确定安全测试策略 《九州 》是一款使用Unity引擎开发的RPG游戏,游戏采用自定义的二进制协议 (XML +PB),逻辑使用 c#+lua开发。

本次安全测试目标覆盖整个游戏模块,主要分为周边系统和局内战斗逻辑,针对该游戏类型,本次测试以协议为主,针对部分游戏内的战斗逻辑,采用逻辑修改的方式进行测试。

WeTest手游安全测试针对三方面进行检查: 1)游戏客户端资源安全测试 2)游戏逻辑安全测试 3)服务器稳定性

测试的实施

腾讯WeTest手游安全测试团队将审核的内容分为静态安全漏洞和动态安全漏洞。

静态漏洞扫描 主要通过静态扫描的方式,对游戏apk中配置档、资源文件、脚本文件、manifest.xml、so文件,通过自动扫描的方式来进行检查项的确认。(目前此块内容已集成到SR手游安全测试方案中,覆盖了120+条安全检查项和信息安全测试项)

动态风险分析 主要根据游戏特定的内容和玩法,针对性地分析安全风险点,通过协议、函数、内存、脚本等技术,多维度检查游戏服务器对相应的风险点是否有完善的校验或反外挂策略。

根据对漏洞类型的提炼,WeTest手游安全测试团队根据《九州》具体玩法,推导出相应的获益方式。通常根据风险点分析的方式,可以完整覆盖到游戏中涉及到安全的部分,结合检查点,就生成了可以在实际操作中执行的用例,形成闭环。

SR手游安全测试深度覆盖

其中比较典型的检测方式有:

1、双端协议修改 手游安全测试工具通过直接注入游戏的组包函数,自动解析协议结构,免去了需要依赖测试人员分析二进制数据进行协议破解。在没有协议结构文件时也能自动解析协议结构。手机和web端都可以进行协议数据展示,在手机上可以实施地显示协议发包的效果,在web上可以动态一键修改相应字段,互补不足。

双端协议修改工具web效果展示

2、函数动态修改

函数动态修改原理

对于单局类玩法的手游,函数动态修改具备最强的漏洞能力。但是早期的测试方法效率非常低下,需要每个函数单独编写hook函数、定义函数指针变量、申请独立hook资源、重新编译代码。同时,使用门槛很高,只有专业的安全专项测试人员才能操作。手游安全测试团队的函数动态修改工具通过动态通用hook技术,不需要测试人员再进行hook函数编码。

函数动态web效果展示

3、内存对象修改 WeTest手游安全测试团队为测试人员直接展示出游戏中对象列表、对象属性名称、属性值等信息,并且可以以对象为单位进行搜索,告别传统手游内存测试工具搜索“内存数值”方式定位目标内存地址的低效方案,实现该项测试成本降低70%。

WeTest手游安全测试团队为《九州》挖掘出的部分漏洞和修复方案

客户端安全漏洞

1、游戏逻辑 DLL未加密,可直接被反编译,降低了外网破解游戏的难度,也存在被外挂利用的风险。

2、游戏LUA脚本未加密,可直接从内存中dump出源码,增加了游戏被外挂利用的风险。

游戏逻辑问题

1、部分协议字段冗余,且校验不严格,存在严重逻辑问题。如生活制作功能中,物品 随机应该由服务器下发,而非客户端上报,否则存在制作指定物品的风险;对物品等级缺失 校验,导致低等级可制作高等级物品 。

2、部分验证逻辑只存在于客户端。客户端是不可信任的,客户端验证只能用于UI显示 控制,后台应该同样增加校验,防止客户端伪造或构造数据来绕过验证。如“宠物更名”中,服务器应该检查长度限制,否则由于该数据会写入DB,可能被利用造成客户端对服务器数据库攻击。

问题示例

问题一:生活技能制作漏洞 ,低等级技能可生产高等级物品

【漏洞类型】:越权操作 【问题描述】 生活技能存在漏洞,使用道具制作请求篡改 recipeXXX参数,可生产高于现有等级的道具

【影响面】 属于越权操作风险,利用漏洞可在游戏中获益。

问题二:一个同伴可以重复助战,存在刷评分排行榜的风险 【漏洞类型】:刷战力 【问题描述】 使用一个同伴ID通过forXXXXX_pos多次发送,可用一个同伴重复助战

【影响面】 可用于刷评分,影响游戏平衡

问题三:对达到购买上限的道具,可修改购买方式无限购买 【漏洞类型】:无限购买 【问题描述】 用其他货币可以无限购买道具

操作方法: 1.录制交易系统—商铺购买协议“MalXXXXping” 2.修改协议字段“pa_type”参数为“1” 3.发送协议

银币购买达到上限:

修改用金币购买成功:

【影响面】 突破游戏限制,使用元宝可加快成长。

强调文字解决办法

1、游戏客户端安全方面,需对客户端进行加壳,dll代码文件加密,Lua脚本则建议改为Luac或Jit模式,有效提升客户端被分析和破解的难度。

2、其他协议漏洞大部分属于后台检验疏忽型,需针对性完善后台逻辑校验。

最终效果

在项目测试阶段,手游安全测试团队为《九州天空城3D》发现了数个漏洞,并针对这些漏洞产生的原因和修正都提供了专业意见,并很快顺利修正了问题,与开发商一起将隐患消除。《九州》的技术负责人表示:“外挂问题一直是祖龙在做游戏过程中要跨越的雷区,MMO类型游戏内容很多,需要专业的安全团队来对游戏进行一个全方位的检测,WeTest手游安全测试为《九州天空城3D》正式开启不删档,创造安全、公平、健康的游戏环境提供了坚实支撑和保障。”

关于腾讯WeTest手游安全测试团队

腾讯WeTest手游安全测试团队从2011年初开始对手游安全领域进行探索和技术积累,旨在通过提前发现游戏版本的安全漏洞,预警风险,打造出业界领先的手游安全测试技术方案,在工具上已经支持所有腾讯在研和运营的手游项目。团队通过使用与正式服同样的游戏客户端和服务器,模拟外挂工作室制作外挂的过程,依靠自身的技术积累来提高专业程度,持续保持漏洞的发现率。

目前提供了专家测试服务,希望通过提前发现游戏版本的安全漏洞,预警风险,帮助提高腾讯游戏的品牌和口碑。

服务目前已经对外开放,欢迎前来使用http://wetest.qq.com/product/sr 如果对使用当中有任何疑问,欢迎联系腾讯WeTest企业qq:800024531

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏我的安全视界观

【应急响应】redis未授权访问致远程植入挖矿脚本(完结篇)

2466
来自专栏CSDN技术头条

2018 年 Linux 八大发展预测,Ubuntu 将主宰物联网

转眼间,时间已进入 2018 年,Linux 在 2017 年发生了哪些变化,2018 年又会有哪些新的趋势?外媒对 Linux 今年的发展做了八大预测,看看你...

1967
来自专栏贾老师の博客

《软件方法》学习1. 软件方法概述2. 愿景3. 业务建模4. 需求5. 总结6. 阅读延伸

1154
来自专栏Grace development

浅谈架构是为了什么 (上)

架构是一款软件从0到100的演变过程。并非是上来就可以承载什么亿级访问的牛x架构什么的。本篇写给那些想要成为架构师或者正在尝试成为架构师的朋友。

732
来自专栏上善若水

F003方向标之如何成为一个优秀的程序员

入工程师程序员一行,怎么才能成为以一当十,当五十的优秀程序员呢,我想还是那句老话"业精于勤而荒于嬉",勤 是指勤于思考,并知行合一。

722
来自专栏Java架构解析

香格里拉+去哪网Java面试题及总结

7.开发分业务性和非业务性,非业务性中经常碰到容量,并发,安全,性能等等,你是怎么解决的。

520
来自专栏程序你好

新手程序员如何写出好的代码

我之前的博客文章在推特上火了。这篇文章指出了一个问题——始终遵守某些规则实际上并不能帮助人们更好地编写代码。

865
来自专栏阮一峰的网络日志

Android,开源还是封闭?

满大街都在谈论Android。 它是当红炸子鸡。许多人觉得,iPhone将受到它的强力挑战。 ? 我也曾经对它充满了期待,但是后来的事态发展,令我改变了看法。前...

3377
来自专栏云计算D1net

Google为吸引企业用户推出Chromebook

Windows XP昨天刚刚宣告“退休”,今天,Google就开始向“被抛弃”的企业用户们抛出了橄榄枝。 至今天起至6月30日止,企业用户可以在Chromebo...

3085
来自专栏WeTest质量开放平台团队的专栏

建一座安全的“天空城” ——揭秘腾讯WeTest如何与祖龙共同挖掘手游安全漏洞

《九州天空城3D》上线至今,长期稳定在APP Store畅销排行的前五,本文将介绍腾讯WeTest手游安全团队在游戏上线前为《九州天空城3D》挖掘安全漏洞的全过...

913

扫码关注云+社区