2011-01-14 13 views
5

Warum scheitern diese einfachen Programme, die os.setuid()/gid() verwenden? Ist in Python geschrieben, aber ich denke, dass keine Sprache relativ Problem ist (am Ende sind alle gleich Posix Systemaufruf):"Operation nicht erlaubt" beim Löschen von Privilegien mit der Funktion 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) 

Es diese Ausnahme gibt:

$ 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 

Was ist der Fehler ?

Antwort

19

Nur die Superuser oder Prozesse mit der CAP_SETGID Fähigkeit dürfen die GID setzen. Nach dem Aufruf setuid() ist die effektive UID nicht mehr 0, Sie dürfen also nicht setgid() anrufen. Versuchen Sie, die zwei Anrufe neu zu ordnen.

+0

Wenn ich die beiden Aufrufe setgid() und setuid() vertausche, wird die gleiche Nachricht gedruckt. – Emilio

+1

@Emilio: Ich kann dieses Verhalten nicht reproduzieren. Es funktioniert für mich beim ersten Aufruf von 'setgid()' - natürlich nachdem ich über 'sudo 'root geworden bin. Beim ersten Aufruf von 'setuid()' bekomme ich den gleichen Fehler, den Sie bekommen. –

+0

Kann einige Apparmor-Konfiguration sein? Einmal konnte ich 'tcpdump' aus einem Python-Skript nicht ausführen (und ich war root). – Emilio