Процессы, которые де-эскалируют привилегии через setuid()и setgid(), кажется, не наследуют членство в группах установленного ими uid / gid.
У меня есть серверный процесс, который должен быть выполнен от имени пользователя root, чтобы открыть привилегированный порт; после этого он де-эскалирует к определенному непривилегированному uid / gid, 1 - например, к пользователю foo(UID 73). Пользователь fooявляется членом группы bar:
> cat /etc/group | grep bar
bar:x:54:foo
Следовательно, если я войду в систему как foo, я могу прочитать файл /test.txtс этими характеристиками:
> ls -l /test.txt
-rw-r----- 1 root bar 10 Mar 8 16:22 /test.txt
Тем не менее, следующая C-программа (компилируется std=gnu99) при запуске root:
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
int main (void) {
setgid(73);
setuid(73);
int fd = open("/test.txt", O_RDONLY);
fprintf(stderr,"%d\n", fd);
return 0;
}
Всегда сообщает, что в доступе отказано . Я полагаю, что это связано с тем, что это процесс, не связанный с входом в систему, но он вроде подколенного сухожилия, как должны работать разрешения.
1. Что часто является SOP для серверов, и я думаю, что должен быть способ обойти это, поскольку я нашел сообщение о том, что кто-то делает это с apache - apache был добавлен в аудиогруппу и, очевидно, может затем использовать звуковую систему. Конечно, это, скорее всего, происходит в форке, а не в исходном процессе, но на самом деле в моем контексте дело обстоит так же (это дочерний процесс, разветвленный после вызова setuid).
setgid(54)вместо setgid(73)(как в /etc/groupsгруппе barесть gid 54), это работает?
setuid()снова после того, как вы это сделаете ... но, хммм ... я думаю, что вы можете с seteuid()...
setuid()/setgid()вызовы вокруг.