«Операция не разрешена» при отбрасывании привилегий с помощью функции setuid () - PullRequest
6 голосов
/ 14 января 2011

Почему эта простая программа, которая использует 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 ]

20 голосов
/ 14 января 2011

Только суперпользователь или процессы с возможностью CAP_SETGID могут устанавливать GID. После вызова setuid() эффективный UID больше не равен 0, поэтому вам не разрешено звонить setgid(). Попробуйте изменить порядок двух вызовов.

2 голосов
/ 15 января 2011

Я исправил использование этой библиотеки

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

Это безопасно отбрасывает привилегии от пользователя root до другого пользователя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...