【问题标题】:"Operation not permitted" while dropping privileges using setuid() function使用 setuid() 函数删除权限时“不允许操作”
【发布时间】:2011-01-14 15:32:50
【问题描述】:

为什么这个使用 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

什么是错误?

【问题讨论】:

    标签: python operating-system privileges setuid


    【解决方案1】:

    只有超级用户或具有CAP_SETGID 能力的进程才能设置 GID。在setuid()调用之后,有效UID不再是0,所以你不能再调用setgid()。尝试重新排序这两个调用。

    【讨论】:

    • 如果我交换两个调用 setgid() 和 setuid(),打印相同的消息。
    • @Emilio:我无法重现这种行为。首先调用setgid() 时它对我有用——当然是在通过sudo 成为root 之后。第一次调用setuid() 时,我得到了和你一样的错误。
    • 可以是一些apparmor配置吗?有一次,我无法从 python 脚本执行“tcpdump”(我是 root)。
    【解决方案2】:

    我已经修复了使用这个库

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

    安全地将权限从 root 删除到另一个用户。

    【讨论】:

      猜你喜欢
      • 2013-01-21
      • 1970-01-01
      • 2020-03-26
      • 2017-06-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-28
      • 1970-01-01
      相关资源
      最近更新 更多