2012-09-18 28 views
0

後訪問屬於一組文件,讓我們添加一個新的組和用戶,並將其添加到系統組video我不能打電話的setgid和setuid的在Linux

$ sudo addgroup --system mydaemon 
$ sudo adduser --system --no-create-home --ingroup mydaemon mydaemon 
$ sudo adduser mydaemon video 

創建一個文件,並改變其所有者根組video

$ touch video0 
$ sudo chown root:video video0 
$ sudo chmod 0660 video0 

現在考慮使用setgid()setuid()

/* perms.c */ 
#include <stdio.h> 
#include <stdlib.h> 
#include <errno.h> 
#include <fcntl.h> 
#include <pwd.h> 
#include <grp.h> 


int main(int argc, char const *argv[]) 
{ 
    int ret; 
    int gid; 
    int uid; 
    struct passwd *pw; 
    struct group *gr; 

    pw = getpwnam("mydaemon"); 
    if (pw) { 
     ret = setgid(pw->pw_gid); 
     if (ret < 0) { 
      printf("error with setgid\n"); 
      exit(1); 
     } 

     ret = setuid(pw->pw_uid);  
     if (ret < 0) { 
      printf("error with setuid\n"); 
      exit(1); 
     } 
    } 

    pw = getpwuid(getuid()); 
    gr = getgrgid(getgid()); 

    printf("gid: %d gr_name: %s\n", gr->gr_gid, gr->gr_name); 
    printf("uid: %d user_name: %s\n", pw->pw_uid, pw->pw_name); 

    ret = open("video0", O_RDWR); 

    printf("open status: %d (errno %d)\n", ret, errno); 

    return 0; 
} 
0用C語言編寫一個簡單的應用程序

編譯後我們就可以運行它作爲普通用戶:

$ sudo -u mydaemon ./perms 
gid: 126 gr_name: mydaemon 
uid: 116 user_name: mydaemon 
open status: 3 (errno 0) 

好吧,我可以這樣做:

$ ./perms 
error with setgid 

,因爲我們沒有權限setgid程序 所以直接運行它mydaemon它失敗setgidsetuid(我是同一用戶),我可以按預期打開文件

現在以根用戶身份運行它:

$ sudo ./perms 
gid: 126 gr_name: mydaemon 
uid: 116 user_name: mydaemon 
open status: -1 (errno 13) 

我可以做setgidsetuidgetgidgetuid說,我正在爲mydaemon ,但我不能打開文件。 (errno 13 is EACCES:Permission denied)

問題在哪裏?

+0

您可以統計守護進程中的設備節點,並通過訪問struct stat的st_mode字段來檢查您是否具有讀/寫權限? (詳情請參閱man 2 stat) – shinymetal

+0

*「我預計現在我應該可以訪問......」 - 這可能是一個錯誤的假設。應檢查* setuid()*返回的代碼是否成功或失敗。 – sawdust

+0

我已經編輯了一下這個問題,也許現在有更多的信息。 – Honza

回答

2

您應該使用initgroups()調用根據組數據庫初始化組。