Я в настоящее время читаю книгу по программированию с C, я добрался до части, где я добрался для записи программы, которая отобразит реальный uid и эффективный uid, на котором выполняется файл. После компиляции кода с gcc я ввел команду для наблюдения текущего uOwner и gOwner ls- l id_demo
вывод - это
-rwxrwxr-x 1 user user 8629 Sep 21 13:04 id_demo
я затем выполняю программу, которая это сам, это - то, что я получаю:
real uid: 1000 effective uid: 1000
пока все хорошо.
Я затем ввел команду для изменения владельца файла sudo chown root:root ./id_demo
ls -l
подтверждает, что владелец был изменен на корень;
-rwxrwxr-x 1 root root 8629 Sep 21 13:04 id_demo
снова, выполнение шоу программы real uid
и uid
как 1 000. Последний шаг, после который uid
должен быть 0, это: sudo chmod u+s ./uid_demo
но для меня они остаются как 1 000, где в книге вывод, ясно показывают, чтобы быть этим:
real uid: 1000 effective uid: 0
какие-либо идеи, почему это происходит?
ОБНОВЛЕНИЕ
исходный код id_demo:
#include <stdio.h>
int main ()
{
printf("real uid: %d\n", getuid());
printf("effective uid: %d\n", geteuid());
}
ОБНОВИТЕ 2 Снимка экрана
Вы изменили suid только для пользователя root (u+s
, если владелец - root). До chmod a+s ./uid_demo
.
РЕДАКТИРОВАТЬ после того, как ОП опубликовал код: работает для меня.
xxxxx@xxxxx:~$ cat > test.c
#include <stdio.h>
int main ()
{
printf("real uid: %d\n", getuid());
printf("effective uid: %d\n", geteuid());
}
xxxxx@xxxxx:~$ gcc -o testuid test.c
xxxxx@xxxxx:~$ ./testuid
real uid: 1000
effective uid: 1000
xxxxx@xxxxx:~$ sudo chown root:root testuid
xxxxx@xxxxx:~$ sudo chmod a+s testuid
xxxxx@xxxxx:~$ ./testuid
real uid: 1000
effective uid: 0
xxxxx@xxxxx:~$ ls -l testuid
-rwsrwsr-x 1 root root 8625 Sep 21 14:45 testuid
Вот что вы можете сделать: (i) делать все с нуля, как показано выше. Если это не работает, вы можете попробовать использовать strace
, чтобы увидеть, что происходит.
Мы поняли это. Причиной является ecryptfs
-монтированный домашний каталог. Выходные данные mount
содержат следующую строку:
/home/evgeny/.Private on /home/evgeny type ecryptfs
Это означает, что домашний каталог на самом деле не является частью корневой файловой системы (которая имеет необходимый флаг suid
), а является собственной виртуальной файловой системой. по-видимому, по умолчанию он не поддерживает двоичные файлы setuid. Я успешно воспроизвел проблему с тестовым пользователем, у которого есть зашифрованный домашний каталог.
Можно добавить флаг suid
к ecryptfs с помощью следующей команды:
sudo mount -i -o remount,suid /home/evgeny
Я не уверен, насколько это безопасно, или как изменить его навсегда, чтобы он выживет перезагрузки.