2011-01-14 2 views
5

Почему эти простые программы, использующие os.setuid()/gid(), не удается? Пишется в питона, но я думаю, что это не родственник проблема языка (в конце все же система POSIX вызова):«Операция не разрешена» при снижении привилегий с использованием функции setuid()

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 

Что такое ошибка ?

ответ

19

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

+0

Если я подменяю два вызова setgid() и setuid(), печатает одно и то же сообщение. – Emilio

+1

@ Emilio: Я не могу воспроизвести это поведение. Он работает для меня, когда вы вызываете 'setgid()' first - конечно, после того, как вы root с помощью 'sudo'. Когда вы вызываете 'setuid()' сначала, я получаю ту же ошибку, которую вы получаете. –

+0

Может быть какая-то конфигурация apparmor? Один раз я не смог выполнить 'tcpdump' из скрипта python из-за него (и я был root). – Emilio

 Смежные вопросы

  • Нет связанных вопросов^_^