使用setuid()函数降权时出现“操作不允许”

9 投票
2 回答
7736 浏览
提问于 2025-04-16 09:58

为什么这个简单的程序使用 os.setuid()/gid() 会失败呢?虽然是用 Python 写的,但我觉得这和语言没有关系(毕竟都是一样的 posix 系统调用):

import os, pwd

if os.getenv("SUDO_UID") and os.getenv("SUDO_GID"):
  orig_uid=int(os.getenv("SUDO_UID"))
  orig_gid=int(os.getenv("SUDO_GID"))
else:
  pw = pwd.getpwnam("nobody")
  orig_uid = pw.pw_uid
  orig_gid = pw.pw_gid

print os.getuid(), os.getgid(), os.geteuid(), os.getegid(), orig_uid, orig_gid

os.setgid(orig_gid)
os.setuid(orig_uid)

它返回了这个异常:

$ sudo python provgid.py 
0 0 0 0 1000 1000
Traceback (most recent call last):
  File "provgid.py", line 15, in <module>
    os.setgid(orig_gid)
OSError: [Errno 1] Operation not permitted

这个错误是什么呢?

2 个回答

26

只有超级用户或者拥有 CAP_SETGID 权限的程序才能设置组ID(GID)。在调用 setuid() 之后,有效用户ID(UID)就不再是0了,因此你不能再调用 setgid()。试着调整这两个调用的顺序。

2

我用这个库解决了问题。

http://pypi.python.org/pypi/privilege/1.0

这个库可以安全地把权限从超级用户(root)降到其他用户。

撰写回答