我正在尝试为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"