1

我有一个 post-receive 挂钩,它调用我的 bash 脚本(它将拉取本地 repo 并重新启动 Java 服务器)。

这是 post-receive 挂钩的所有者信息:

-rwsr-x--x 1 cyril devs   676 19 dec.  14:45 post-receive

如您所见,我setuid bit在此脚本上设置了 ,以便cyril/devs也可以为其他用户运行。

这个脚本的内容很简单:

echo "Running post-receive hook"
echo "Server will be up and running in about 1 minute"
/home/project/start_dev restart &

我的脚本start_dev有这些权利:

-rwsr-x---  1 cyril devs 1515 19 dec.  14:41 start_dev

注:也是setuid.

如果我使用该帐户将某些内容推送到服务器cyril,则它可以完美运行。

如果其他人使用其他帐户推送到服务器,他们得到:

remote: /home/project/start_dev: line 52: kill: (11490) - Operation not allowed

(kill 用于停止实例。)

为什么他们有这个错误,脚本应该以cyril,而不是用户身份运行,因此他们应该有权杀死这个实例,对吧?

我究竟做错了什么?

4

1 回答 1

1

显然,大多数 Linux 发行版都禁用setuid了 shell 脚本,因为它可能导致大量安全漏洞。更多信息在这里和来自setuid 维基百科页面

虽然 setuid 功能在许多情况下都非常有用,但如果将 setuid 属性分配给未经仔细设计的可执行程序,则其使用不当可能会带来安全风险。由于潜在的安全问题,许多操作系统在应用于可执行 shell 脚本时会忽略 setuid 属性。

Tuxation 页面中一种可能的解决方案是执行以下操作:

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>

int main()
{
   setuid( 0 );
   system( "/path/to/script.sh" );

   return 0;
}

然后setuid生成 C 程序并将其用作您的钩子。不过,Tuxation 页面上也有此评论:

With all that said, running shell scripts with setuid isn't very safe, and the distro designers had a pretty good idea of what they were doing when many of them disabled it.

于 2012-12-19T14:31:59.797 回答