原创
这几天,【衿】给我反馈了一个很神奇的问题,七日杀的服务器在某些情况下会莫名其妙的神奇的卡死,并且重启服务器也没用,只要有人到某个区域内,就会直接卡死。
在得到存档文件后,【衿】告诉我,他尝试过对其进行性能分析,最终定位到七日杀的工作台队列这个函数,每次服务器卡死,都是这个函数在无限循环导致程序崩溃。
于是在一起进行了一些可能性分析后,总结出了这个漏洞的原理。
具体工作原理如下:
因为七日杀的服务器,在工作台制作物品的时候,并不会校验用户上传的制作队列,无论是制作时间还是制作物品。并且七日杀服务器也不校验物品放置这个功能,只是一味的接受客户端提交的物块更改。
所以攻击者可以采用如下方式,攻击你的服务器=>在某个区域的地下,提交放置工作台,然后对此工作台提交一个伪造的不合法制作队列。这个制作队列中,制作时间是非法的输入,并且制作数量也是非法的。
七日杀服务器的工作台制作函数,是一个死循环,所以这种非法的队列,会导致工作台直接在死循环中,直接卡死七日杀主线程导致闪退。
如此一来,当有玩家尝试进入这个工作台的区域,激活此工作台,那么服务器会瞬间宕机闪退,即便你重新开服,甚至都无法手动清理该区域,因为你还没接近这个区域,一但服务器开始加载,那么就会崩溃。
弄懂了崩溃原理,我们再去分析七日杀源码为何会崩溃。
这其实有两方面的因素,具体为:1、七日杀不对上传的制作队列做校验。2、七日杀即便发现了错误的制作请求,也不从任务队列中删除它,而是尝试重复加载。
说起来,1号问题还是比较常见的,大部分服务器漏洞都来源于七日杀本身根本不对客户端数据做校验,这个可以说是七日杀的一大特色,本地的权限非常大。但是2号问题就有些令人不可思议了,很难想象一个智商健全的开发者,在明明发现一个错误制作的请求的情况下,竟然不丢弃该请求反而尝试在一个死循环中重复加载?
修复起来也比较简单,首先,我们在TileEntityWorkstation_HandleRecipeQueue这个函数中,添加对制作物品的各种必要属性的校验,使其不会产生制作了1s钟,制作时间减少了-1s钟这种很简单的逻辑错误问题。
其次,我们在TileEntityWorkstation_cycleRecipeQueue中,将整个RecipeQueue重写,这个cycleRecipeQueue实际上是一个制作队列刷新的实现,原版的实现有很多的漏洞,这里我们直接弃用原版的写法,重构其制作队列的刷新机制,使得当遇到不合法的制作请求的时候,直接抛弃,而不是重复的对不合法的请求重复执行。
经过这样的修改后,我们的工作台队列就变得更加合理了。他绝不会因为非法队列而卡死,只要有队列上来,就一定能够成功结束。
附件内容中,我将附上修复此漏洞的C#源码,以及制作好的,未加壳的开源DLL,供大家学习参考。
隐藏内容需要付费才可以看见
这个逼装的我给82分,剩下的用666的方式打给你!
必须支持楼主!
这个逼装的我给82分,剩下的用666的方式打给你!
接MOD定制开服架设/仙城传说②玩家群:259993999
接MOD定制开服架设/仙城传说②玩家群:259993999
这个逼装的我给82分,剩下的用666的方式打给你!感谢大佬的付出,赞一个!
q群 550180643
感谢大佬分享,之前就是这个问题一直被炸服务器,只能重置地图,没有任何办法
群:1050040662 定制/开服/地图制作/价格公道
“很难想象一个智商健全的开发者,在明明发现一个错误制作的请求的情况下,竟然不丢弃该请求反而尝试在一个死循环中重复加载”太TM贴切了,所有的爆红卡死都是这样的
定制+Q417983415
这个逼装的我给82分,剩下的用666的方式打给你!
这个逼装的我给82分,剩下的用666的方式打给你!