2011-01-14 19 views
5

¿Por qué este programa simple que usa os.setuid()/gid() falla? Está escrito en Python, pero creo que eso no es un problema relativo idioma (al final son todos la misma llamada al sistema POSIX):"Operación no permitida" mientras descarta privilegios usando la función 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) 

Devuelve esta excepción:

$ 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 

¿Cuál es el error ?

Respuesta

19

Solo el superusuario o los procesos con la capacidad CAP_SETGID pueden configurar el GID. Después de la llamada setuid(), el UID efectivo ya no es 0, por lo que no puede llamar al setgid(). Intenta reordenar las dos llamadas.

+0

Si cambio las dos llamadas setgid() y setuid(), imprime el mismo mensaje. – Emilio

+1

@Emilio: No puedo reproducir este comportamiento. Funciona para mí al llamar 'setgid()' primero, por supuesto después de convertirse en root a través de 'sudo'. Cuando llamo 'setuid()' primero, obtengo el mismo error que obtiene. –

+0

¿Puede ser alguna configuración de apparmor? Una vez no pude ejecutar 'tcpdump' desde un script de Python debido a eso (y yo era root). – Emilio

Cuestiones relacionadas