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 nosuid
ni noexec
está 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 chown
y chmod
funciona 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 chmod
y chown
lo 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 elnosuid
opción; He oído que las distribuciones más nuevas harán esto de forma predeterminada para /tmp
, y existen buenos argumentos para aplicarlo /home
también. nosuid
hace 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.)