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

时间:2014-09-19 11:57:28

标签: linux shell

我正在尝试为Linux上的普通用户创建一个执行程序,并设置SUID位,因此无论何种命令(作为参数传递给程序)都以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

2 个答案:

答案 0 :(得分:3)

记录在execve(2)

  

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

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

请参阅this question

您可以配置sudo以避免询问密码 - 请参阅sudoers(5)(或使用super

您还可以编写一个包装shell脚本的简单C程序,并将其设置为setuid。

答案 1 :(得分:0)

尝试

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