2014-07-02 12 views
5

Ho uno script Python che voglio essere in grado di essere eseguito come utente del sistema guybrush con UID 200 e gruppo guybrush con GID 200.setuid/setgid involucro per script Python

Al momento il mio script Python (situato in /path/to/script.py) si presenta così:

#!/usr/bin/env python2 
import os 

print "uid: %s" % os.getuid() 
print "euid: %s" % os.getgid() 
print "gid: %s" % os.geteuid() 
print "egid: %s" % os.getegid() 

mio C involucro tentato (scriptwrap.c) si presenta così:

#include <unistd.h> 
#include <sys/types.h> 

int main(int argc, char *argv[]) { 
    setuid(geteuid()); 
    setgid(getegid()); 
    return execv("/path/to/script.py", argv); 
} 

I ° en compilare, chown e chmod l'involucro come segue:

$ gcc scriptwrap.c -o scriptwrap 
$ chown guybrush:guybrush scriptwrap 
$ chmod 6755 scriptwrap 

Eppure, quando corro scriptwrap, ottengo il seguente output:

uid: 1000 
euid: 1000 
gid: 200 
egid: 200 

Così, per qualche motivo solo il GID viene impostato (il mio l'UID normale è 1000). Cosa posso fare per risolvere questo problema?

Edit: Se io chown lo script per root:root ed eseguirlo, l'UID, euid, GID, e egid sono tutti impostati a 0.

Inoltre, questo è su Ubuntu 12.04.4 LTS.

risposta

5

Beh, l'ho capito (e ho imparato un po 'nel processo). In modo imbarazzante il mio problema iniziale è stato causato da un refuso nel mio script Python: stavo stampando il GID sotto l'etichetta euid e l'eUID sotto l'etichetta gid. Ops.

Quindi l'eUID e l'eGID sono impostati correttamente correttamente. Ma l'UID e il GID non sono ancora impostati nonostante il mio uso di setuid e setgid nel wrapper C.

Si scopre che questo è dovuto al comportamento di setuid e setgid diverse a seconda che si è root o no: Se sei root e si chiama setuid, imposta il tuo vero UID e il tuo UID efficace per tutto ciò che si passa in, se non sei root imposta semplicemente l'UID efficace (source). Quindi il mio uso di setuid (e di setgid) è essenzialmente non operativo.

Tuttavia è possibile impostare la vera UID e GID in base alle setreuid e setregid chiamate:

#include <unistd.h> 
#include <sys/types.h> 

int main(int argc, char *argv[]) { 
    setreuid(geteuid(), geteuid()); 
    setregid(getegid(), getegid()); 
    return execv("/path/to/script.py", argv); 
} 

che determina il seguente output dal (corretto) script Python quando eseguito:

uid: 200 
euid: 200 
gid: 200 
egid: 200