在C中设置新创建文件的所有者

时间:2017-02-12 16:59:49

标签: c setuid

我有一个程序write.c,它创建一个新文件。我通过root用户编译了它,并使用chmod u+s write为setuid设置了粘滞位。

现在,如果user2执行此程序。创建一个以root为所有者的新文件,为什么?该文件的所有者应为user2。 为此,我使用setuid()seteuid()将uid更改为user2。然后创建文件。但是这也创建了root作为所有者的文件。我想将文件创建为user2作为所有者。

1 个答案:

答案 0 :(得分: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和第二个文件 不再是root所有者。