2012-05-08 3 views
0

나는 setreuid와 약간 혼동합니다.setreuid 호출이 프로세스 권한을 다시 설정하지 못함

시나리오 : 프로세스는 일반 사용자 (id : cateof)로 실행되지만 매우 짧은 시간 동안 루트로 실행해야합니다. 나는 cateof에서 루트 권한을 높이고 일반 사용자에게 다시 권한을 부여해야합니다. 나의 첫 번째 생각은 setreuid (0, 0) 사이에 내 "루트 콜"을 중첩하는 것이었다. 및 setreuid (ruid, euid); 충분 하긴했지만 틀렸어. 일반 사용자로 돌아가는 유일한 방법은 "루트 호출"이후 원시에서 setreuid (ruid, euid)를 두 번 호출하는 것입니다. 내가 마지막 줄에 setreuid는 (geteuid(), getuid())를 호출하지 않는 경우

int main(...) { 
    //check the permission, that the program is setuid 
    //become normal user 
    ruid = getuid(); 
    euid = geteuid(); 
    setreuid(ruid, euid); 
    ... 
    setreuid(0, 0); 
    root_action(); 
    setreuid(ruid, euid); //undo root #1 
    setreuid(geteuid(), getuid()); //undo root#2 

프로세스가 루트로 실행 유지 : 여기

는 코드입니다. 왜 두 번 전화해야합니까?

+0

'setreuid'의 리턴 코드는 무엇입니까? 와'errno' 값은 무엇입니까? – Aif

+0

@ 모든 setreuid 호출은 0 (성공) – cateof

+0

을 반환합니다. 일반 사용자가 어떻게 할 수 있는지 명확히 할 수 있습니까? ** setreuid (0, 0); **? – tuxuday

답변

1

당신은 setreuid는 할 첫 번째 통화있어 실제로 어떤 조합입니다 - 그것은 권한을 드롭하지 않습니다, 당신은 본질적으로 내 geteuid, 내 getuid 내 유효 uid 내 실제 UID를 설정 말되는이 setuid의 경우 어떤 앱은 얻은 것과 동일합니다. 다음 getuid() == bob 사용자 bob로 운영하는 setuid를 root 프로그램의 시작에서

, geteuid() == root

당신이 권한을 삭제하고 싶은 경우는, 그때는 아마라고해야 :

은 는 는
setreuid(euid, ruid); 
는 는

태드가 설정 한 것 유효한 사용자 ID는 bob이고 실제 사용자 ID는 rood입니다. 이 시점 이후에 수행 된 모든 작업은 저장된 사용자 ID 정보가 지워지지 않았기 때문에 권한이없는 사용자 bob처럼 마치 root 권한으로 완전히 전환하지 않았 음을 이해하면 이됩니다. 당신이 권한을-떨어지고 다시 할 때, 당신은 동일한 작업을 수행 할 필요가, 마지막에,

setreuid(ruid, euid); 

마찬가지로 : 루트 권한을 획득

을 수행 할 것

setreuid(euid, ruid); 

즉, 사용자가 설정 한 id가 bob 인 유효 uid. [대답은] [1] 비슷한 상황입니다, 조금 더 간결하게 세부 사항을 설명합니다.

일반적으로,이 정보를 같은 작은 printerhelper 검사 할 때 : 모든 단계에서 권한/UID 정보를 결정하는

void printids(char *header) { 
    uid_t ruid, euid, saveduid; 
    getresuid(&ruid, &euid, &saveduid); 
    printf("%s ruid=%d euid=%d saveduid=%d\n", header, ruid, euid, saveduid); 
} 

어시스트를 기록.

seteuid()을 사용하면 조금 더 무거운 손으로 setreuid()을 사용하지 않고 권한을 일시적으로 변경하는 것이 약간 간단합니다. setresuid() 호출을 사용하여 실제, 유효 및 저장된 사용자 ID 값의 설정을보다 명확하게 지정할 수 있습니다.

저장 및 삭제 권한 : 비 루트 권한을 다시 삭제

setresuid(euid, euid, -1); 

:

setresuid(ruid, ruid, euid); 

다시 획득 루트 권한

setresuid(ruid, ruid, -1); 

우리가 구원을 내버려 즉, 사용자 -id 루트 정보를 유지하고 realuid 및을 조작합니다.루트/비 루트간에 토글 값