2014-07-02 18 views
5

Tôi có một kịch bản Python mà tôi muốn để có thể được chạy như là người dùng hệ thống guybrush với UID 200 và nhóm guybrush với GID 200.setuid/setgid wrapper cho kịch bản python

Tại thời điểm kịch bản Python của tôi (nằm ở /path/to/script.py) trông như thế này:

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

C wrapper cố gắng của tôi (scriptwrap.c) trông như thế này:

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

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

tôi thứ en biên dịch, chown và chmod các wrapper như sau:

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

Tuy nhiên, khi tôi chạy scriptwrap, tôi nhận được kết quả như sau:

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

Vì vậy, đối với một số lý do duy nhất GID đang được thiết lập (của tôi UID bình thường là 1000). Tôi có thể làm gì để sữa nó?

Edit: Nếu tôi chown kịch bản để root:root và chạy nó, UID, euid, GID, và eGID đều thiết lập để 0.

Ngoài ra, đây là trên Ubuntu 12.04.4 LTS.

Trả lời

5

Tôi đã tìm ra điều này (và đã học được một chút trong quá trình này). Xấu hổ vấn đề ban đầu của tôi đã được gây ra bởi một lỗi đánh máy trong kịch bản Python của tôi: Tôi đã in ra GID dưới nhãn euid, và eUID dưới nhãn gid. Rất tiếc.

Vì vậy, eUID và eGID thực sự được đặt chính xác - tuyệt vời. Nhưng UID và GID vẫn không được đặt mặc dù tôi sử dụng setuidsetgid trong trình bao bọc C.

Nó chỉ ra rằng điều này là do hành vi của setuidsetgid khác nhau dựa vào việc bạn đang root hay không: Nếu bạn là root và bạn gọi setuid, nó đặt UID thật của bạn và UID hiệu quả của bạn để bất cứ điều gì bạn vượt qua nó trong, nếu bạn không phải là root nó chỉ đặt UID hiệu quả (source). Vì vậy, việc sử dụng setuid (và setgid) của tôi về bản chất là không có op.

Tuy nhiên chúng ta có thể thiết lập các UID thực và GID bằng setreuidsetregid cuộc gọi:

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

Những kết quả trong các đầu ra sau từ (điều chỉnh) Python script khi chạy:

uid: 200 
euid: 200 
gid: 200 
egid: 200 
Các vấn đề liên quan