【问题标题】:running git 'post-receive' hook with setuid fails使用 setuid 运行 git 'post-receive' 钩子失败
【发布时间】:2010-11-24 20:44:27
【问题描述】:

我有一个 git 存储库,它需要以 sudo 的形式运行接收后挂钩。我为测试而编译的二进制文件如下所示:

#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 钩子触发时,系统无法设置 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) 状态退出。
  • @Blake:“-as the- with any user”位不清楚-当以您推送的用户身份运行时,程序是否正确运行?我认为复制 git 运行的环境的最接近方法是:ssh hostname 'cd /path/to/repo; .git/hooks/post-receive'
  • 为什么不让用户直接用sudo运行命令(用visudo配置,指定'NOPASSWD:')?编写自己的 suid-root 包装器是有风险的。
  • 如果您希望挂钩以提升的权限运行,我认为您遇到了设置问题。您最好重新考虑文件所有权和权限。

标签: c++ git ubuntu permissions setuid


【解决方案1】:
  1. 存储 git repo 的文件系统可以使用 nosuid 选项挂载
  2. 如果您通过 ssh 推送,则 suid 功能可能会为使用 ssh 调用的命令禁用(无 CAP_SETUID)

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

【讨论】:

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

    这可能更容易管理和妥善保护。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 未通过 git 激活时工作正常。
      【解决方案4】:

      尝试编写引导脚本。即

      #/usr/bin/sh
      ./your_program
      

      然后让脚本成为钩子。

      【讨论】:

        猜你喜欢
        • 2012-01-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-02-02
        • 2017-10-19
        • 2014-05-13
        • 2014-10-28
        • 1970-01-01
        相关资源
        最近更新 更多