如何在非root用户的程序中设置setuid位?

时间:2012-03-02 16:31:49

标签: c setuid

我试图使用setuid位设置使python脚本可执行。属于用户'bgmc'的程序必须在'/ home / bgmc'目录中创建一些文件,但是由另一个用户'client'调用。实际上,我不希望用户'客户'更改程序创建的文件。我用c-wrapper来调用程序(参见setuid on shell scripts):

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

int main()
{
    setuid(0);
    system("/home/bgmc/myprogram.sh");
    return 0;
}

我设置了程序的setuid位。当c编译的程序属于root时,程序运行良好并创建预期的文件。然后是c编译程序的属性:

8 -rws--x--x 1 root root 4657 Mar  2 16:25 myprogram

但是,当我将myprogram的用户组更改为bgmc:bgmc时,程序无法再创建该文件:“权限被拒绝”。我试图更改这一行:

setuid(0);

使用:

setuid(1002);

因为1002是'bgmc'的用户ID(我使用了命令“id -u bgmc”),但这没有帮助。

我宁愿不让root访问该程序。有办法防止这种情况吗?

1 个答案:

答案 0 :(得分:2)

由于您的问题在信息上非常稀少,所以不确定,但您是否忘记在更改所有者后重置文件的权限?在大多数系统上,任何所有权更改都会自动删除setuid位,如果需要,您必须自己重新添加。

另请注意,setuid shell脚本是主要漏洞;这就是内核不允许您直接创建shell脚本setuid的原因。至少你应该:

  1. 使用execve而不是system来调用它,
  2. 清除环境中的所有内容(或将新的空白环境传递给execve)。
  3. 就像现在一样,任何能够运行程序的人都可以通过控制环境变量来做任何他们喜欢的事情。