¿Por qué setuid no funciona en ejecutable?

9

Sé que habilitar setuid en los scripts tiene problemas de seguridad y, por lo tanto, está inactivo de forma predeterminada, pero espero que funcione para los ejecutables. Creé y ejecutable que muestra uid como salida siguiendo las instrucciones descritas en esta publicación: Permitir setuid en scripts de shell

Pero devuelve el mismo uid (1000) antes y después de ejecutarse sudo chmod +s ./setuid-test. Creo que esto significa que setuid no tiene ningún efecto en mi ejecutable, ¿por qué y cómo resolverlo?

El código fuente:

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

Construido y ejecutado con

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

Cuando corro ls -la, esto es lo que obtengo:

me@me:~$ ls -la setuid-test
-rwsrwsr-x 1 nobody me 8572 Aug 19 16:39 setuid-test
PHP Learner
fuente
2
¿El ejecutable es propiedad de un usuario diferente al que lo está ejecutando? (setuid no significa cambio a root; significa cambio al usuario que posee el ejecutable).
cjm
PHPLearner Creo que necesita involucrar a un grupo / usuario para cambiar el SUID de un archivo
ryekayo
@cjm me@me:~$ ls -la setuid-test---- devuelve -----rwsrwsr-x 1 nobody me 8572 Aug 19 16:39 setuid-test
PHP Learner
77
Su programa funciona como se esperaba en mi sistema Ubuntu 14.04 si está en mi directorio de inicio, pero no cuando está en / tmp, porque los parámetros utilizados para montar / tmp prohíben los programas setuid. ¿Dónde está ubicado su programa?
Mark Plotnick
2
Escriba df .en el directorio para encontrar el punto de montaje, entonces mount | grep nameofmountpoint. ¿Hay una nosuidbandera en la lista?
Mark Plotnick

Respuestas:

10

La mayoría de los sistemas de archivos diseñados para Unix / Linux se pueden montar con un nosuidatributo, lo que evitará que los binarios setuid o setgid ubicados en esos sistemas de archivos alteren el uid o gid efectivo de un proceso. A menudo se usa cuando se montan sistemas de archivos "no confiables", aquellos que están bajo el control de un no administrador.

En su caso, el sistema de archivos que está utilizando es de tipo ecryptfs, que según askubuntu: Error al ejecutar binario con root setuid en el directorio de inicio encriptado hace que nosuid (y nodev) automáticamente, comenzando con las versiones de hace unos años.

Aquí hay una descripción de la razón del cambio, desde https://bugzilla.redhat.com/show_bug.cgi?id=CVE-2012-3409 :

Vincent Danen 2012-07-20 11:25:56 EDT
Se informó que el asistente de montaje privado ecryptfs (/sbin/mount.ecryptfs_private), que es setuid-root, podría permitir que un usuario local no privilegiado monte recursos compartidos ecryptfs controlados por el usuario en el sistema local. Debido a que el asistente de ecryptfs no monta sistemas de archivos con los indicadores "nosuid" y "nodev", sería posible que un usuario monte un sistema de archivos que contenga archivos binarios de raíz setuid y / o archivos de dispositivo que podrían llevar a la escalada de sus privilegios. Esto podría hacerse a través de un dispositivo USB, si el usuario tuviera acceso físico al sistema.
...
Forzar MS_NOSUID y MS_NODEV se agregaron banderas a la versión 99.

Mark Plotnick
fuente
Si el sistema permitiera a un usuario montar un sistema de archivos que permita setuid, entonces sería trivial convertirse en root. 1) crear un ejecutable 2) en otro lugar chown root, chmod +s3) montarlo 4) ejecutar ejecutable
ctrl-alt-delor
1

El bit SetUID en el ejecutable permite ejecutar el ejecutable en el propietario del archivo (no en el superusuario). Para poder ejecutar el ejecutable como root, ejecute:

sudo chown 0:0 ./setuid-test
cariño
fuente
Claro, pero ese no es el problema. Es posible tener un programa configurado para un usuario que no sea root. En el escenario de la pregunta, setuid-testdebe mostrar nobodyel UID de.
Gilles 'SO- deja de ser malvado'
@ Gilles Tienes razón. Espero que no se muestren las pruebas de setuid nobody, noroot
PHP Learner
"El bit SetUID en el ejecutable permite ejecutar el ejecutable en el propietario del archivo" y mi propietario del archivo es nobody, por lo tanto, 65534a cambio, ¡espero ver 1000quién sea el propietario!
PHP Learner
2
Verifique las opciones de montaje del sistema de archivos en el que se ejecuta su programa de prueba. Si está montado con nosuid, entonces su programa no puede funcionar.
contramode
1
@countermode @MarkPlotnick mount | grep /home/meregresa /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 Learner