2

我希望 A 用户作为 B 用户做一些工作。如果 B 是 root 就可以,但非 root 用户失败。以下是基本代码:

根.c:

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>

int main()
{
    setuid( 0 );
    system( "/tmp/script_of_root.sh" );

    return 0;
}

script_of_root.sh:

#!/bin/sh
echo $RANDOM >> /tmp/file_of_root

播放

$ cd /tmp
$ cc root.c -o root
$ su -
# chown root.root /tmp/root
# chmod 4755 /tmp/root
# exit
$ ./root

执行“./root”后,文件“/tmp/file_of_root”将被更新。但是,如果我将相同的东西应用于非 root 用户,它就不起作用。代码:

foob​​ar.c:

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>

int main()
{
    setuid( 1001 );    // uid of user "foobar"
    system( "/tmp/script_of_foobar.sh" );

    return 0;
}

script_of_foobar.sh:

#!/bin/sh
echo $RANDOM >> /tmp/file_of_foobar

播放

$ cd /tmp
$ cc foobar.c -o foobar
$ su -
# chown foobar.users /tmp/foobar
# chmod 4755 /tmp/foobar
# exit
$ ./foobar

如果我以其他普通用户(而不是“foobar”本身)的身份运行“./foobar”,这将是错误的:

/tmp/script_of_foobar.sh: line 2: file_of_foobar: Permission denied

我完全糊涂了。为什么第二种情况不起作用?

此致。

4

2 回答 2

1

foob​​ar.c 中的 setuid 调用只有在您是 root 或您的有效 UID 为 1001 时才会成功。

所以。如果您不是 root,setuid(1001) 将失败,并且您将没有必要的权限来覆盖“foobar”拥有的文件。

于 2012-05-16T23:09:46.417 回答
0

从输出看来,您的非 root 用户能够执行 script_of_foobar.sh,但无法写入 /tmp/file_of_foobar。/tmp 上的权限是否可能关闭?我相信它应该设置为1777。

于 2012-05-16T23:14:30.050 回答