2014-07-02 13 views
5

Mam skrypt Pythona, że ​​chcę, aby móc być uruchamiane jako użytkownik systemu guybrush z UID 200 i grupy guybrush z GID 200.setuid/setgid wrapper dla skryptu Pythona

W tej chwili mój skrypt Pythona (położony w /path/to/script.py) wygląda następująco:

#!/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() 

Moja próba C wrapper (scriptwrap.c) wygląda następująco:

#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 th pl kompilacji chown i chmod opakowanie następująco:

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

Jednak gdy uruchamiam scriptwrap, pojawia się następujący komunikat:

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

więc dla jakiegoś powodu tylko GID jest ustawiony (mój normalny UID to 1000). Co mogę zrobić, aby to naprawić?

Edit: Gdybym chown skrypt root:root i uruchomić go, UID, euid, GID, a egid są ustawione na 0.

Poza tym jest na Ubuntu 12.04.4 LTS.

Odpowiedz

5

Cóż, wymyśliłem to (i nauczyłem się trochę w tym procesie). Wstydliwy, że mój początkowy problem został spowodowany przez literówkę w moim skrypcie Pythona: drukowałem GID pod etykietą euid, a eUID pod etykietą gid. Ups.

Tak więc eUID i eGID są właściwie ustawione - świetnie. Ale UID i GID nadal nie są ustawione pomimo mojego użycia setuid i setgid w opakowaniu C.

Okazuje się, że jest to spowodowane zachowaniem setuid i setgid różniące się na podstawie tego, czy jesteś root czy nie: Jeśli korzeń i wywołać setuid, ustawia swój rzeczywisty UID i efektywny UID aby cokolwiek przekazać Jeśli nie jesteś root, po prostu ustawia efektywny UID (source). Więc używanie setuid (i setgid) jest zasadniczo operacjami typu "no-ops".

Jednak możliwe jest, aby ustawić rzeczywisty UID i GID przy użyciu setreuid i setregid połączenia:

#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); 
} 

co skutkuje następującym wyjściu z (poprawiona) skrypt Pythona, po uruchomieniu:

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