我需要以 root 身份运行 bash 脚本(无密码 sudo 或 su 不可行),并且由于您无法在 Linux 中设置脚本,所以我考虑从可执行文件调用它并制作it 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”的用户身份运行。
为什么?以及如何正确实施这一点?
Thanks!
自从suid
可执行文件上的位仅更改可执行文件将运行的有效 UID (EUID),而不是实际 UID (RUID)getuid()
回报,并且除了限制suid
解释脚本(任何以“开头的可执行文件#!
“),一些贝壳像bash
作为额外的安全措施,在这种情况下会将 EUID 设置回 RUID,您将需要使用以下调用setuid(0)
在执行脚本之前在 C 代码中。
See the man
的页面setuid
, seteuid
, getuid
, and geteuid
了解真实有效的 UID 的确切语义。
(WARNING)当然,这是一个适当的提点,即对suid
许多 Unix 系统、shell 和解释器中的脚本存在是有原因的,即如果脚本在执行时没有非常小心地清理其输入和环境状态,那么它们是危险的,可以被利用来进行安全升级。因此,执行此操作时要非常小心。尽可能严格地设置对脚本和包装器的访问权限,仅允许执行您打算执行的非常特定的脚本,并在启动脚本之前清除 C 程序中的环境,设置环境变量,例如PATH
以正确的顺序准确包含必需的内容,并且没有可供其他人写入的目录。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)