2014-11-15 5 views
0

현재 프로세스의 유효 ID를 다른 사용자의 uid (또는 임의의 값)로 설정하고 싶습니다.다른 사용자 ID를 현재 프로세스로 설정하십시오.

struct passwd* pwHost = getpwnam(hostName);//hostName is another user's name 
struct passwd* pwGuest = getpwnam(guestName);//guestName is the current log-in user's name 
if(pwHost==NULL||pwGuest==NULL) 
{ 
    printf("User cannot be found\n"); 
    exit(0); 
} 

//setresuid(pwGuest->pw_uid, pwHost->pw_uid, pwGuest->pw_uid);//change the effective uid of current process to the host uid 
setresuid(1000, 1000, 1000);//change current process's uid to a arbitrary value 
printf("Host uid: %u\n", pwHost->pw_uid); 
printf("Guest uid: %u\n", pwGuest->pw_uid); 

static uid_t euid, ruid, suid; 
getresuid(&euid, &ruid, &suid); 
printf("euid: %u\n", euid); 
printf("ruid: %u\n", ruid); 
printf("suid: %u\n", suid); 
printf("Set permission complete\n"); 

결과 : 그들 중 누구도 아직 변경되지 않은 것처럼

Host uid: 35917 
Guest uid: 35917 
euid: 35917 
ruid: 35917 
suid: 35917 

그러나, 그것은 보인다. 매뉴얼을 훑어 보았는데, 사용자가 특권이나 내가 이해하기 힘든 것을 필요로한다고 설명한다. 아무도 내 목표를 달성하는 방법에 대한 힌트를 줄 수 없습니까? 고마워.

답변

0

일반적으로 루트 프로세스 만 uid를 다른 uid로 변경할 수 있습니다.

사용자 ID는 POSIX 보안 모델의 기본 구성 요소입니다. 일반 프로세스가 사용자 ID를 변경할 수 있으면 처음에는 사용자 ID가있는 것이 아닙니다. 모든 프로세스는 uid를 변경할 수 있으며 다른 사용자 ID가 소유 한 파일이나 디렉토리를 겹쳐 쓸 수 있습니다.

+1

나는 OP가'setresuid'와 같은 시스템 호출의 반환 값에 대한 검사를 추가해야한다는 의견을 덧붙이고 싶습니다. 이것은 아마도 문제에 대한 단서를 제공했을 것입니다. – DoxyLover

+0

감사합니다. 당신은 대답이 나에게 의미가 있습니다. 내가 아는 한 sudo 명령은 한 사용자가 다른 사용자가하는 일을하게 할 수 있으므로 어떻게 내 자신만으로 구현할 수 있습니까? – TonyLic

+0

제가 말했듯이, userid 분리는 Linux/Unix 보안 설계의 기본적인 부분입니다. 비 루트 프로세스는 그 자체로 사용자 ID를 전환 할 수 없습니다. 기간. 예외 없음. 이런 종류의 기능이 필요하다면 하나 이상의 프로세스가 루트로 실행되고 다른 사용자 ID로 전환 할 수있는 여러 프로세스로 구성된보다 복잡한 응용 프로그램을 설계해야합니다. 그런 다음 다른 프로세스가이를 사용하여 다른 사용자 ID로 프로세스를 시작하고 특정 작업을 수행 할 수있는 보안 메커니즘을 확보하십시오. –

0

코드 외에 실행 파일에 setuid 권한이 있음을 나타 내기 위해 파일 사용 권한을 설정해야합니다. 이것은 다음과 같이 할 수 있습니다.

chmod +s exec 

이렇게하면 임의의 임의의 사용자가 실행 파일의 소유자 권한을 사용하여 프로그램을 실행할 수 있습니다. 실행 파일의 소유자가 루트 인 경우 많은 보안 기능을 우회하여 위험한 결과를 초래할 수 있습니다.

다음은 setuid 및 setgid 파일 권한에 more details이있는 페이지에 대한 링크입니다.