
Я обновляю старую коробку SuSE-13.2 до Leap-15. Я сделал новую установку Leap-15.0 и перенес исходный код, который мы запускали на коробке 13.2. Сборка проходит нормально, но у меня возникла проблема. Программа является/должна быть программой suid. Она также использует fork
/ execvpe
/ wait
для выполнения некоторых внешних скриптов. И вот в чем моя проблема. Пользователь является членом нескольких групп, но эти членства в группах, похоже, исчезают, когда эти внешние скрипты выполняются. Например, пользователь является членом группы, cdrom
поэтому он может извлечь DVD и работать с ним. Я создал простой пример скрипта и исходный код для программы, 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. Это также не связано с ядром, так как я использую ядро 4.16.12 на обеих коробках 13.2 и 15.0.