文字MUD游戏论坛-天下泥潭群英会-水泊梁山  

返回   文字MUD游戏论坛-天下泥潭群英会-水泊梁山 > 西游之旅 > 『 巫师天下 』

『 巫师天下 』 学习如何挂MUD,如何制作MUD。讨论如何管理好一个MUD,做好一个巫师。

发表新主题 回复
 
LinkBack 主题工具 主题评分 显示模式
旧 2011-12-03   #1
高级会员
级别:6 | 在线时长:109小时 | 升级还需:31小时级别:6 | 在线时长:109小时 | 升级还需:31小时级别:6 | 在线时长:109小时 | 升级还需:31小时
 
Odysseus 的头像
 
注册: 08年04月11日
来自: 盘丝洞
帖子: 311
声望力: 20
声望: 50 Odysseus 初领妙道
现金:29两梁山币
资产:1245两梁山币
致谢数: 0
获感谢文章数:0
获会员感谢数:0
UID与EUID

UID与EUID及其相关的MudLIB安全属性的设置
by 姝儿@tzcq 2001/05/04


拿goodtaste的话作个开场吧。


“euid 和 uid是 mud 模仿linux建立的一套权限机制。
euid是有效用户识别号,uid是用户识别号(俺不记得标准的叫法了)。
mud里每个物件都有对应的uid和euid。具体的定义在:
/adm/single(obj)/object.c->creator_file(),各个mud可能不太一样。”

/* creator_file() - 对一个新创造的物件指定其使用者识别名称 (user id, uid)

每次创造一个新的物件时, 会调用主控物件中 (master object) 的 creator_file() 函数. 此物件的文件名称是 creator_file() 函是唯一的参数. 而 creator_file 返回的字符串是此物件设定的使用者识别名称. 如果编译驱动程序时, 于 options.h 开启了AUTO_SETUID , 则用同一个识别名称作为此物件的有效使用者识别名称 (effective user id, euid) */

摸索一下调用过程:
/adm/single/master.c:
string creator_file(string str){
return(string)call_other(SIMUL_EFUN_OB, "creator_file", str);
}
SIMUL_EFUN_OB(/adm/single/simul_efun) #include "/adm/simul_efun/object.c"

我熟悉的这个lib的object在/adm/simul_efun/下,(BTW:这个文件里定义了本地的living()判断,不是判断 disable_command(),而是判断query_temp("disabled"),就是我以前说的这个lib用一种不太彻底的办法来解决 disable_player的玩家重新加载add_action()的一种漏洞补偿--题外话)
object.c->creator_file()中定义了对应的uid和euid(如果没有编译option.h的时候没有开启AUTO_SETUID,就不能说定义了euid吧,应该在文件中seteuid(getuid())),具体情况如下:
case "adm":
if( file==SIMUL_EFUN_OB ) return "MudOS";
else return ROOT_UID;
case "cmds":
return ROOT_UID;
case "u":
if( sizeof(path)>=4 ) return path[2];
case "d":
case "open":
case "ftp":
if( sizeof(path)>=3 ) return path[1];
default:
if( this_player(1) )
return getuid(this_player(1)); // 这个设置让偶控制npc好不自在:)
else
return "MudOS";

至于玩家的euid的设置,/adm/daemons/logind.c->make_body()中
seteuid(ob->query("id"));
export_uid(user);
export_uid(ob);
seteuid(getuid());

“这套东西的用处主要是为了区分权限,在securityd.c里的权限判断是euid和wiz_level两套东西同时作的。具体可以看看 valid_writevalid_read函数。另外一个好处是getuid()一个玩加得到它的ID比query("id")来的可靠,因为它是依赖 文件名产生的。(goodtaste语)”
“euid是effective user id , 可以理解为运行时的有效id,是可以在func执行时通过seteuid来设置,设置时会根据master里的valid_seteuid来做安全检查(minux语)”

master->valid_seteuid()也是返回的SECURITY_D的valid_seteuid()
int valid_seteuid( object ob, string str ){
return (int)SECURITY_D->valid_seteuid( ob, str );
}

所以现在看一下:SECURITY_D(/adm/daemons/securd.c)->valid_seteuid()的定义:
int valid_seteuid( object ob, string uid )
{
if( uid==0 ) return 1;
if( uid==getuid(ob) ) return 1;
if( getuid(ob)==ROOT_UID ) return 1;
if( sscanf(file_name(ob), "/adm/%*s") ) return 1;
if( wiz_status[uid] != "(admin)"
&& wiz_status[getuid(ob)] == "(admin)" )
return 1;
return 0;
}

这个就是安全的防护了,看到这里不禁想到了case "cmds": return ROOT_UID;唔,倘若做了cmd来seteuid....不知大家说的es2的安全漏洞是不是在这里算一个。嘿嘿..
Odysseus 当前离线  
回复时引用此帖

发表新主题 回复

添加到书签

主题工具
显示模式 对此主题评分
对此主题评分:

发帖规则
不可以发表主师
不可以回复帖子
不可以上传附件
不可以编辑自己的帖子

论坛启用 vB 代码
论坛启用 表情图标
论坛启用 [IMG] 代码
论坛禁用 HTML 代码
Trackbacks are 启用
Pingbacks are 启用
Refbacks are 启用



所有时间均为格林尼治时间 +9, 现在的时间是 22:26.


Powered by SPLS
版权所有 2001-2023 水泊梁山
皖ICP备05012024号

站长 fengyue

Content Relevant URLs by vBSEO 3.6.1