用于python脚本的setuid / setgid包装器

时间:2014-07-02 21:36:32

标签: python permissions wrapper elevated-privileges setuid

我有一个Python脚本,我希望能够作为系统用户guybrush以UID 200和组guybrush与GID 200一起运行。

目前我的Python脚本(位于/path/to/script.py)看起来像这样:

#!/usr/bin/env python2
import os

print "uid: %s" % os.getuid()
print "euid: %s" % os.getgid()
print "gid: %s" % os.geteuid()
print "egid: %s" % os.getegid()

我尝试过的C包装器(scriptwrap.c)看起来像这样:

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

int main(int argc, char *argv[]) {
    setuid(geteuid());
    setgid(getegid());
    return execv("/path/to/script.py", argv);
}

然后我按如下方式编译,chown和chmod包装器:

$ gcc scriptwrap.c -o scriptwrap
$ chown guybrush:guybrush scriptwrap
$ chmod 6755 scriptwrap

然而,当我运行scriptwrap时,我得到以下输出:

uid: 1000
euid: 1000
gid: 200
egid: 200

因此,由于某种原因,只设置了GID(我的普通UID是1000)。我该怎么做才能解决这个问题?

编辑:如果我将脚本chown到root:root并运行它,则UID,eUID,GID和eGID都设置为0。

此外,这是在Ubuntu 12.04.4 LTS上。

1 个答案:

答案 0 :(得分:5)

好吧,我想到了这一点(并在此过程中学到了一点)。令人尴尬的是,我的初始问题是由我的Python脚本中的拼写错误造成的:我在标签euid下打印出GID,在标签gid下打印出eUID。糟糕。

所以eUID和eGID实际设置正确 - 很棒。但是,尽管我在C包装器中使用了setuidsetgid,但仍然没有设置UID和GID。

事实证明,这是因为setuidsetgid的行为因您是root而有所不同:如果您是root用户,则致电{{1} },它将您的真实UID和有效UID设置为您传入的任何内容,如果您不是setuid,则只设置有效UID(source)。因此,我对root(和setuid)的使用基本上是禁止操作。

但是,可以使用setgidsetreuid来电设置真实的UID和GID:

setregid

运行时,(更正的)Python脚本会产生以下输出:

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

int main(int argc, char *argv[]) {
    setreuid(geteuid(), geteuid());
    setregid(getegid(), getegid());
    return execv("/path/to/script.py", argv);
}