Процессы, которые де-эскалируют привилегии через 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()
вызовы вокруг.