O bit SetUID não funciona no Ubuntu?

O bit SetUID não funciona no Ubuntu?

Suponho que um arquivo executável com o conjunto de bits SetUID deva estar sendo executado como seu proprietário, mas não consigo reproduzi-lo. Eu tentei o seguinte.

$ gato prepare.sh
cp /bin/bash.
chown root.root bash
chmod 4770 bash# Verificado
$ sudo sh prepare.sh
$./bash
$ id -você
1000
$ saída
$
$ teste de gato.c
#include<stdio.h>
#include<unistd.h>
int principal(){
    printf("%d,%d\n", getuid(), geteuid());
    retornar 0;
}
$ gcc -o teste teste.c
$ chmod 4770 teste# Verificado
$ sudo chown teste root.root
$./teste
1.000.1000
$# Por que???

No entanto

$ su
# ./bash
# id -você
0
# ./teste
0,0
# saída
# saída
$

Nota: O ponto de montagem não tem nosuidnem noexecdefinido.
Alguém pode explicar por que não funciona no Ubuntu 16.04 LTS?

Responder1

Para o executável compilado, deman 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.

Inverter a ordem chowne chmodfunciona para mim:

$ 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

Responder2

No seu primeiro caso, é o Bash que não gosta de ser executado como setuid.

Se o Bash for iniciado com o ID do usuário (grupo) efetivo diferente do ID do usuário (grupo) real,..., e o ID do usuário efetivo for definido como o ID do usuário real.

Ver:Manual do Bash sobre arquivos de inicialização, tambémO bit Setuid parece não ter efeito no bash.

No segundo caso, é a ordem de chmode chownque importa, como já mururespondidas. Alterar o proprietário redefine o bit setuid.

Responder3

Também pode ser que o sistema de arquivos que contém o executável de teste tenha sido montado com onosuidopção; Ouvi dizer que distribuições mais recentes farão isso por padrão para /tmp, e há bons argumentos para aplicá-lo /hometambém. nosuidfaz com que o kernel ignore os bits setuid e setgid emtodosexecutáveis ​​dentro do sistema de arquivos. (A coisa não relacionada que acontece quando você faz umadiretóriosetgid não é afetado.)

informação relacionada