2017-02-12 24 views
0

我有一個程序write.c,它創建一個新文件。我通過root用戶編譯並使用chmod u+s write來設置setuid的粘性位。在C中創建新文件的所有者

現在,如果一個user2執行這個程序。爲什麼創建一個新的文件,其根目錄是所有者?該文件的所有者應該是user2。 爲此,我使用setuid()seteuid()將用戶ID更改爲user2。然後創建該文件。但是這也創建了root作爲所有者的文件。我想創建該文件作爲user2作爲所有者。

+2

「我編譯通過root用戶」 - 從來沒有這樣做!這不是關於編程,而是系統管理。這些問題在這裏是異質的。 – 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和第二個文件 是根不再是所有者。