不修漏洞触犯刑法——一个int类型引发的游戏漏洞

2015最新刑法规定,不修漏洞要犯法。

下面转载原文:“网络服务提供者不履行法律、行政法规规定的信息网络安全管理义务,经监管部门责令采取改正措施而拒不改正……处三年以下有期徒刑、拘役或者管制”。

因此,做游戏的亲们!安全问题要重视起来了!分享一个腾讯内部的游戏项目安全问题案例,与君共勉。

【背景介绍】

2015年6月,《全民主公》安全测试中发现,由于一个int类型使用错误,形成游戏内“刷”武将等级的漏洞,危害程度爆表。若外挂团队或者是玩家利用此漏洞,可将武将直接刷到顶级。《全民主公》项目经过紧急排查,已经迅速修复了这个漏洞。

【漏洞演示】

1、使用突飞猛进令请求中包含totalExp字段,表示本次使用增加的经验值

2、如下图,使用安全雷达先获取此协议,将totalExp该成一个极小值-2147483648(int32下限),发送请求,武将经验竟变成负值,等级变为0

3、再把totalExp改成相对较大值-2147403647,发送,武将经验变为5241,等级直接升到48!为什么会这样= =!

【漏洞揭秘】

协议安全测试时,测试同学先尝试将经验值字段直接改成较大值,如60000,发送请求,然而并没有什么暖用,角色属性数值没有变化。推测服务器处理这个请求时,有设置异常校验逻辑。

但测试同学把经验值设置成极小值(-2147483648,int32类型下限),发送后竟然生效,武将经验变成负数!

由此可以推测:

1、服务器后台用于保存武将经验totalExp变量是使用有符号类型

2、后台对吃突飞猛将令请求的异常处理仅仅是判断totalExp是否大于n(n为开发设定的某个正整数)。

如果totalExp>n,走进程序异常处理分支,被后台程序丢弃;

如果totalExp<n,走程序正常处理分支,将totalExp按正常逻辑进行运算并保存

基于服务器这样的校验规则,测试人员尝试了下面“刷”的办法,这里不得不提到数值型变量在计算机内存中存储和运算的基础概念:

· -2147483647在计算机中二进制存储为

原码是:1111 1111 1111 1111 1111 1111 1111 1111

补码是:1000 0000 0000 0000 0000 0000 0000 0001

· -2147403647在计算机中二进制存储为

原码是:1111 1111 1111 11101100 0111 0111 1111

补码是:1000 0000 0000 00010011 1000 1000 0001

· 补码相加(为统一的运算,计算机中计算数值加运算是通过补码相加来实现的):

1000 0000 0000 0000 0000 0000 0000 0001

+

1000 0000 0000 0001 0011 1000 1000 0001

于是符号位上溢,得到正值:

0000 0000 0000 00010011 1000 1000 0010 ,换算成十进制即为 80002

总结一下,由于游戏协议结构定义与后台存放经验值变量类型使用不当,导致出现符号位上溢“刷”经验的漏洞。这是多么痛的领悟..与君共勉吧!~

【漏洞危害】

利用漏洞可直接把所有武将刷到满级,使商城中出售的高级突飞猛将令、以及游戏中精心设定出掉落该物品的关卡、掠夺等内容变得没有意义。

漏洞若流出外网,由于利益关系,容易在玩家间形成病毒式传播,一方面影响游戏商城营收,另一方面也会使游戏很多玩法形同虚设,因为此时角色已经不需要更多经验值了。

同时,有关漏洞的效果截图或刷上游戏排行榜截图容易被玩家在各大游戏分发平台论坛传播,对游戏口碑造成的影响也不容小觑。

另外,《拳皇98OL》游戏中也出现类似问题,由于游戏服务器原因,测试环境受限,业务方测试人员后续将测试评估此漏洞影响面。《拳皇98OL》为此开启应急预案,也迅速的修复了该漏洞。这里,提醒其他游戏开发者也注意关注此类数值型变量上下溢出的风险。

【漏洞修复】

1、协议本身设计不合理,吃经验的请求中不需要上报增加经验值字段,只需要指定使用物品的ID或物品类型,由服务器根据ID或类型处理具体增加多少经验 2、后台应改用无符号整型存储武将经验值 3、后台对于客户端请求的异常处理分支当然是不能少的

►欢迎小伙伴们与我们多交流沟通,我们会收集大家的意见,不断优化完善,提供更优质的服务!

原文发布于微信公众号 - 腾讯WeTest(TencentWeTest)

原文发表时间:2015-09-24

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏ytkah

微信快速发送位置定位怎么弄【微信高级教程4】

  耗电量大是大多数智能手机的痛,好玩的东西多了,电量也撑不了多久。手机快没电时如何快速发送微信位置给好友好让他容易找到你呢?微信就内藏这样的彩蛋。   在微信...

49960
来自专栏老九学堂

如何成为一个牛逼的C/C++程序员?

这个题目的噱头太大,要真的写起来, 足够写一本书了。 老九君分享一些经验,希望能让初学的小伙伴少走弯路。 每个人的情况不一样,所以下面的描述可能并不适合每一个...

35240
来自专栏java工会

用JS编写一个Java虚拟机?谈谈哗众取宠的BicaVM

今日目睹某网络新闻,开篇明义便包含如下几行文字 【程序员Artur Ventura,这位超级大牛,用JavaScript写了一个java虚拟机BicaVM】 ...

13200
来自专栏安恒信息

网络密码需至少12个字符才能抵御黑客

美媒称,“心脏出血”漏洞是一个巨大的互联网安全漏洞,对包括雅虎、Flickr和Tumblr等著名网站在内的数以百万计的网站造成危害,致使用户...

336110
来自专栏walterlv - 吕毅的博客

转义,解决花括号在 Jekyll 被识别成 Liquid 代码的问题

发布于 2017-10-12 16:08 更新于 2018-08...

18410
来自专栏闰土大叔

太原面经分享:如何在vue面试环节,展示你晋级阿里P6+的技术功底?

一年一度紧张刺激的高考开始了,与此同时,我也没闲着,奔走在各大公司的前端面试环节,不断积累着经验,一路升级打怪。

22910
来自专栏程序员宝库

程序员的基础生存技能:高效用Google

来源:GavinZhang( @GavinBuildSomething ) guoze.me/2016/06/26/how-to-google/ 如果说近二十年...

338110
来自专栏Python中文社区

GayHub用户及仓库分析爬虫

專 欄 ❈陈键冬,Python中文社区专栏作者 GitHub: https://github.com/chenjiandongx ❈ 爬虫介绍 Github ...

30170
来自专栏窗户

sed的粉丝

  UNIX/LINUX下有个工具叫sed,起源于ed命令,但没有人机交互,完全是脚本语言。sed虽然是结构化的程序,但其虚拟出来的机器与我们实际机器相差甚远,...

22990
来自专栏月牙寂

Golang分布式并发---群体性热点淘汰算法

第一时间获取文章,可以关注本人公众号 月牙寂道长 yueyajidaozhang

41090

扫码关注云+社区

领取腾讯云代金券