2011-12-03 | #1 |
高级会员
注册: 08年04月11日
来自: 盘丝洞
帖子: 311
声望力: 20
声望:
50
现金: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的安全漏洞是不是在这里算一个。嘿嘿.. |
|