python脚本的setuid/setgid包装器
我有一个Python脚本,我希望能够作为uid200的系统用户python脚本的setuid/setgid包装器,python,permissions,wrapper,elevated-privileges,setuid,Python,Permissions,Wrapper,Elevated Privileges,Setuid,我有一个Python脚本,我希望能够作为uid200的系统用户guybrush和gid200的组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.ge
guybrush
和gid200的组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()
#include <unistd.h>
#include <sys/types.h>
int main(int argc, char *argv[]) {
setuid(geteuid());
setgid(getegid());
return execv("/path/to/script.py", argv);
}
我尝试的C包装(scriptwrap.C
)如下所示:
#!/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()
#include <unistd.h>
#include <sys/types.h>
int main(int argc, char *argv[]) {
setuid(geteuid());
setgid(getegid());
return execv("/path/to/script.py", argv);
}
然而,当我运行scriptwrap时,我得到以下输出:
uid: 1000
euid: 1000
gid: 200
egid: 200
因此,出于某种原因,只设置了GID(我的正常UID是1000)。我能做些什么来解决这个问题
编辑:如果我将脚本切换到root:root
并运行它,UID、eUID、GID和eGID都设置为0
另外,这是在Ubuntu12.04.4LTS上的。我发现了这一点(并在这个过程中学到了一些东西)。令人尴尬的是,我最初的问题是由Python脚本中的一个输入错误引起的:我正在打印标签euid
下的GID,以及标签GID
下的euid。哎呀
因此eUID和eGID实际上设置正确-很好。但是UID和GID仍然没有设置,尽管我在C包装中使用了setuid
和setgid
事实证明,这是由于setuid
和setgid
的行为根据您是否是root
而有所不同:如果您是root,并且调用setuid
,它会将您的实际UID和有效UID设置为传入的任何值,如果您不是root
,它只会设置有效UID()。因此,我对setuid
(和setgid
)的使用基本上没有操作
但是,可以通过使用setreuid
和setregid
调用来设置实际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);
}