2017-02-12 1 views
0

У меня есть программа write.c, которая создает новый файл. Я скомпилировал это через пользователя root и установил липкий бит для setuid, используя chmod u+s write.Установить владельца нового созданного файла в C

Теперь, если пользователь2 выполняет эту программу. Новый файл создается с корнем как владелец, почему? Владельцем файла должен быть user2. Для этого я изменил uid с помощью setuid() и seteuid() пользователю2. Затем создайте файл. Но это также создает файл с правами 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 и второй файл больше не владельца корня.

Смежные вопросы