gpt4 book ai didi

从 setuid root C 程序调用脚本 - 脚本不以 root 身份运行

转载 作者:太空狗 更新时间:2023-10-29 16:24:19 26 4
gpt4 key购买 nike

我需要以 root 身份运行 bash 脚本(无密码的 sudo 或 su 不可行),并且由于您无法在 Linux 中设置脚本,我考虑过从可执行文件中调用它并设置 setuid:

$ cat wrapper.c
int main(void)
{
system("/bin/bash ./should_run_as_root.sh");
}
$ gcc -o wrapper wrapper.c
$ sudo chown root wrapper
$ sudo chmod ug+s wrapper
$ ll wrapper
-rwsr-sr-x 1 root users 6667 2009-02-17 11:11 wrapper
$

这有效 - 就像正确运行脚本一样 - 但脚本以执行“./wrapper”的用户身份运行。

为什么?以及如何正确实现?

谢谢!

最佳答案

由于可执行文件上的 suid 位仅更改可执行文件运行的有效 UID (EUID),而不是 getuid() 返回的真实 UID (RUID) ,除了对 suid 解释脚本(任何以“#!”开头的可执行文件)的限制外,一些 shell,如 bash 作为额外的在这种情况下,安全措施会将 EUID 设置回 RUID,您需要在执行脚本之前在 C 代码中调用 setuid(0)

参见 setuidseteuidgetuidgeteuidman 页面code> 以了解真实有效 UID 的确切语义。

(WARNING) 当然,这是一个恰当的提法,许多 Unix 系统、shell 和解释器中对 suid 脚本的限制是有原因的,也就是说,如果脚本在执行时没有非常小心地清理其输入和环境状态,那么它们是危险的并且可以被用于安全升级。所以这样做时要非常小心。尽可能严格地设置对脚本和包装器的访问,只允许您打算执行的这个非常具体的脚本,并在启动脚本之前清除 C 程序中的环境,设置环境变量,例如 PATH 以正确的顺序准确包含必要的内容,并且没有其他人可写的目录。

关于从 setuid root C 程序调用脚本 - 脚本不以 root 身份运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/556194/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com