2017-02-12 5 views
0

새로운 파일을 만드는 프로그램 write.c가 있습니다. 루트 사용자를 통해 컴파일하고 chmod u+s write을 사용하여 setuid의 고정 비트를 설정합니다.C에서 새로 만든 파일의 소유자 설정

이제 user2가이 프로그램을 실행하면. root로 소유자로 새로운 파일이 생성됩니다. 이유는 무엇입니까? 파일의 소유자는 user2 여야합니다. 그 때문에 user2에 setuid()seteuid()을 사용하여 uid를 변경했습니다. 그리고 파일을 만들었습니다. 그러나 이것은 소유자로서 root로 파일을 생성합니다. 소유자로 user2 파일을 만들고 싶습니다.

+2

"루트 사용자를 통해 컴파일했습니다."- 결코 그렇게하지 마십시오! 프로그래밍에 관한 것이 아니라 시스템 관리입니다. 그런 질문은 여기서 벗어난 것입니다. – Olaf

+2

[mcve] 또는 결코 발생하지 않았습니다. –

+1

"setuid() 및 setuid()"는 언제나 seteuid 중 하나입니까? 그 반환 값을 확인 했습니까? –

답변

1

mcve을 게시하십시오. 당신이 묘사하는 것은 제 시스템에서 잘 작동합니다. 이 :

#!/bin/sh -e 

cat > main.c <<EOF 
#define _GNU_SOURCE 
#include <unistd.h> 
#include <fcntl.h> 
#include <sys/types.h> 
#include <sys/stat.h> 
#include <stdio.h> 
#include <stdlib.h> 
int main(int argc, char** argv) 
{ 

    int fd; 
    uid_t ruid,euid,suid; 
    struct stat sb; 
    getresuid(&ruid,&euid,&suid); 
    printf("ruid=%ld euid=%ld suid=%ld\n", (long)ruid,(long)euid,(long)suid); 

    if(0>(fd = open(argv[1], O_CREAT|O_RDWR, 0660))){ 
     perror(0); 
     exit(1); 
    } 
    fstat(fd,&sb); 
    printf("owner=%ld\n", (long)sb.st_uid); 

    close(fd); 
    seteuid(ruid); 
    getresuid(&ruid,&euid,&suid); 
    printf("ruid=%ld euid=%ld suid=%ld\n", (long)ruid,(long)euid,(long)suid); 

    if(0>(fd = open(argv[2], O_CREAT|O_RDWR, 0660))){ 
     perror(0); 
     exit(1); 
    } 
    fstat(fd,&sb); 
    printf("owner=%ld\n", (long)sb.st_uid); 

    close(fd); 
} 
EOF 

gcc main.c 
sudo chown root a.out 
sudo chmod u+s a.out 
rm -f roots mine 
./a.out roots mine 

저를 가져옵니다

ruid=1008 euid=0 suid=0 
owner=0 
ruid=1008 euid=1008 suid=0 
owner=1008 

는, 즉 seteuid 호출이 성공적으로 내 UID를 재설정하고 두 번째 파일 루트에 의해 더 이상 소유자입니다.