为什么 setuid 不起作用?

为什么 setuid 不起作用?

我想确保我的程序只能由xyz使用 root 权限的用户运行。为此,我设置了 setuid 位:

chmod u+s program1.sh
ls -l program1.sh
rwsr-x--- 1 root house 1299 May 15 23:54 program1.sh

另外,我将用户添加xyzhouse组中,以便只有xyzroot 可以运行program1.sh。

在program1.sh中有

id -u

这样它就可以显示有效的ID。

以 root身份运行program1.sh,显示root.但运行该xyz帐户,它显示xyz。看来它没有以 root 权限运行。我不知道这里出了什么问题。

答案1

执行具有 setuid 位的 shell 脚本(例如权限为 rwsr-xr-x)时,脚本以执行它们的用户身份运行,而不是以拥有它们的用户身份运行。这与 setuid 对二进制文件(例如 /usr/bin/passwd)的处理方式相反,二进制文件以拥有它们的用户身份运行,无论哪个用户执行它们。

检查此页面:https://access.redhat.com/site/solutions/124693

这是操作系统采取的安全措施。你应该使用你的脚本须藤反而。

如果您确实需要在脚本中使用 setuid,您可以创建一个可执行该工作的二进制文件。创建一个新文件“program.c”并复制以下代码:

   #include <stdio.h>
   #include <stdlib.h>
   #include <sys/types.h>
   #include <unistd.h>
     
   int main()
   {
     setuid(0);
     system("./program.sh"); #This line is dangerous: It allows an attacker to execute arbitrary code on your machine (even by accident).
     return 0;
   }

使用以下命令编译并执行代码:

$ gcc program.c -o program
$ sudo chown root.root program
$ sudo chmod 4755 program
$ ./program

这样就可以了。 setuid适用于编译后的文件,该文件可以以root身份执行其他文件。

相关内容