8

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

エラーは何ですか?

4

2 に答える 2

25

スーパーユーザーまたはその機能を持つプロセスのみがCAP_SETGIDGID を設定できます。呼び出し後setuid()、有効な UID は 0 ではないため、 を呼び出すことはできませんsetgid()。2 つの呼び出しの順序を変更してみてください。

于 2011-01-14T15:37:22.110 に答える
2

このライブラリを使用して修正しました

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

これにより、ルートから別のユーザーに権限が安全にドロップされます。

于 2011-01-15T17:18:42.713 に答える