
古い 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 カーネルを実行しているため、カーネルに関連するものでもありません。