SetUID бит не работает в Ubuntu?

8

Я предполагаю, что исполняемый файл с установленным битом SetUID должен быть запущен как его владелец, но я не могу воспроизвести его. Я попробовал следующее.

$ cat prepare.sh
cp / bin / bash.
chown root.root bash
chmod 4770 bash # Проверено
$ sudo sh prepare.sh
$ ./bash
$ id -u
1000
$ выход
$
$ cat test.c
#include <stdio.h>
#include <unistd.h>
int main () {
    printf ("% d,% d \ n", getuid (), geteuid ());
    вернуть 0;
}
$ gcc -o test test.c
$ chmod 4770 test # Проверено
$ sudo chown root.root test
$ ./test
1000,1000
$ # Почему ???

Однако

$ su
# ./bash
# id -u
0
# ./тестовое задание
0,0
# Выход
# Выход
$

Примечание. Точка монтирования не имеет и nosuidне noexecустановлена.
Кто-нибудь может объяснить, почему он не работает на Ubuntu 16.04 LTS?

iBug
источник
3
Возможный дубликат параметра « Разрешить» в сценариях оболочки
Кусалананда
3
@Kusalananda это не сценарий.
энзотиб
4
Сценарий немного сбивает с толку, но это просто красная сельдь. Я полагаю, это там, чтобы сохранить два использования sudo? В нем есть ошибка или опечатка, однако chmodотсутствует имя файла.
ilkkachu

Ответы:

15

Для скомпилированного исполняемого файла man 2 chown:

When the owner or group  of  an  executable  file  are  changed  by  an
unprivileged user the S_ISUID and S_ISGID mode bits are cleared.  POSIX
does not specify whether this also should happen  when  root  does  the
chown();  the Linux behavior depends on the kernel version.

Обратный порядок chownи chmodпорядок работает для меня:

$ sudo chmod 4770 foo
$ sudo chown root:root foo
$ stat foo
  File: 'foo'
  Size: 8712        Blocks: 24         IO Block: 4096   regular file
Device: 801h/2049d  Inode: 967977      Links: 1
Access: (0770/-rwxrwx---)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2017-04-18 15:15:15.074425000 +0900
Modify: 2017-04-18 15:15:15.074425000 +0900
Change: 2017-04-18 15:15:33.683725000 +0900
 Birth: -
$ sudo chmod 4777 foo
$ ./foo
1000,0
Мур
источник
15

В вашем первом случае, это Bash, который не любит работать как setuid.

Если Bash запускается с эффективным идентификатором пользователя (группы), не равным реальному идентификатору пользователя (группы), ... и эффективный идентификатор пользователя устанавливается равным реальному идентификатору пользователя.

См. Руководство Bash по файлам запуска , также бит Setuid, похоже, не влияет на bash .

Во втором случае, это порядок chmodи chownимеет значение, как Муру уже ответил . Смена владельца сбрасывает бит setuid.

ilkkachu
источник
О, я не заметил, что OP использует сценарий для настройки setuid bash.
Муру
5

Возможно также, что файловая система, содержащая исполняемый файл теста, была смонтирована с nosuidопцией ; Я слышал, что новые дистрибутивы будут делать это по умолчанию для /tmp, и есть хорошие аргументы для его применения /home. nosuidзаставляет ядро ​​игнорировать биты setuid и setgid для всех исполняемых файлов в файловой системе. (Несвязанная вещь, которая происходит, когда вы делаете setgid каталога, не затрагивается.)

zwol
источник