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它失敗setgid
和setuid
(我是同一用戶),我可以按預期打開文件
現在以根用戶身份運行它:
$ sudo ./perms
gid: 126 gr_name: mydaemon
uid: 116 user_name: mydaemon
open status: -1 (errno 13)
我可以做setgid
和setuid
,getgid
和getuid
說,我正在爲mydaemon ,但我不能打開文件。 (errno 13 is EACCES:Permission denied)
問題在哪裏?
您可以統計守護進程中的設備節點,並通過訪問struct stat的st_mode字段來檢查您是否具有讀/寫權限? (詳情請參閱man 2 stat) – shinymetal
*「我預計現在我應該可以訪問......」 - 這可能是一個錯誤的假設。應檢查* setuid()*返回的代碼是否成功或失敗。 – sawdust
我已經編輯了一下這個問題,也許現在有更多的信息。 – Honza