¿El bit SetUID no funciona en Ubuntu?

¿El bit SetUID no funciona en Ubuntu?

Supongo que un archivo ejecutable con el bit SetUID configurado debería ejecutarse como su propietario, pero realmente no puedo reproducirlo. Intenté lo siguiente.

$ gato preparar.sh
cp/bin/bash.
chown root.root bash
chmod 4770 bash # Verificado
$ sudo sh preparar.sh
$ ./golpe
$ identificación -u
1000
$ salir
$
$ prueba de gato.c
#incluir<stdio.h>
#incluir<unistd.h>
int principal(){
    printf("%d,%d\n", getuid(), geteuid());
    devolver 0;
}
$ gcc -o prueba prueba.c
$ chmod 4770 prueba # Verificado
$ sudo chown root.prueba de raíz
$ ./prueba
1000,1000
$ # ¿Por qué???

Sin embargo

$ su
# ./bash
# identificación -u
0
# ./prueba
0,0
# salida
# salida
$

Nota: El punto de montaje no tiene nosuidni noexecestá establecido.
¿Alguien puede explicar por qué no funciona en Ubuntu 16.04 LTS?

Respuesta1

Para el ejecutable compilado, desdeman 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.

Revertir el orden chowny chmodfunciona para mí:

$ 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

Respuesta2

En el primer caso, es a Bash al que no le gusta que lo ejecuten como setuid.

Si Bash se inicia con la identificación del usuario (grupo) efectivo no igual a la identificación del usuario (grupo) real,..., y la identificación del usuario efectivo se establece en la identificación del usuario real.

Ver:Manual de Bash sobre archivos de inicio, tambiénEl bit Setuid parece no tener ningún efecto en bash.

En el segundo caso, es el orden de chmody chownlo que importa, como ya murucontestada. Cambiar el propietario restablece el bit setuid.

Respuesta3

También podría ser que el sistema de archivos que contiene el ejecutable de prueba se haya montado con elnosuidopción; He oído que las distribuciones más nuevas harán esto de forma predeterminada para /tmp, y existen buenos argumentos para aplicarlo /hometambién. nosuidhace que el kernel ignore los bits setuid y setgid entodoejecutables dentro del sistema de archivos. (Lo que no tiene relación y sucede cuando haces undirectoriosetgid no se ve afectado.)

información relacionada