我希望从一个“set-user root”程序启动一个root命令,因此我编写了以下C示例程序:
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
void main(int argc, char *argv[])
{
if(argc > 2) {
setuid(0);
printf("setuid(0) executed\n");
} else
printf("setuid(0) NOT executed\n");
system(argv[1]);
}在Debian 6 (64位)上进行测试时,我注意到传递"/bin/sh"作为参数,我总是得到一个ROOT SHELL,即使是argc == 2
$ gcc foo.c -o foo
$ su
Password: *****
# chown root:root ./foo
# chmod 4755 ./foo
# ls -l foo
-rwsr-xr-x 1 root root 6887 11 dic 17.44 foo
# exit
exit
$ ./foo /bin/sh
setuid(0) NOT executed
# exit <<<<< ROOT SHELL
$ ./foo /bin/sh 12345
setuid(0) executed
# exit <<<<< ROOT SHELL 在Slackware 14 (32位)上,它的行为有所不同:
$ gcc foo.c -o foo
$ su
Password: *****
bash-4.2# chown root:root ./foo
bash-4.2# chmod 4755 ./foo
bash-4.2# ls -l foo
-rwsr-xr-x 1 root root 6292 dic 11 17:53 foo
bash-4.2# exit
exit
$ foo /bin/sh
setuid(0) NOT executed
sh-4.2$ exit <<<<< USER SHELL
exit
$ foo /bin/sh 12345
setuid(0) executed
sh-4.2# exit <<<<< ROOT SHELL
exit 如果我以"/usr/bin/dolphin“作为论据,也会有不同的行为。
关于Debian,我无法让它发挥作用:
$ ./foo /usr/bin/dolphin
setuid(0) NOT executed
<unknown program name>(28884)/: KUniqueApplication: Cannot find the D-Bus session server: "Unable to autolaunch when setuid"
<unknown program name>(28883)/: KUniqueApplication: Pipe closed unexpectedly. 在Slackware上,只有当argc == 2运行时,它才能工作,所以我不能将海豚作为根启动。
为什么?
发布于 2013-12-11 17:50:32
要解释稍微奇怪的setuid行为,您需要理解/bin/sh实际上可能是bash,而bash的默认行为是删除euid,除非它是用-p调用的。
这意味着如果您使用-p调用bash,那么您应该会看到一个类似于根的shell:-
natsu ~> id -a
uid=1000(me) gid=1000(me) groups=1000(me),4(adm),15(kmem)
natsu ~> ./foo "/bin/bash -p"
setuid(0) NOT executed
bash-4.2# id -a
uid=1000(me) gid=1000(me) euid=0(root) egid=0(root) groups=0(root),4(adm),15(kmem),1000(me)而在不使用-p选项的情况下调用则会产生所观察到的行为:
pshanahan@natsu ~> ./foo /bin/bash
setuid(0) NOT executed
bash-4.2$ id -a
uid=1000(me) gid=1000(me) groups=1000(me),4(adm),15(kmem)但实际上,您只有有效的用户id 0,而不是真正的用户id 0。
让GUI在这种情况下运行..。这完全是另一回事,但这应该有助于你理解这种情况下的行为。
https://stackoverflow.com/questions/20525512
复制相似问题