0

我正在尝试使用 setuid 位设置一个 python 脚本可执行文件。该程序属于用户“bgmc”,必须在目录“/home/bgmc”中创建一些文件,但被另一个用户“client”调用。实际上,我不希望用户“客户端”更改程序创建的文件。我使用 c-wrapper 来调用程序(请参阅shell 脚本上的 setuid):

#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 访问权限。有没有办法防止这种情况?

4

1 回答 1

3

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

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

  1. 使用execve而不是system调用它,并且
  2. 清除环境中的所有内容(或将新的空环境传递给execve)。

就像现在一样,任何可以运行该程序的人都可以通过控制环境变量使其为所欲为。

于 2012-03-02T17:07:43.663 回答