为什么SetSUID不能用于shell脚本?

我正在尝试为Linux上的普通用户创build一个执行器程序,并设置SUID位,所以无论什么命令作为parameter passing给程序,都会以root权限执行。 但是,当我尝试实现这个作为一个bash脚本,这是行不通的,在C中实现它的工作。我想知道我在做什么错误的shell脚本。 代码如下

shell脚本:

#! /bin/bash if [ $# -lt 1 ]; then echo "Usage: $0 <Command String>" exit 1 fi $@ #Also tried this, same result #exec $@ 

执行:

 root#: chmod 755 exec.sh root#: chmod u+s exec.sh root#: ll exec.sh -rwsr-xr-x 1 root root 75 Sep 19 16:55 exec.sh regular_user$: ./exec.sh whoami regular_user 

C程序:

 #include <stdlib.h> #include <stdio.h> int main ( int argc, char *argv[] ) { if ( argc < 2 ) { printf( "Usage: %s <Command String>\n", argv[0] ); return 1; } else { argv[argc]=NULL; //setuid(0); //Works without these //setgid(0); int exit=execvp(argv[1], argv+1); return exit; } } 

执行:

 root#: gcc exec.c -o exec.obj root#: chmod 755 exec.obj root#: chmod u+s exec.obj root#: ll exec.obj -rwsr-xr-x 1 root root 6979 Sep 19 17:03 exec.obj regular_user$: ./exec.obj whoami root 

两个文件具有相同的权限

 -rwsr-xr-x 1 root root 75 Sep 19 16:55 exec.sh -rwsr-xr-x 1 root root 6979 Sep 19 17:03 exec.obj 

这是记录在execve(2)中 :

Linux会忽略脚本上的set-user-ID和set-group-ID位。

IIRC,setuid脚本将是一个重大的安全漏洞

看到这个问题

你可以配置sudo来避免询问密码 – 参见sudoers(5) (或使用super

你也可以编写一个包装你的shell脚本的简单的C程序,并使它成为setuid。

尝试

 regular_user$: sudo "./exec.sh whoami"