2011-01-14 16 views
5

os.setuid()/gid()를 사용하는이 간단한 프로그램이 실패하는 이유는 무엇입니까? 파이썬으로 작성된하지만 난 그 언어 관련 문제가 아니라고 생각됩니다 (마지막에 모두 같은 POSIX 시스템 호출) : 오류가setuid() 함수를 사용하여 권한을 삭제하는 동안 "작업이 허용되지 않음"

$ 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 

무엇 :이 예외를 반환

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) 

?

답변

19

CAP_SETGID 수퍼 유저 또는 프로세스 만 GID를 설정할 수 있습니다. setuid() 호출 후에 더 이상 유효 UID가 0이 아니므로 setgid()에 전화 할 수 없습니다. 두 번의 통화 순서를 변경하십시오.

+0

두 통화를 setgid() 및 setuid()와 교환하면 동일한 메시지가 인쇄됩니다. – Emilio

+1

@Emilio :이 동작을 재현 할 수 없습니다. 그것은'sudo '를 통해 루트가 된 후에'setgid()'를 처음 호출 할 때 작동합니다. 'setuid()'를 먼저 호출 할 때와 같은 오류가 발생합니다. –

+0

일부 apparmor 구성이 될 수 있습니까? 한 번 파이썬 스크립트에서 'tcpdump'를 실행할 수 없었기 때문에 (그리고 저는 루트였습니다). – Emilio