2011-01-14 12 views
5

Perché questi programmi semplici che utilizzano os.setuid()/gid() non funzionano? È scritto in Python, ma penso che non è un problema relativo linguaggio (alla fine sono tutti uguali chiamata di sistema POSIX):"Operazione non consentita" durante il rilascio dei privilegi tramite la funzione 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) 

Esso restituisce questa eccezione:

$ 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 

Qual è l'errore ?

risposta

19

Solo il superutente oi processi con la capacità CAP_SETGID possono impostare il GID. Dopo la chiamata setuid(), l'UID effettivo non è più 0, quindi non è consentito chiamare setgid(). Prova a riordinare le due chiamate.

+0

Se scambio le due chiamate setgid() e setuid(), stampa lo stesso messaggio. – Emilio

+1

@Emilio: non riesco a riprodurre questo comportamento. Funziona per me quando si chiama 'setgid()' prima - ovviamente dopo essere diventato root tramite 'sudo'. Quando si chiama 'setuid()' per primo, ottengo lo stesso errore che si ottiene. –

+0

Può esserci qualche configurazione di apparmor? Una volta non ero in grado di eseguire 'tcpdump' da uno script python a causa di esso (e io ero root). – Emilio

Problemi correlati