设置成功的条件:
(1)当前euid = 0 (也即root)
(2) 三个参数,没一个等于原来某个id中的一个
以上两个条件,满足一个,setresuid即可正常调用,执行,将进程的id设置为对应的ID
举例:
(1) ruid = 100, euid = 0, suid = 300
setresuid(200,300,100) 可以成功执行。因为euid = 0 说明是root
(2)ruid = 100, euid = 300, suid = 200
setresuid(200,300,100) 可以成功执行,因为三个新的ID都是原来ID中的一个。
setresuid要么执行成功,所有的id设置成功,要么失败,所有的id设置失败。不能不分设置成功,部分失败。
2seteuid
无论什么情况,都只改变euid,不会改变ruid/suid
(1)如果euid = 0,那么新的euid随便设置,都可以成功改变。
(2)如果原来euid != 0 ,不同系统处理方式不一样:
Solaris和Linux只允许新的euid为原来三个ID中的一个。
FreeBSD只允许新的euid等于ruid和suid中的一个。(新的euid不能等于旧的euid)
3setreuid
会修改ruid/euid,某些情况下,也可以改变suid
不同的系统对setereuid有不同的处理方式:
Solaris和Linux中:setreuid(geteuid(), getuid())可以实现ruid和euid的交换。
FreeBSD会失败。
4setuid
(1) 如果原来的euid = 0,该函数将所有的id设置为新的id
比如:如果原来的id为: ruid = 300, euid = 0, suid = 100
那么setuid(200)后,ruid = 200, euid = 200, suid = 200
(2) 如果原来的euid != 0,但是新的id为原来ruid/suid中的一个,那么也是可以执行的,否则不能执行。
比如:原来三个id为: ruid = 100, euid = 200, suid = 300
那么setuid(300) 执行后: ruid = 100, euid = 300, suid = 300 也就是只改变了euid
setuid(400) 就不能执行。
结论:
(1)对于Linux如果euid != 0,那么新的id必须等于ruid/suid中的一个
(2) 如果euid = 0,三个id都将被设置为新的id,否则只设置euid
只有可以执行的二进制程序才可以设置setuid权限,并且命令执行者要对该程序拥有x权限。对于设定了setuid权限的命令来说,功能是命令执行者在执行该程序时获得该程序文件所有者的身份。setuid权限只在该程序执行过程中有效,也就是说身份改变只在程序执行过程中有效。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)