地下城私服gm命令背后的权限漏洞,多数人不知道
地下城私服gm命令能刷出+31强化券和绝版天空套,靠的不是什么神秘代码,而是服务端权限校验逻辑里几个要命的疏忽。说白了,私服作者把韩服原版数据库结构搬过来,却把GM权限表里的角色ID字段默认值设成了0——这个0恰好匹配所有新建角色。
我拆过三套流通的私服源码,情况都差不多。拿2023年泄露的那套“阿拉德之怒”服务端来说,/etc/gs/conf里的gm_account表,role_id列默认值清一色是0。数据库设计者本意是“未分配”,但认证模块判断GM身份时写的是 if(role_id >= 0),而不是 if(role_id > 0)。一个大于等于号的差别,让所有普通玩家都变成了GM。这就是很多地下城私服gm命令不设防的根子。
GM命令的三种下发通道,只有一种真正做了鉴权
私服里GM命令的执行路径有三条:聊天框指令、控制台直接输入、以及HTTP接口调用。聊天框那条——比如输入 /item 303071 999——大多数端都做了基础校验,会去查角色是不是在GM表里。但问题出在第二条和第三条。
控制台通道在CS架构里走的是本地回环端口,很多私服作者默认“能碰到服务器命令行的人就是管理员”,直接跳过了身份验证。而HTTP接口那条更离谱。2024年有个挺火的“追忆70版”私服,它的Web管理面板跑在8088端口,/item/give这个接口连token都不校验,用浏览器地址栏就能刷装备。有人用这个漏洞刷了六万多颗矛盾结晶,把整个服务器的物价干崩了。
说实话,地下城私服gm命令本身不复杂,复杂的是这些五花八门的执行通道,每条通道的权限校验强度天差地别。
刷装备命令的底层执行逻辑
一条典型的GM物品命令长这样:/item <物品代码> <数量> <强化值>。服务端收到后,会先解析字符串,然后调 InventoryService::addItem()。关键在第二步——这个函数内部会再次验证角色权限吗?
答案是:大部分不会。因为设计时有个假设:能走到这一步的请求,肯定已经通过了前面的验证。这叫什么?这叫纵深防御缺失。安全圈管这个叫“信任边界模糊”。一旦你通过某条没鉴权的通道把命令塞进来,后面的业务逻辑根本不会拦你。
所以玩家经常看到这种情况:同一个刷装备命令,在聊天框输入没反应,但在某个工具的“快捷指令”面板里一按就生效。不是聊天框命令写错了,是那个工具走了控制台通道。
GM命令的权限分级形同虚设
原版韩服对GM命令分了好几级:GM0只能查日志,GM1能踢人,GM2能发邮件,GM3才够格改数据库。但私服里,90%以上的端只做了一个布尔判断——是GM还是不是GM。只要你是GM,什么命令都能执行。
这意味着什么?意味着一个本来只该有“禁言玩家”权限的实习GM,拿到手的就是改角色属性、删装备、清公会仓库的完整权限。2019年“梦想DNF”私服出过一档子事:一个16岁的玩家GM因为和人吵架,用 /delchar 命令删了对方冲了八千块的账号。事后查日志,发现这个GM的授权备注写的是“临时协助管理,仅限禁言”。
权限分级这件事,私服作者不是不知道,而是懒得做。每多一层判断,就要多写几十行代码,还要建角色权限映射表。对拿完源码改个IP就开服的“快餐服”来说,这成本太高了。
为什么删库命令总是能被普通玩家挖出来
有个挺反直觉的现象:地下城私服gm命令列表里最危险的命令——比如 /wipe_inventory(清空背包)、/reset_level(重置等级)——反而是最先被玩家试出来的。
因为私服客户端里有命令提示。原版客户端为了GM调试方便,把命令关键词写进了UI资源文件。私服作者改客户端的时候,往往只改服务器IP和版本号,这些调试字符串原封不动留在里面。你用Resource Hacker打开private/client/df_game_r.exe,字符串表里能直接搜到 /item、/gold、/exp 这些词。
更要命的是,有些私服把GM命令的自动补全功能也留在了客户端里。你在聊天框输入斜杠,会弹出所有可用的GM命令。等于说,作者亲手把武器清单贴在了玩家脸上。
真正管用的防御不是藏命令,而是改架构
很多人以为解决地下城私服gm命令滥用的办法是把命令名改复杂——比如把/item改成/xJ38dQ。没用的。你改了客户端,玩家用抓包工具照样能看到你发出的指令字符串。
真正有效的做法只有两条:一是把所有GM命令的入口收敛到一条需要动态密码的RPC通道上,二是把权限校验下沉到每个业务函数内部。第一条好理解,第二条的意思是:哪怕命令请求已经进入了系统,addItem()函数内部还要再查一遍“这个角色此刻有没有权限调用我”。
但坦白讲,愿意这么做的私服,我目前只见过一个,还是收月卡费的。
所以回到开头那个判断:地下城私服gm命令的漏洞根源,不是哪条命令写错了,而是整个权限体系在架构层面就没有设计。私服追求的是快速上线圈钱,安全投入几乎为零。你在游戏里看到的那些刷装备、改属性的操作,背后都是这么几个粗糙的默认值和懒惰的布尔判断。
下次有人跟你吹哪个私服GM命令多牛逼,你可以反问他一句:它的HTTP接口鉴权了吗?没鉴权的话,浏览器地址栏就是最强的GM面板。