2012-02-15 3 views
6

권한 4750 프로세스가 있습니다. 두 명의 사용자가 내 Linux 시스템에 있습니다. 루트 사용자와 appz 사용자. 이 프로세스는 "appz"사용자로 실행되는 프로세스 관리자의 권한을 상속받습니다.C에서 setuid 프로그램을 실행하는 올바른 방법

나는 두 가지 기본 루틴을 가지고 :

int main() { 
undo_root(); 
do some stuff; 
do_root(); 
bind(port 80); //needs root perm 
undo_root(); 
while(1) { 

    accept commads() 
    if (commands needs root user access) 
    { 
     do_root(); 
     execute(); 
     undo_root(); 

    } 

} 

당신은 내가 루트로 몇 가지 명령을 실행할 볼 수 있듯이 :

void do_root (void) 
{ 
     int status; 
     status = seteuid (euid); 
     if (status < 0) { 
     exit (status); 
     }  
} 

/* undo root permissions */ 
void undo_root (void) 
{ 
int status; 
     status = seteuid (ruid); 
     if (status < 0) { 
       exit (status); 
     } 
     status = setuid(ruid); 
     if (status < 0) { 
       exit (status); 
     } 
} 

내 흐름은 다음과 같다. 임시로 사용 권한을 삭제하려고하는데 작업에 루트 액세스가 필요한 경우 do_root 및 undo_root 호출 사이에서 명령을 래핑합니다.

그러나 내 프로그램이 작동하지 않는 것으로 보입니다.

정식 방법은 무엇입니까?

+0

seteuid가 실패 할 때 종료하는 것이 아니라 perror() 프로그램이 실패한 이유를 알려줍니다. –

+4

일단 루트 사용 권한을 삭제하면 되돌릴 수 없습니다 !! – Petesh

+0

기술적으로, 프로세스가 아닌 4750 권한을 가진 프로그램을 보유하고있는 파일입니다. 권한이'root : group : 4750'이라고 직접 말하지는 않습니다 - 안전한 추론입니까? –

답변

5

오래된 학교 방법은 RUID와 EUID를 교환 setreuid는()를 사용하는 do_root 및 undo_root 모두이다 :

setreuid(geteuid(), getuid()); 

프로그램이 완벽한 보안 감사를 할 정도로 작은 경우이 완벽하게 허용 .

new-school 방식은 훨씬 더 복잡하며 fork()를 사용하여 루트로 수행 할 작업에 대한 지시문을 허용 한 다음 setuid (getuid())를 사용하여 부모에 루트를 영구히 삭제합니다. 아동은받은 모든 지침의 유효성을 입증 할 책임이 있습니다. 충분히 큰 프로그램의 경우 보안 감사가 필요한 코드 양을 줄이고 사용자가 작업 제어로 프로세스를 관리하거나 죽일 수 있습니다.

+0

무슨 뜻인가요? 두 함수 모두에 코드를 복사하여 붙여 넣기 만하면됩니까? – cateof

+0

예. __________ – Joshua

2

setuid 사람이 페이지에는 다음을 말한다 :

... 일시적 다음, 루트 권한을 버리고, 루트가 아닌 사용자의 ID를 가정하고,하고자하는 일련의 유저 ID 루트 프로그램 당신이 setuid()을 사용할 수 없다는 것을이 setuid()

의미를 사용할 수 없습니다 이후 루트 권한을 회복. seteuid()setreuid()을 사용해야합니다. 자세한 내용은 Setuid Program Example을 참조하십시오.

+0

내 프로그램은이 GNU 페이지를 기반으로합니다. do_setuid 대신에, 나는 처음에 do_root를했다. – cateof

+0

@cateof : 내가 게시 한 코드에서'setuid' 함수를 사용하는 것을 보았습니다. 그것은 편도 티켓입니다. –

5

Hao Chen, David Wagner 및 Drew Dean이 'Setuid Demystified'이라는 종이가 있습니다. USENIX 2002에서 발표되었습니다. setuid() 및 전환이 어떻게 자세하게 (2002 년 현재) 작동하는지 설명합니다. 그것은 독서의 가치가 있습니다 (몇 번 - 나는 그것을 다시 읽으면서 연체 된 1 년 또는 2 년이어야합니다). EUID 0 프로세스가 nuid != 0setuid(nuid)을 수행 할 때

기본적으로 Petesh으로는, 코멘트에 언급, root (EUID 0) 권한 다시 방법이 없습니다. 그리고 정말로, 그것이 그렇게 중요합니다. 그렇지 않으면 로그인 할 때 로그인하는 root 프로세스가 자신의 권한을 제한 할 수 없으므로 root으로 되돌아 갈 수 있습니다. 저장된 UID는 일을 복잡하게하지만, EUID 0의 단방향 트랩에 영향을 미치지 않는다 (setuid()).

관련 문제