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)
此外,我将用户添加xyz到house组中,以便只有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 身份执行其他文件。