
我正在將舊的 SuSE-13.2 盒子升級到 Leap-15。我已經完成了全新的 Leap-15.0 安裝並移植了我們在 13.2 機器上運行的源代碼。我建造得很好,但我遇到了問題。該程式是/必須是一個suid 程式。它也使用//fork
來執行一些外部腳本。這就是我的問題所在。使用者是多個群組的成員,但是當執行這些外部腳本時,這些群組成員資格似乎消失了。例如,使用者是該群組的成員,因此他可以彈出並使用 DVD。我已經為一個程式創建了一個簡單的範例腳本和原始程式碼,該腳本顯示了我的問題。execvpe
wait
cdrom
execvpe
test.sh
腳本:
#!/bin/sh
whoami
id
test.c
程序來源:
#define _GNU_SOURCE
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char *path = getenv("PATH");
char pathenv[strlen(path) + sizeof("PATH=")];
sprintf(pathenv, "PATH=%s", path);
char *envp[] = {pathenv, NULL};
char *tests[] = {"./test.sh", NULL};
execvpe(tests[0], tests, envp);
}
使用:
#cc test.c
#./a.out
markh
uid=5076(markh) gid=100(users) groups=100(users),19(floppy),200(lcrs),484(tape),485(lp),488(disk),489(dialout),490(cdrom)
然後以 root 身分:
#chown root ./a.out
#chgrp root ./a.out
#chmod +s ./a.out
然後作為用戶
#./a.out
markh
uid=5076(markh) gid=100(users) groups=100(users)
一旦該程式由 root 和 suid 擁有,我就會因某種未知原因失去所有組成員身份。這對我來說不合適。
這一切在舊的 13.2 機器上運作良好,但在 Leap 15 或 Leap 42.3 上卻不起作用。我知道這不是 SuSE linux 的地方,但我懷疑它與 SuSE linux 並不真正相關。它也與核心無關,因為我在 13.2 和 15.0 機器上運行 4.16.12 核心。