以setuid身份运行git的'post-receive'钩子失败

5

我有一个git仓库,需要以sudo身份运行post-receive hook。 我编译的测试二进制文件如下:

#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>

int main() {
   int ret;
   ret = setuid(geteuid());
   if(!ret) {
      fprintf(stderr, "error setting uid %d \n", ret);
   }       
   system("[...command only sudo can access...]");

   return 0;
}
geteuid()函数检索了post-receive的所有者id,然后尝试设置uid。在任何用户(包括超级用户)下执行此操作时,它会以root身份正确运行脚本。但是,在由git钩子触发时,系统无法设置uid。我尝试过运行chmod u+s post-receive和一些其他配置,但是我已经没有更多的想法了。有什么原因会在所有情况下都有效,除非被git触发?顺便说一下,平台为Ubuntu Server 9.04(2.6.28-15),git1.6.0.4,gcc版本为4.3.3(Ubuntu 4.3.3-5ubuntu4)。

一个问题是你打印了错误消息,但是继续执行system()调用。你还忽略了system()调用的结果,然后以成功(0)状态退出。 - Jonathan Leffler
@Blake:"-as the- with any user" 这一部分不太清楚——当你以推送的用户身份运行程序时,程序是否能正确运行?我认为复制它在 git 中运行的环境最接近的方法是:ssh hostname 'cd /path/to/repo; .git/hooks/post-receive' - Cascabel
为什么不让用户直接使用sudo命令(通过visudo进行配置,指定“NOPASSWD:”)?编写自己的suid-root包装器存在风险。 - Marius Gedminas
如果您想要一个挂钩以提升的权限运行,我认为您有一个设置问题。您最好重新考虑文件所有权和权限。 - Noufal Ibrahim
4个回答

1
  1. 存储Git存储库的文件系统可能会使用nosuid选项挂载
  2. 如果您正在通过SSH推送,则对于使用SSH调用的命令,suid功能可能会被禁用(无CAP_SETUID)

无论如何,您尝试做的事情都是非常不可取的。


1
  1. 将您的程序作为守护进程运行。
  2. 在套接字/命名管道/msgq上等待输入。
  3. 在钩子中,向您的守护进程发送一条消息,其中包含执行操作所需的任何信息。
  4. 如果需要,向钩子发送带有状态的消息回复。

这样做可能更容易管理和安全。


0
尝试从命令提示符中运行您的程序。

在没有通过 Git 激活时运行良好。 - Blake Chambers

0
尝试编写一个引导脚本。例如:
#/usr/bin/sh
./your_program

然后让脚本成为钩子。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接