用setuid运行git'post-receive'钩子失败了

时间:2009-09-02 06:18:18

标签: c++ git ubuntu permissions setuid

我有一个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,然后尝试setuid。当与任何用户(包括超级用户)一起运行时,它以root身份正确运行脚本。但是,当由git hook触发时,系统无法设置uid。我已经尝试过运行chmod u+s post-receive我也尝试过其他一些配置,但我的想法已经用完了。除非git触发它,否则它会在所有情况下都有效?

btw,平台Ubuntu Server 9.04(2.6.28-15),git1.6.0.4,gcc版本4.3.3(Ubuntu 4.3.3-5ubuntu4)

4 个答案:

答案 0 :(得分:1)

  1. 存储git repo的文件系统可以使用nosuid选项
  2. 进行安装
  3. 如果您正在推送ssh,则可以对使用ssh调用的命令禁用suid功能(无CAP_SETUID)
  4. 无论如何,你要做的事情是非常不可取的。

答案 1 :(得分:1)

  1. 将您的程序作为守护程序运行。
  2. 等待套接字/命名管道/ msgq上的输入。
  3. 在钩子中,使用执行操作所需的任何信息向您的守护程序发送消息。
  4. 如果需要,请将消息发送回状态挂钩。
  5. 这可能更容易管理和保护。

答案 2 :(得分:0)

尝试从命令提示符运行程序

答案 3 :(得分:0)

尝试编写引导脚本。即

#/usr/bin/sh
./your_program

然后使脚本成为钩子。