Setuid

Setuid y Setgid son términos de Unix, abreviaturas para "Set User ID" y "Set Group ID", respectivamente. Setuid, también llamado a veces "suid", y "setgid" son permisos de acceso que pueden asignarse a archivos o directorios en un sistema operativo basado en Unix. Se utilizan principalmente para permitir a los usuarios del sistema ejecutar binarios con privilegios elevados temporalmente para realizar una tarea específica.

Si un fichero tiene activado el bit "Setuid" se identifica con una “s” en un listado de la siguiente forma:

-rwsr-xr–x 1 root shadow 27920 ago 15 22:45 /usr/bin/passwd

Esta propiedad es necesaria para que los usuarios normales puedan realizar tareas que requieran privilegios más altos que los que dispone un usuario común. Algunas tareas que requieren privilegios elevados pueden no ser obvias (por ejemplo, el comando ping, que debe enviar y escuchar paquetes de control por una interfaz de red).

Setuid en ejecutables 

Normalmente este bit se activa en ejecutables.
Cuando a un ejecutable binario se le asigna el atributo setuid, usuarios normales del sistema pueden ejecutar ese archivo y obtener privilegios del usuario que posee dicho archivo (generalmente, root) en el proceso creado. Cuando el proceso obtiene privilegios de administrador, la aplicación puede realizar tareas en el sistema que usuarios normales generalmente no podrían hacer. El sistema impedirá al usuario que invocó el ejecutable alterar el nuevo proceso de ningún modo, como utilizando ptrace, LD_LIBRARY_PATH o enviarle señales a él (señales desde la propia terminal sí se aceptarán).

Por ejemplo el bit setuid se utiliza en el fichero /usr/bin/passwd para que todo el mundo pueda cambiar su contraseña de forma controlada. Pudiendo ejecutar este programa se consigue que un usuario pueda escribir en el fichero de claves (/etc/shadow, no confundirlo con /etc/passwd) pero sin tener que dar permisos de escritura al fichero, lo cual sería un gran agujero de seguridad

Aunque la característica setuid es muy útil en muchos casos, puede plantear un riesgo de seguridad si el atributo setuid se asigna a programas ejecutables que no fueron diseñados cuidadosamente. Los usuarios pueden explotar vulnerabilidad en programas defectuosos para conseguir privilegios elevados permanentemente, o ejecutar de forma no intencionada un troyano.

El atributo setgid permitirá cambiar los privilegios basados en el grupo en un proceso, del mismo modo que setuid hace para privilegios basados en el usuario.

Setgid en directorios 

El indicador setgid en un directorio tiene un significado completamente distinto del de su aplicación en ficheros. Los directorios con permiso setgid fuerzan a todos los archivos y subdirectorios creados en ellos a pertenecer al grupo del dueño del directorio y no al grupo del usuario que crea el archivo o subdirectorio.

El indicador setuid, en cambio, no tiene efecto si es aplicado a un directorio. La causa es que si propagara el dueño del directorio a los objetos creados dentro de ese directorio, el usuario que cree un fichero allí perdería inmediatamente sus permisos de dueño sobre el fichero, impidiendo tal vez que pueda usarlo o modificarlo nunca más.

Ejemplos 
Añade permisos SUID a un binario de ejemplo (usuario)
# chmod u+s /home/user/ejecutable
Elimina permisos SUID a un binario (usuario)
# chmod u-s /bin/ping
Añade permisos GUID a un binario de ejemplo (grupo)
# chmod g+s /home/user/ejecutable
Elimina permisos GUID a un binario de ejemplo (grupo)
# chmod g-s /home/user/ejecutable
Visualización de los permisos de un binario con atributos SUID
# ls -al /bin/ping
-rwsr-xr-x 1 root root 35712 2011-05-03 12:43 /bin/ping
Buscar todos los ficheros con permisos SUID o SGID
# find / -path /proc -prune -o -type f -perm +6000 -ls
Buscar todos los ficheros con permisos solo SUID
# find / -path /proc -prune -o -type f -perm +4000 -ls
Buscar todos los ficheros con permisos solo SGID
# find / -path /proc -prune -o -type f -perm +2000 -ls

Ejemplos de uso

SUID 
Permisos 4711 sobre un archivo ejecutable que tiene como dueño a root.

Un usuario llamado fulano intenta ejecutar el archivo. Los permisos para el archivo ejecutable están fijados para todos los usuarios con permiso de ejecución (4711), de esta manera fulano puede ejecutar el archivo. El propietario del archivo es root y el permiso SUID esta fijado (4711), por lo que el archivo se ejecuta como root.

De esta manera el archivo es ejecutado como root, es decir, que fulano puede modificar otros archivos que normalmente no puede modificar sin conceder a fulano privilegios completos. Esto se usa en el archivo binario /usr/bin/passwd. passwd necesita modificar el archivo /etc/passwd y /etc/shadow que guarda la información de las cuentas de usuario y los hashes de contraseña respectivamente, pero estos archivos solo pueden ser modificados por root.

[ fulano @ host ~ ] $  stat -c "%a %U:%G %n" /usr/bin/passwd 
4701 root:root /usr/bin/passwd

[ fulano @ host ~ ] $  passwd
Changing password for fulano.

GUID 
2071 un directorio llamado "plantas" que tiene como grupo propietario a "sultano" y como usuario propietario a "root".

Un usuario llamado "fulano" pertenece primariamente al grupo "fulano" y secundariamente al grupo "sultano". "fulano" crea un nuevo directorio llamado "mango" dentro de directorio "plantas". El grupo dueño del nuevo directorio llamado "mango" hereda "sultano".

Sin GUID el grupo propietario habría sido "fulano".

[ fulano @ host ~ ] $  groups fulano
fulano : fulano sultano

[ fulano @ host ~ ] $  stat -c "%a %U:%G %n" ~/plantas/
2770 fulano:sultano /home/fulano/plantas/

[ fulano @ host ~ ] $  mkdir ~/plantas/mango

[ fulano @ host ~ ] $  touch ~/plantas/.mango

[ fulano @ host ~ ] $  stat -c "%U:%G %n" ~/plantas/mango/
fulano:sultano /home/fulano/plantas/mango/

[ fulano @ host ~ ] $  stat -c "%U:%G %n" ~/plantas/.mango
fulano:sultano /home/fulano/plantas/.mango

[ fulano @ host ~ ] $  touch test

[ fulano @ host ~ ] $  stat -c "%U:%G %n" ~/test
fulano:fulano /home/fulano/test

Véase también 
 Sudo
 chmod
 Lista de control de acceso (ACL)

Unix