2011-01-14 25 views
5

Tại sao chương trình đơn giản này sử dụng os.setuid()/gid() không thành công? Được viết bằng python nhưng tôi nghĩ đó không phải là một vấn đề tương đối ngôn ngữ (ở cuối đều như nhau hệ thống posix gọi):"Hoạt động không được phép" trong khi giảm đặc quyền bằng cách sử dụng hàm 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) 

Nó trả ngoại lệ này:

$ 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 

lỗi là gì ?

Trả lời

19

Chỉ người siêu người dùng hoặc quy trình có khả năng CAP_SETGID mới được phép đặt GID. Sau cuộc gọi setuid(), UID hiệu quả không phải là 0 nữa, vì vậy bạn không được phép gọi setgid(). Cố gắng sắp xếp lại hai cuộc gọi.

+0

Nếu tôi hoán đổi hai lệnh gọi setgid() và setuid(), hãy in cùng một thông báo. – Emilio

+1

@Emilio: Tôi không thể tạo lại hành vi này. Nó làm việc cho tôi khi gọi 'setgid()' đầu tiên - tất nhiên sau khi trở thành root thông qua 'sudo'. Khi gọi 'setuid()' trước tiên, tôi nhận được cùng một lỗi mà bạn nhận được. –

+0

Có thể có một số cấu hình phụ không? Một thời gian tôi không thể thực thi 'tcpdump' từ một kịch bản python vì nó (và tôi đã root). – Emilio

Các vấn đề liên quan