为什么 setuid 不起作用?

Mar*_*ton 20 linux root setuid chmod privileges

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

chmod u+s program1.sh
ls -l program1.sh
rwsr-x--- 1 root house 1299 May 15 23:54 program1.sh
Run Code Online (Sandbox Code Playgroud)

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

在 program1.sh 中有

id -u
Run Code Online (Sandbox Code Playgroud)

以便它可以向我显示有效 ID。

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

cio*_*y23 44

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

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

这是操作系统采取的一种安全措施。您应该将脚本与sudo一起使用。

如果你真的需要使用 setuid o 你的脚本,你可以创建一个二进制文件来完成这项工作。创建一个新文件“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;
   }
Run Code Online (Sandbox Code Playgroud)

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

$ gcc program.c -o program
$ sudo chown root.root program
$ sudo chmod 4755 program
$ ./program
Run Code Online (Sandbox Code Playgroud)

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

  • 请注意,这个解决方案是危险的,只要用户可以编辑或替换`./program.sh`。这将使每个可以执行“程序”的用户能够以拥有“程序”的用户身份运行任意代码。在我看来,更安全的解决方案是将代码从 `./program.sh` 直接移植到 C 代码中,然后将其添加到 `program.c`。 (5认同)