2012-03-02 3 views
0

나는 setuid 비트 세트로 실행 가능한 python 스크립트를 만들려고한다. 사용자 'bgmc'에 속한 프로그램은 '/ home/bgmc'디렉토리에 일부 파일을 작성해야하지만 다른 사용자 인 'client'가 호출합니다. 사실, 나는 사용자 '클라이언트'가 프로그램에 의해 생성 된 파일을 변경하는 것을 원하지 않는다. 루트가 아닌 사용자의 프로그램에서 setuid 비트를 설정하는 방법은 무엇입니까?

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

int main() 
{ 
    setuid(0); 
    system("/home/bgmc/myprogram.sh"); 
    return 0; 
} 

내가가 프로그램의 setuid 비트를 설정 : 나는 ( setuid on shell scripts 참조) 프로그램을 호출하는 C-래퍼를 사용했다. C 컴파일 된 프로그램이 루트에 속하면 프로그램이 제대로 실행되고 예상 파일이 만들어집니다. 는 C-컴파일 된 프로그램의 특성은 다음과 같습니다 나는 bgmc에 myprogram의 사용자 그룹을 변경할 때

그러나
8 -rws--x--x 1 root root 4657 Mar 2 16:25 myprogram 

: bgmc, 프로그램은 더 이상 파일을 만들 수 없습니다 : "사용 권한이 거부되었습니다."

setuid(0); 

에 : 나는 라인을 변경하려고 1002 이후

setuid(1002); 

가 'bgmc'의 사용자 ID입니다 (나는 이것에 대한 명령 "ID -u bgmc"를 사용)하지만이 'didn를 도와 줘.

나는 루트 권한을 부여하지 않는 편이 낫다. 이것을 막을 수있는 방법이 있습니까?

답변

2

귀하의 질문에 정보가 너무 적기 때문에 확실하지 않지만 소유자를 변경 한 후 파일에 대한 사용 권한을 재설정하는 것을 잊어 버리셨습니까? 대부분의 시스템에서 소유권을 변경하면 자동으로 setuid 비트가 제거되므로 원한다면 직접 다시 추가해야합니다.

또한 setuid 쉘 스크립트는 주요 취약점입니다. 이것이 커널이 쉘 스크립트 setuid를 직접 만들지 못하게하는 이유입니다. 당신이해야 최소한 :

  1. 사용 execve보다는 system 그것을 호출, 환경에서
  2. 지우기 밖으로 모든 (또는 execve에 비어있는 새로운 환경을 전달합니다).

이제는 프로그램을 실행할 수있는 모든 사람이 환경 변수를 제어하여 원하는대로 만들 수 있습니다.

+0

답장을 보내 주셔서 감사합니다. setuid 쉘 스크립트가 위험하다고 말했기 때문에 대신 스크립트를 설정하려고했습니다. 그러나 이것은 내 디렉토리가 올바른 권한을 가지고 있지만 작동하지 않습니다 (775). 스크립트의 setgid도 리눅스에서 좋은 결과를 얻지 못했습니까? 이 경우에 c-wrapper도 만들어야합니까? –

+0

setgid의 문제는 setuid와 동일합니다. 그룹의 권한이 무엇이든 관계없이 시스템의 모든 사용자에게 스크립트 사용 권한을 부여하는 것이 쉽기 때문에 이러한 사용 권한을 부여 할 수도 있습니다. 따라서 커널은 스크립트에서 setgid를 지원하지 않습니다. –

+0

고마워요! 나는 당신이'execve' (또는 더 정확하게'execle')라고 말했듯이 이것들이 동등하다고 생각하고 빈 환경을 통과 시켰습니다. 제 질문은 정확히 어떻게 그런 식으로 정리해야합니까? 환경을 지우면 내 프로그램이 Python의 일부 라이브러리 ("import", 즉 "import matplotlib.pyplot")에서 더 이상 사용할 수 없기 때문입니다. 그래서 모든 것을 정리하지 않을 것입니다. –