Я создал программу setuid на C. Исполняемый файл выглядит так:
-r-s-r-s--- 1 root users 13073 Jun 15 21:56 server
Я запускаю программу как userA/users
и пытаюсь установить uid/gid на userB/otherUsers
. setgid()
завершается с ошибкой, операция не разрешена. userA
не является частью otherUsers
Как я могу изменить действующий GID?
[EDIT] Вот краткое изложение того, что я сделал. Моя программа на C, выполняемая от имени пользователя A, устанавливает для uid и gid значение userB и создает файл. Не так, как ожидалось, файл принадлежит корню группы, потому что setgid()
не работает.
[userA@node uid]$ id
uid=11945(userA) gid=544(users) groups=544(users)
[userA@node uid]$ id userB
uid=11946(userB) gid=10792(otherUsers) groups=10792(otherUsers)
[userA@node uid]$ cat uid.c
#include <stdio.h>
#include <unistd.h>
int main() {
setuid(11946);
setgid(10792);
FILE *f = fopen("userB_file", "w");
fclose(f);
return 0;
}
[userA@node uid]$ ls -l uid
-r-sr-sr-x 1 root root 7130 Jun 17 14:16 uid
[userA@node uid]$ ./uid
[userA@node uid]$ ls -l userB_file
-rw-r--r-- 1 userB root 0 Jun 17 14:19 userB_file
setgid()
работает с разрешениями пользователя из группыusers
? Это приведет к сбою с операцией, не разрешенной, потому что привилегии чтения и exec/setuid не распространяются на мир/другие. - person   schedule 16.06.2012