【问题标题】:setuid/setgid wrapper for python script用于 python 脚本的 setuid/setgid 包装器
【发布时间】:2014-08-23 20:28:06
【问题描述】:

我有一个 Python 脚本,我希望能够以 UID 200 的系统用户 guybrush 和 GID 200 的组 guybrush 的身份运行。

目前我的 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)。我该怎么做才能解决这个问题?

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

另外,这是在 Ubuntu 12.04.4 LTS 上。

【问题讨论】:

    标签: python permissions wrapper elevated-privileges setuid


    【解决方案1】:

    嗯,我想通了(并在此过程中学到了一点)。令人尴尬的是,我最初的问题是由我的 Python 脚本中的拼写错误引起的:我打印出标签 euid 下的 GID,以及标签 gid 下的 eUID。哎呀。

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

    事实证明,这是由于 setuidsetgid 的行为因您是否为 root 而不同:如果您是 root 并且您调用 setuid,它会设置您的真实 UID 和无论您传入什么,您的有效 UID,如果您不是 root,它只会设置有效 UID (source)。所以我对setuid(和setgid)的使用基本上是无操作的。

    但是可以使用setreuidsetregid 调用来设置真实的UID 和GID:

    #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);
    }
    

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-11-03
      • 2010-12-02
      • 2017-02-15
      • 2020-05-01
      • 2019-03-12
      • 1970-01-01
      • 2012-01-08
      • 1970-01-01
      相关资源
      最近更新 更多