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カーネルを実行しているため、カーネルに依存しません。

ベストアンサー1

おすすめ記事