Setuid 程序失去组成员资格

Setuid 程序失去组成员资格

我正在将旧的 SuSE-13.2 盒子升级到 Leap-15。我已经完成了全新的 Leap-15.0 安装并移植了我们在 13.2 机器上运行的源代码。我构建得很好,但我遇到了问题。该程序是/必须是一个suid 程序。它还使用//fork来执行一些外部脚本。这就是我的问题所在。用户是多个组的成员,但是当执行这些外部脚本时,这些组成员身份似乎消失了。例如,用户是该组的成员,因此他可以弹出并使用 DVD。我已经为一个程序创建了一个简单的示例脚本和源代码,该脚本显示了我的问题。execvpewaitcdromexecvpe

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 内核。

相关内容