2017-02-12 10 views
0

私は新しいファイルを作成するプログラムwrite.cを持っています。私はrootユーザーを通してそれをコンパイルし、chmod u+s writeを使ってsetuidのスティッキービットを設定しました。Cで作成した新しいファイルの所有者を設定します

ここで、user2がこのプログラムを実行するとします。所有者としてルートを使用して新しいファイルが作成されますが、なぜですか?ファイルの所有者はuser2でなければなりません。 そのため、user2にsetuid()seteuid()を使用してuidを変更しました。そしてファイルを作成しました。しかし、これは所有者として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をリセットしないと第二のファイル はもはやルートによって所有者です。

関連する問題