Процеси, які деескалюють привілеї через 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 додано в аудіогрупу і, очевидно, потім може використовувати звукову систему. Звичайно, це, швидше за все, відбувається у вилці, а не в оригінальному процесі, але насправді в моєму контексті справа однакова (це дочірній процес, розщеплений після встановленого виклику).
setgid(54)
замість setgid(73)
(як у /etc/groups
, група bar
має gid 54), чи це працює?
setuid()
знову після того, як ви це зробите ... але, хммм ... я думаю, ви можете з seteuid()
...
setuid()
/setgid()
дзвінки навколо.