背景:
阅读文章

UID与EUID

[日期:2007-05-06] 来源:  作者:姝儿 [字体: ]

UID与EUID及其相关的MudLIB安全属性的设置

拿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的安全漏洞是不是在这里算一个。嘿嘿..
 
尊重作者 转载请注明出处52mud.com

收藏 推荐 打印 | 录入:sbso | 阅读:
相关内容      
本文评论   [发表评论]   全部评论 (0)
内容推送
52mud提供
一起回忆泥巴游戏QQ群68186072
52mud官方微信公众平台
热门评论