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
permissions
executable
setuid
PHP Learner
fuente
fuente
me@me:~$ ls -la setuid-test
---- devuelve -----rwsrwsr-x 1 nobody me 8572 Aug 19 16:39 setuid-test
df .
en el directorio para encontrar el punto de montaje, entoncesmount | grep nameofmountpoint
. ¿Hay unanosuid
bandera en la lista?Respuestas:
La mayoría de los sistemas de archivos diseñados para Unix / Linux se pueden montar con un
nosuid
atributo, 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 :
fuente
chown root
,chmod +s
3) montarlo 4) ejecutar ejecutableEl 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:
fuente
setuid-test
debe mostrarnobody
el UID de.nobody
, noroot
nobody
, por lo tanto,65534
a cambio, ¡espero ver1000
quién sea el propietario!nosuid
, entonces su programa no puede funcionar.mount | grep /home/me
regresa/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)