Setuid プログラムがグループ メンバーシップを失う

Setuid プログラムがグループ メンバーシップを失う

古い SuSE-13.2 ボックスを Leap-15 にアップグレードしています。Leap-15.0 を新規インストールし、13.2 ボックスで実行したソース コードを移植しました。ビルドは正常に行われますが、問題が発生しています。プログラムは suid プログラムである必要があります。また、fork/ execvpe/を使用してwait外部スクリプトを実行します。これが問題の原因です。ユーザーは複数のグループのメンバーですが、これらの外部スクリプトを実行すると、これらのグループ メンバーシップが消えてしまうようです。たとえば、ユーザーはグループのメンバーであるため、DVD を取り出して操作できます。問題を示すスクリプトである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 カーネルを実行しているため、カーネルに関連するものでもありません。

関連情報