Почему setuid не работает на исполняемом файле?

9

Я знаю, что включение setuid для скриптов имеет проблемы с безопасностью и поэтому неактивно по умолчанию, но ожидаю, что оно работает для исполняемых файлов. Я создал исполняемый файл, который показывает uid в качестве вывода, следуя инструкциям, описанным в этом посте: Разрешить setuid для сценариев оболочки

Но он возвращает один и тот же uid (1000) как до, так и после запуска sudo chmod +s ./setuid-test. Я думаю, это означает, что setuid не влияет на мой исполняемый файл, почему и как решить?

Исходный код:

#include <stdio.h>
#include <unistd.h>
int main(int argc, char** argv) {
    printf("%d", geteuid());
    return 0;
}

Построен и работает с

$ gcc -o setuid-test setuid-test.c
$ ./setuid-test
1000
$ sudo chown nobody ./setuid-test; sudo chmod +s ./setuid-test
$ ./setuid-test
1000

При запуске ls -laвот что я получаю:

me@me:~$ ls -la setuid-test
-rwsrwsr-x 1 nobody me 8572 Aug 19 16:39 setuid-test
Учитель PHP
источник
2
Является ли исполняемый файл владельцем другого пользователя, а не того, под которым вы его запускаете? (setuid не означает изменения в root; это означает изменение пользователя, которому принадлежит исполняемый файл.)
cjm
PHPLearner Я думаю, что вам нужно привлечь группу / пользователя, чтобы изменить SUID файла
ryekayo
@cjm me@me:~$ ls -la setuid-test---- возвращает -----rwsrwsr-x 1 nobody me 8572 Aug 19 16:39 setuid-test
PHP
7
Ваша программа работает должным образом в моей системе Ubuntu 14.04, если она находится в моем домашнем каталоге, но не когда она находится в / tmp, потому что параметры, используемые для монтирования / tmp, запрещают программы setuid. Где находится ваша программа?
Марк Плотник
2
Введите df .каталог, чтобы найти точку монтирования, затем mount | grep nameofmountpoint. Там есть nosuidфлаг?
Марк Плотник

Ответы:

10

Большинство файловых систем, разработанных для Unix / Linux, можно смонтировать с помощью nosuidатрибута, который не позволит двоичным файлам setuid или setgid, расположенным в этих файловых системах, изменять эффективный uid или gid процесса. Он часто используется при монтировании «ненадежных» файловых систем, которые находятся под контролем не администратора.

В вашем случае вы используете файловую систему типа ecryptfs, которая в соответствии с askubuntu: Ошибка при запуске двоичного файла с корневым setuid в зашифрованном домашнем каталоге автоматически запускает nosuid (и nodev), начиная с версий, выпущенных несколько лет назад.

Вот описание причины изменения с https://bugzilla.redhat.com/show_bug.cgi?id=CVE-2012-3409 :

Vincent Danen 20-07-2012, 11:25 EDT
Сообщалось, что частный помощник монтирования ecryptfs (/sbin/mount.ecryptfs_private), который является setuid-root, может позволить непривилегированному локальному пользователю монтировать управляемые пользователем общие ресурсы ecryptfs. в локальной системе. Поскольку помощник ecryptfs не монтирует файловые системы с флагами «nosuid» и «nodev», пользователь может монтировать файловую систему, содержащую двоичные файлы setuid-root и / или файлы устройств, которые могут привести к повышению их привилегий. Это можно сделать через USB-устройство, если у пользователя был физический доступ к системе.
...
Принудительные флаги монтирования MS_NOSUID и MS_NODEV были добавлены в версию 99.

Марк Плотник
источник
Если бы система позволяла пользователю монтировать файловую систему, которая позволяет setuid, то было бы тривиально стать пользователем root. 1) создать исполняемый файл 2) в другом месте chown root, chmod +s3) смонтировать его 4) запустить исполняемый файл
ctrl-alt-delor
1

Бит SetUID на исполняемом файле позволяет запускать исполняемый файл у владельца файла (не суперпользователя). Чтобы иметь возможность запускать исполняемый файл от имени пользователя root, выполните:

sudo chown 0:0 ./setuid-test
хон
источник
Конечно, но это не проблема. Возможно иметь программу, которая настроена для пользователя, отличного от пользователя root. В рассматриваемом сценарии setuid-testдолжен отображаться nobodyUID.
Жиль "ТАК - перестань быть злым"
@ Жиль, ты прав. Я ожидаю, что setuid-test отображает nobody, а неroot
PHP Learner
«Бит SetUID в исполняемом файле позволяет запускать исполняемый файл у владельца файла», и мой владелец файла nobody, поэтому я ожидаю 65534взамен, но я вижу, 1000кто бы ни был владельцем!
Ученик PHP
2
Проверьте параметры монтирования файловой системы, в которой работает ваша тестовая программа. Если он смонтирован с nosuid, то ваша программа не может работать.
контррежим
1
@countermode @MarkPlotnick mount | grep /home/meвозвращается /home/me/.Private on /home/me type ecryptfs (ecryptfs_check_dev_ruid,ecryptfs_cipher=xxx,ecryptfs_key_bytes=16,ecryptfs_unlink_sigs,ecryptfs_sig=0123456789abcdef,ecryptfs_fnek_sig=fedcba9876543210)
PHP